enable.c revision c1f859d4
17117f1b4Smrg/** 27117f1b4Smrg * \file enable.c 37117f1b4Smrg * Enable/disable/query GL capabilities. 47117f1b4Smrg */ 57117f1b4Smrg 67117f1b4Smrg/* 77117f1b4Smrg * Mesa 3-D graphics library 87117f1b4Smrg * Version: 7.0.3 97117f1b4Smrg * 107117f1b4Smrg * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 117117f1b4Smrg * 127117f1b4Smrg * Permission is hereby granted, free of charge, to any person obtaining a 137117f1b4Smrg * copy of this software and associated documentation files (the "Software"), 147117f1b4Smrg * to deal in the Software without restriction, including without limitation 157117f1b4Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 167117f1b4Smrg * and/or sell copies of the Software, and to permit persons to whom the 177117f1b4Smrg * Software is furnished to do so, subject to the following conditions: 187117f1b4Smrg * 197117f1b4Smrg * The above copyright notice and this permission notice shall be included 207117f1b4Smrg * in all copies or substantial portions of the Software. 217117f1b4Smrg * 227117f1b4Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 237117f1b4Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 247117f1b4Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 257117f1b4Smrg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 267117f1b4Smrg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 277117f1b4Smrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 287117f1b4Smrg */ 297117f1b4Smrg 307117f1b4Smrg 317117f1b4Smrg#include "glheader.h" 327117f1b4Smrg#include "context.h" 337117f1b4Smrg#include "enable.h" 347117f1b4Smrg#include "light.h" 357117f1b4Smrg#include "macros.h" 367117f1b4Smrg#include "simple_list.h" 377117f1b4Smrg#include "mtypes.h" 387117f1b4Smrg#include "enums.h" 397117f1b4Smrg#include "math/m_matrix.h" 407117f1b4Smrg#include "math/m_xform.h" 41c1f859d4Smrg#include "api_arrayelt.h" 427117f1b4Smrg 437117f1b4Smrg 447117f1b4Smrg 457117f1b4Smrg#define CHECK_EXTENSION(EXTNAME, CAP) \ 467117f1b4Smrg if (!ctx->Extensions.EXTNAME) { \ 477117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "gl%sClientState(0x%x)", \ 487117f1b4Smrg state ? "Enable" : "Disable", CAP); \ 497117f1b4Smrg return; \ 507117f1b4Smrg } 517117f1b4Smrg 527117f1b4Smrg 537117f1b4Smrg/** 547117f1b4Smrg * Helper to enable/disable client-side state. 557117f1b4Smrg */ 567117f1b4Smrgstatic void 577117f1b4Smrgclient_state(GLcontext *ctx, GLenum cap, GLboolean state) 587117f1b4Smrg{ 597117f1b4Smrg GLuint flag; 607117f1b4Smrg GLboolean *var; 617117f1b4Smrg 627117f1b4Smrg switch (cap) { 637117f1b4Smrg case GL_VERTEX_ARRAY: 647117f1b4Smrg var = &ctx->Array.ArrayObj->Vertex.Enabled; 657117f1b4Smrg flag = _NEW_ARRAY_VERTEX; 667117f1b4Smrg break; 677117f1b4Smrg case GL_NORMAL_ARRAY: 687117f1b4Smrg var = &ctx->Array.ArrayObj->Normal.Enabled; 697117f1b4Smrg flag = _NEW_ARRAY_NORMAL; 707117f1b4Smrg break; 717117f1b4Smrg case GL_COLOR_ARRAY: 727117f1b4Smrg var = &ctx->Array.ArrayObj->Color.Enabled; 737117f1b4Smrg flag = _NEW_ARRAY_COLOR0; 747117f1b4Smrg break; 757117f1b4Smrg case GL_INDEX_ARRAY: 767117f1b4Smrg var = &ctx->Array.ArrayObj->Index.Enabled; 777117f1b4Smrg flag = _NEW_ARRAY_INDEX; 787117f1b4Smrg break; 797117f1b4Smrg case GL_TEXTURE_COORD_ARRAY: 807117f1b4Smrg var = &ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled; 817117f1b4Smrg flag = _NEW_ARRAY_TEXCOORD(ctx->Array.ActiveTexture); 827117f1b4Smrg break; 837117f1b4Smrg case GL_EDGE_FLAG_ARRAY: 847117f1b4Smrg var = &ctx->Array.ArrayObj->EdgeFlag.Enabled; 857117f1b4Smrg flag = _NEW_ARRAY_EDGEFLAG; 867117f1b4Smrg break; 877117f1b4Smrg case GL_FOG_COORDINATE_ARRAY_EXT: 887117f1b4Smrg var = &ctx->Array.ArrayObj->FogCoord.Enabled; 897117f1b4Smrg flag = _NEW_ARRAY_FOGCOORD; 907117f1b4Smrg break; 917117f1b4Smrg case GL_SECONDARY_COLOR_ARRAY_EXT: 927117f1b4Smrg var = &ctx->Array.ArrayObj->SecondaryColor.Enabled; 937117f1b4Smrg flag = _NEW_ARRAY_COLOR1; 947117f1b4Smrg break; 957117f1b4Smrg 96c1f859d4Smrg#if FEATURE_point_size_array 97c1f859d4Smrg case GL_POINT_SIZE_ARRAY_OES: 98c1f859d4Smrg var = &ctx->Array.ArrayObj->PointSize.Enabled; 99c1f859d4Smrg flag = _NEW_ARRAY_POINT_SIZE; 100c1f859d4Smrg break; 101c1f859d4Smrg#endif 102c1f859d4Smrg 1037117f1b4Smrg#if FEATURE_NV_vertex_program 1047117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY0_NV: 1057117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY1_NV: 1067117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY2_NV: 1077117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY3_NV: 1087117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY4_NV: 1097117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY5_NV: 1107117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY6_NV: 1117117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY7_NV: 1127117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY8_NV: 1137117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY9_NV: 1147117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY10_NV: 1157117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY11_NV: 1167117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY12_NV: 1177117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY13_NV: 1187117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY14_NV: 1197117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY15_NV: 1207117f1b4Smrg CHECK_EXTENSION(NV_vertex_program, cap); 1217117f1b4Smrg { 1227117f1b4Smrg GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV; 1237117f1b4Smrg var = &ctx->Array.ArrayObj->VertexAttrib[n].Enabled; 1247117f1b4Smrg flag = _NEW_ARRAY_ATTRIB(n); 1257117f1b4Smrg } 1267117f1b4Smrg break; 1277117f1b4Smrg#endif /* FEATURE_NV_vertex_program */ 1287117f1b4Smrg 1297117f1b4Smrg default: 1307117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, 1317117f1b4Smrg "glEnable/DisableClientState(0x%x)", cap); 1327117f1b4Smrg return; 1337117f1b4Smrg } 1347117f1b4Smrg 1357117f1b4Smrg if (*var == state) 1367117f1b4Smrg return; 1377117f1b4Smrg 1387117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_ARRAY); 1397117f1b4Smrg ctx->Array.NewState |= flag; 140c1f859d4Smrg 141c1f859d4Smrg _ae_invalidate_state(ctx, _NEW_ARRAY); 142c1f859d4Smrg 1437117f1b4Smrg *var = state; 1447117f1b4Smrg 1457117f1b4Smrg if (state) 1467117f1b4Smrg ctx->Array.ArrayObj->_Enabled |= flag; 1477117f1b4Smrg else 1487117f1b4Smrg ctx->Array.ArrayObj->_Enabled &= ~flag; 1497117f1b4Smrg 1507117f1b4Smrg if (ctx->Driver.Enable) { 1517117f1b4Smrg ctx->Driver.Enable( ctx, cap, state ); 1527117f1b4Smrg } 1537117f1b4Smrg} 1547117f1b4Smrg 1557117f1b4Smrg 1567117f1b4Smrg/** 1577117f1b4Smrg * Enable GL capability. 1587117f1b4Smrg * \param cap state to enable/disable. 1597117f1b4Smrg * 1607117f1b4Smrg * Get's the current context, assures that we're outside glBegin()/glEnd() and 1617117f1b4Smrg * calls client_state(). 1627117f1b4Smrg */ 1637117f1b4Smrgvoid GLAPIENTRY 1647117f1b4Smrg_mesa_EnableClientState( GLenum cap ) 1657117f1b4Smrg{ 1667117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 1677117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 1687117f1b4Smrg client_state( ctx, cap, GL_TRUE ); 1697117f1b4Smrg} 1707117f1b4Smrg 1717117f1b4Smrg 1727117f1b4Smrg/** 1737117f1b4Smrg * Disable GL capability. 1747117f1b4Smrg * \param cap state to enable/disable. 1757117f1b4Smrg * 1767117f1b4Smrg * Get's the current context, assures that we're outside glBegin()/glEnd() and 1777117f1b4Smrg * calls client_state(). 1787117f1b4Smrg */ 1797117f1b4Smrgvoid GLAPIENTRY 1807117f1b4Smrg_mesa_DisableClientState( GLenum cap ) 1817117f1b4Smrg{ 1827117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 1837117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 1847117f1b4Smrg client_state( ctx, cap, GL_FALSE ); 1857117f1b4Smrg} 1867117f1b4Smrg 1877117f1b4Smrg 1887117f1b4Smrg#undef CHECK_EXTENSION 1897117f1b4Smrg#define CHECK_EXTENSION(EXTNAME, CAP) \ 1907117f1b4Smrg if (!ctx->Extensions.EXTNAME) { \ 1917117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "gl%s(0x%x)", \ 1927117f1b4Smrg state ? "Enable" : "Disable", CAP); \ 1937117f1b4Smrg return; \ 1947117f1b4Smrg } 1957117f1b4Smrg 1967117f1b4Smrg#define CHECK_EXTENSION2(EXT1, EXT2, CAP) \ 1977117f1b4Smrg if (!ctx->Extensions.EXT1 && !ctx->Extensions.EXT2) { \ 1987117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "gl%s(0x%x)", \ 1997117f1b4Smrg state ? "Enable" : "Disable", CAP); \ 2007117f1b4Smrg return; \ 2017117f1b4Smrg } 2027117f1b4Smrg 2037117f1b4Smrg 204c1f859d4Smrg 205c1f859d4Smrg/** 206c1f859d4Smrg * Return pointer to current texture unit for setting/getting coordinate 207c1f859d4Smrg * state. 208c1f859d4Smrg * Note that we'll set GL_INVALID_OPERATION if the active texture unit is 209c1f859d4Smrg * higher than the number of supported coordinate units. And we'll return NULL. 210c1f859d4Smrg */ 211c1f859d4Smrgstatic struct gl_texture_unit * 212c1f859d4Smrgget_texcoord_unit(GLcontext *ctx) 213c1f859d4Smrg{ 214c1f859d4Smrg if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) { 215c1f859d4Smrg _mesa_error(ctx, GL_INVALID_OPERATION, "glEnable/Disable(texcoord unit)"); 216c1f859d4Smrg return NULL; 217c1f859d4Smrg } 218c1f859d4Smrg else { 219c1f859d4Smrg return &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 220c1f859d4Smrg } 221c1f859d4Smrg} 222c1f859d4Smrg 223c1f859d4Smrg 2247117f1b4Smrg/** 2257117f1b4Smrg * Helper function to enable or disable a texture target. 2267117f1b4Smrg */ 2277117f1b4Smrgstatic GLboolean 2287117f1b4Smrgenable_texture(GLcontext *ctx, GLboolean state, GLbitfield bit) 2297117f1b4Smrg{ 2307117f1b4Smrg const GLuint curr = ctx->Texture.CurrentUnit; 2317117f1b4Smrg struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr]; 2327117f1b4Smrg const GLuint newenabled = (!state) 2337117f1b4Smrg ? (texUnit->Enabled & ~bit) : (texUnit->Enabled | bit); 2347117f1b4Smrg 2357117f1b4Smrg if (!ctx->DrawBuffer->Visual.rgbMode || texUnit->Enabled == newenabled) 2367117f1b4Smrg return GL_FALSE; 2377117f1b4Smrg 2387117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_TEXTURE); 2397117f1b4Smrg texUnit->Enabled = newenabled; 2407117f1b4Smrg return GL_TRUE; 2417117f1b4Smrg} 2427117f1b4Smrg 2437117f1b4Smrg 2447117f1b4Smrg/** 2457117f1b4Smrg * Helper function to enable or disable state. 2467117f1b4Smrg * 2477117f1b4Smrg * \param ctx GL context. 2487117f1b4Smrg * \param cap the state to enable/disable 2497117f1b4Smrg * \param state whether to enable or disable the specified capability. 2507117f1b4Smrg * 2517117f1b4Smrg * Updates the current context and flushes the vertices as needed. For 2527117f1b4Smrg * capabilities associated with extensions it verifies that those extensions 2537117f1b4Smrg * are effectivly present before updating. Notifies the driver via 2547117f1b4Smrg * dd_function_table::Enable. 2557117f1b4Smrg */ 2567117f1b4Smrgvoid 2577117f1b4Smrg_mesa_set_enable(GLcontext *ctx, GLenum cap, GLboolean state) 2587117f1b4Smrg{ 2597117f1b4Smrg if (MESA_VERBOSE & VERBOSE_API) 2607117f1b4Smrg _mesa_debug(ctx, "%s %s (newstate is %x)\n", 2617117f1b4Smrg state ? "glEnable" : "glDisable", 2627117f1b4Smrg _mesa_lookup_enum_by_nr(cap), 2637117f1b4Smrg ctx->NewState); 2647117f1b4Smrg 2657117f1b4Smrg switch (cap) { 2667117f1b4Smrg case GL_ALPHA_TEST: 2677117f1b4Smrg if (ctx->Color.AlphaEnabled == state) 2687117f1b4Smrg return; 2697117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_COLOR); 2707117f1b4Smrg ctx->Color.AlphaEnabled = state; 2717117f1b4Smrg break; 2727117f1b4Smrg case GL_AUTO_NORMAL: 2737117f1b4Smrg if (ctx->Eval.AutoNormal == state) 2747117f1b4Smrg return; 2757117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 2767117f1b4Smrg ctx->Eval.AutoNormal = state; 2777117f1b4Smrg break; 2787117f1b4Smrg case GL_BLEND: 2797117f1b4Smrg if (ctx->Color.BlendEnabled == state) 2807117f1b4Smrg return; 2817117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_COLOR); 2827117f1b4Smrg ctx->Color.BlendEnabled = state; 2837117f1b4Smrg break; 2847117f1b4Smrg#if FEATURE_userclip 2857117f1b4Smrg case GL_CLIP_PLANE0: 2867117f1b4Smrg case GL_CLIP_PLANE1: 2877117f1b4Smrg case GL_CLIP_PLANE2: 2887117f1b4Smrg case GL_CLIP_PLANE3: 2897117f1b4Smrg case GL_CLIP_PLANE4: 2907117f1b4Smrg case GL_CLIP_PLANE5: 2917117f1b4Smrg { 2927117f1b4Smrg const GLuint p = cap - GL_CLIP_PLANE0; 2937117f1b4Smrg 2947117f1b4Smrg if ((ctx->Transform.ClipPlanesEnabled & (1 << p)) == ((GLuint) state << p)) 2957117f1b4Smrg return; 2967117f1b4Smrg 2977117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_TRANSFORM); 2987117f1b4Smrg 2997117f1b4Smrg if (state) { 3007117f1b4Smrg ctx->Transform.ClipPlanesEnabled |= (1 << p); 3017117f1b4Smrg 3027117f1b4Smrg if (_math_matrix_is_dirty(ctx->ProjectionMatrixStack.Top)) 3037117f1b4Smrg _math_matrix_analyse( ctx->ProjectionMatrixStack.Top ); 3047117f1b4Smrg 3057117f1b4Smrg /* This derived state also calculated in clip.c and 3067117f1b4Smrg * from _mesa_update_state() on changes to EyeUserPlane 3077117f1b4Smrg * and ctx->ProjectionMatrix respectively. 3087117f1b4Smrg */ 3097117f1b4Smrg _mesa_transform_vector( ctx->Transform._ClipUserPlane[p], 3107117f1b4Smrg ctx->Transform.EyeUserPlane[p], 3117117f1b4Smrg ctx->ProjectionMatrixStack.Top->inv ); 3127117f1b4Smrg } 3137117f1b4Smrg else { 3147117f1b4Smrg ctx->Transform.ClipPlanesEnabled &= ~(1 << p); 3157117f1b4Smrg } 3167117f1b4Smrg } 3177117f1b4Smrg break; 3187117f1b4Smrg#endif 3197117f1b4Smrg case GL_COLOR_MATERIAL: 3207117f1b4Smrg if (ctx->Light.ColorMaterialEnabled == state) 3217117f1b4Smrg return; 3227117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_LIGHT); 3237117f1b4Smrg FLUSH_CURRENT(ctx, 0); 3247117f1b4Smrg ctx->Light.ColorMaterialEnabled = state; 3257117f1b4Smrg if (state) { 3267117f1b4Smrg _mesa_update_color_material( ctx, 3277117f1b4Smrg ctx->Current.Attrib[VERT_ATTRIB_COLOR0] ); 3287117f1b4Smrg } 3297117f1b4Smrg break; 3307117f1b4Smrg case GL_CULL_FACE: 3317117f1b4Smrg if (ctx->Polygon.CullFlag == state) 3327117f1b4Smrg return; 3337117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_POLYGON); 3347117f1b4Smrg ctx->Polygon.CullFlag = state; 3357117f1b4Smrg break; 3367117f1b4Smrg case GL_CULL_VERTEX_EXT: 3377117f1b4Smrg CHECK_EXTENSION(EXT_cull_vertex, cap); 3387117f1b4Smrg if (ctx->Transform.CullVertexFlag == state) 3397117f1b4Smrg return; 3407117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_TRANSFORM); 3417117f1b4Smrg ctx->Transform.CullVertexFlag = state; 3427117f1b4Smrg break; 3437117f1b4Smrg case GL_DEPTH_TEST: 3447117f1b4Smrg if (ctx->Depth.Test == state) 3457117f1b4Smrg return; 3467117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_DEPTH); 3477117f1b4Smrg ctx->Depth.Test = state; 3487117f1b4Smrg break; 3497117f1b4Smrg case GL_DITHER: 3507117f1b4Smrg if (ctx->NoDither) { 3517117f1b4Smrg state = GL_FALSE; /* MESA_NO_DITHER env var */ 3527117f1b4Smrg } 3537117f1b4Smrg if (ctx->Color.DitherFlag == state) 3547117f1b4Smrg return; 3557117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_COLOR); 3567117f1b4Smrg ctx->Color.DitherFlag = state; 3577117f1b4Smrg break; 3587117f1b4Smrg case GL_FOG: 3597117f1b4Smrg if (ctx->Fog.Enabled == state) 3607117f1b4Smrg return; 3617117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_FOG); 3627117f1b4Smrg ctx->Fog.Enabled = state; 3637117f1b4Smrg break; 3647117f1b4Smrg case GL_HISTOGRAM: 3657117f1b4Smrg CHECK_EXTENSION(EXT_histogram, cap); 3667117f1b4Smrg if (ctx->Pixel.HistogramEnabled == state) 3677117f1b4Smrg return; 3687117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PIXEL); 3697117f1b4Smrg ctx->Pixel.HistogramEnabled = state; 3707117f1b4Smrg break; 3717117f1b4Smrg case GL_LIGHT0: 3727117f1b4Smrg case GL_LIGHT1: 3737117f1b4Smrg case GL_LIGHT2: 3747117f1b4Smrg case GL_LIGHT3: 3757117f1b4Smrg case GL_LIGHT4: 3767117f1b4Smrg case GL_LIGHT5: 3777117f1b4Smrg case GL_LIGHT6: 3787117f1b4Smrg case GL_LIGHT7: 3797117f1b4Smrg if (ctx->Light.Light[cap-GL_LIGHT0].Enabled == state) 3807117f1b4Smrg return; 3817117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_LIGHT); 3827117f1b4Smrg ctx->Light.Light[cap-GL_LIGHT0].Enabled = state; 3837117f1b4Smrg if (state) { 3847117f1b4Smrg insert_at_tail(&ctx->Light.EnabledList, 3857117f1b4Smrg &ctx->Light.Light[cap-GL_LIGHT0]); 3867117f1b4Smrg } 3877117f1b4Smrg else { 3887117f1b4Smrg remove_from_list(&ctx->Light.Light[cap-GL_LIGHT0]); 3897117f1b4Smrg } 3907117f1b4Smrg break; 3917117f1b4Smrg case GL_LIGHTING: 3927117f1b4Smrg if (ctx->Light.Enabled == state) 3937117f1b4Smrg return; 3947117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_LIGHT); 3957117f1b4Smrg ctx->Light.Enabled = state; 3967117f1b4Smrg if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) 3977117f1b4Smrg ctx->_TriangleCaps |= DD_TRI_LIGHT_TWOSIDE; 3987117f1b4Smrg else 3997117f1b4Smrg ctx->_TriangleCaps &= ~DD_TRI_LIGHT_TWOSIDE; 4007117f1b4Smrg break; 4017117f1b4Smrg case GL_LINE_SMOOTH: 4027117f1b4Smrg if (ctx->Line.SmoothFlag == state) 4037117f1b4Smrg return; 4047117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_LINE); 4057117f1b4Smrg ctx->Line.SmoothFlag = state; 4067117f1b4Smrg ctx->_TriangleCaps ^= DD_LINE_SMOOTH; 4077117f1b4Smrg break; 4087117f1b4Smrg case GL_LINE_STIPPLE: 4097117f1b4Smrg if (ctx->Line.StippleFlag == state) 4107117f1b4Smrg return; 4117117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_LINE); 4127117f1b4Smrg ctx->Line.StippleFlag = state; 4137117f1b4Smrg ctx->_TriangleCaps ^= DD_LINE_STIPPLE; 4147117f1b4Smrg break; 4157117f1b4Smrg case GL_INDEX_LOGIC_OP: 4167117f1b4Smrg if (ctx->Color.IndexLogicOpEnabled == state) 4177117f1b4Smrg return; 4187117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_COLOR); 4197117f1b4Smrg ctx->Color.IndexLogicOpEnabled = state; 4207117f1b4Smrg break; 4217117f1b4Smrg case GL_COLOR_LOGIC_OP: 4227117f1b4Smrg if (ctx->Color.ColorLogicOpEnabled == state) 4237117f1b4Smrg return; 4247117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_COLOR); 4257117f1b4Smrg ctx->Color.ColorLogicOpEnabled = state; 4267117f1b4Smrg break; 4277117f1b4Smrg case GL_MAP1_COLOR_4: 4287117f1b4Smrg if (ctx->Eval.Map1Color4 == state) 4297117f1b4Smrg return; 4307117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4317117f1b4Smrg ctx->Eval.Map1Color4 = state; 4327117f1b4Smrg break; 4337117f1b4Smrg case GL_MAP1_INDEX: 4347117f1b4Smrg if (ctx->Eval.Map1Index == state) 4357117f1b4Smrg return; 4367117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4377117f1b4Smrg ctx->Eval.Map1Index = state; 4387117f1b4Smrg break; 4397117f1b4Smrg case GL_MAP1_NORMAL: 4407117f1b4Smrg if (ctx->Eval.Map1Normal == state) 4417117f1b4Smrg return; 4427117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4437117f1b4Smrg ctx->Eval.Map1Normal = state; 4447117f1b4Smrg break; 4457117f1b4Smrg case GL_MAP1_TEXTURE_COORD_1: 4467117f1b4Smrg if (ctx->Eval.Map1TextureCoord1 == state) 4477117f1b4Smrg return; 4487117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4497117f1b4Smrg ctx->Eval.Map1TextureCoord1 = state; 4507117f1b4Smrg break; 4517117f1b4Smrg case GL_MAP1_TEXTURE_COORD_2: 4527117f1b4Smrg if (ctx->Eval.Map1TextureCoord2 == state) 4537117f1b4Smrg return; 4547117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4557117f1b4Smrg ctx->Eval.Map1TextureCoord2 = state; 4567117f1b4Smrg break; 4577117f1b4Smrg case GL_MAP1_TEXTURE_COORD_3: 4587117f1b4Smrg if (ctx->Eval.Map1TextureCoord3 == state) 4597117f1b4Smrg return; 4607117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4617117f1b4Smrg ctx->Eval.Map1TextureCoord3 = state; 4627117f1b4Smrg break; 4637117f1b4Smrg case GL_MAP1_TEXTURE_COORD_4: 4647117f1b4Smrg if (ctx->Eval.Map1TextureCoord4 == state) 4657117f1b4Smrg return; 4667117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4677117f1b4Smrg ctx->Eval.Map1TextureCoord4 = state; 4687117f1b4Smrg break; 4697117f1b4Smrg case GL_MAP1_VERTEX_3: 4707117f1b4Smrg if (ctx->Eval.Map1Vertex3 == state) 4717117f1b4Smrg return; 4727117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4737117f1b4Smrg ctx->Eval.Map1Vertex3 = state; 4747117f1b4Smrg break; 4757117f1b4Smrg case GL_MAP1_VERTEX_4: 4767117f1b4Smrg if (ctx->Eval.Map1Vertex4 == state) 4777117f1b4Smrg return; 4787117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4797117f1b4Smrg ctx->Eval.Map1Vertex4 = state; 4807117f1b4Smrg break; 4817117f1b4Smrg case GL_MAP2_COLOR_4: 4827117f1b4Smrg if (ctx->Eval.Map2Color4 == state) 4837117f1b4Smrg return; 4847117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4857117f1b4Smrg ctx->Eval.Map2Color4 = state; 4867117f1b4Smrg break; 4877117f1b4Smrg case GL_MAP2_INDEX: 4887117f1b4Smrg if (ctx->Eval.Map2Index == state) 4897117f1b4Smrg return; 4907117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4917117f1b4Smrg ctx->Eval.Map2Index = state; 4927117f1b4Smrg break; 4937117f1b4Smrg case GL_MAP2_NORMAL: 4947117f1b4Smrg if (ctx->Eval.Map2Normal == state) 4957117f1b4Smrg return; 4967117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 4977117f1b4Smrg ctx->Eval.Map2Normal = state; 4987117f1b4Smrg break; 4997117f1b4Smrg case GL_MAP2_TEXTURE_COORD_1: 5007117f1b4Smrg if (ctx->Eval.Map2TextureCoord1 == state) 5017117f1b4Smrg return; 5027117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 5037117f1b4Smrg ctx->Eval.Map2TextureCoord1 = state; 5047117f1b4Smrg break; 5057117f1b4Smrg case GL_MAP2_TEXTURE_COORD_2: 5067117f1b4Smrg if (ctx->Eval.Map2TextureCoord2 == state) 5077117f1b4Smrg return; 5087117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 5097117f1b4Smrg ctx->Eval.Map2TextureCoord2 = state; 5107117f1b4Smrg break; 5117117f1b4Smrg case GL_MAP2_TEXTURE_COORD_3: 5127117f1b4Smrg if (ctx->Eval.Map2TextureCoord3 == state) 5137117f1b4Smrg return; 5147117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 5157117f1b4Smrg ctx->Eval.Map2TextureCoord3 = state; 5167117f1b4Smrg break; 5177117f1b4Smrg case GL_MAP2_TEXTURE_COORD_4: 5187117f1b4Smrg if (ctx->Eval.Map2TextureCoord4 == state) 5197117f1b4Smrg return; 5207117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 5217117f1b4Smrg ctx->Eval.Map2TextureCoord4 = state; 5227117f1b4Smrg break; 5237117f1b4Smrg case GL_MAP2_VERTEX_3: 5247117f1b4Smrg if (ctx->Eval.Map2Vertex3 == state) 5257117f1b4Smrg return; 5267117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 5277117f1b4Smrg ctx->Eval.Map2Vertex3 = state; 5287117f1b4Smrg break; 5297117f1b4Smrg case GL_MAP2_VERTEX_4: 5307117f1b4Smrg if (ctx->Eval.Map2Vertex4 == state) 5317117f1b4Smrg return; 5327117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 5337117f1b4Smrg ctx->Eval.Map2Vertex4 = state; 5347117f1b4Smrg break; 5357117f1b4Smrg case GL_MINMAX: 5367117f1b4Smrg if (ctx->Pixel.MinMaxEnabled == state) 5377117f1b4Smrg return; 5387117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PIXEL); 5397117f1b4Smrg ctx->Pixel.MinMaxEnabled = state; 5407117f1b4Smrg break; 5417117f1b4Smrg case GL_NORMALIZE: 5427117f1b4Smrg if (ctx->Transform.Normalize == state) 5437117f1b4Smrg return; 5447117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_TRANSFORM); 5457117f1b4Smrg ctx->Transform.Normalize = state; 5467117f1b4Smrg break; 5477117f1b4Smrg case GL_POINT_SMOOTH: 5487117f1b4Smrg if (ctx->Point.SmoothFlag == state) 5497117f1b4Smrg return; 5507117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_POINT); 5517117f1b4Smrg ctx->Point.SmoothFlag = state; 5527117f1b4Smrg ctx->_TriangleCaps ^= DD_POINT_SMOOTH; 5537117f1b4Smrg break; 5547117f1b4Smrg case GL_POLYGON_SMOOTH: 5557117f1b4Smrg if (ctx->Polygon.SmoothFlag == state) 5567117f1b4Smrg return; 5577117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_POLYGON); 5587117f1b4Smrg ctx->Polygon.SmoothFlag = state; 5597117f1b4Smrg ctx->_TriangleCaps ^= DD_TRI_SMOOTH; 5607117f1b4Smrg break; 5617117f1b4Smrg case GL_POLYGON_STIPPLE: 5627117f1b4Smrg if (ctx->Polygon.StippleFlag == state) 5637117f1b4Smrg return; 5647117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_POLYGON); 5657117f1b4Smrg ctx->Polygon.StippleFlag = state; 5667117f1b4Smrg ctx->_TriangleCaps ^= DD_TRI_STIPPLE; 5677117f1b4Smrg break; 5687117f1b4Smrg case GL_POLYGON_OFFSET_POINT: 5697117f1b4Smrg if (ctx->Polygon.OffsetPoint == state) 5707117f1b4Smrg return; 5717117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_POLYGON); 5727117f1b4Smrg ctx->Polygon.OffsetPoint = state; 5737117f1b4Smrg break; 5747117f1b4Smrg case GL_POLYGON_OFFSET_LINE: 5757117f1b4Smrg if (ctx->Polygon.OffsetLine == state) 5767117f1b4Smrg return; 5777117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_POLYGON); 5787117f1b4Smrg ctx->Polygon.OffsetLine = state; 5797117f1b4Smrg break; 5807117f1b4Smrg case GL_POLYGON_OFFSET_FILL: 5817117f1b4Smrg /*case GL_POLYGON_OFFSET_EXT:*/ 5827117f1b4Smrg if (ctx->Polygon.OffsetFill == state) 5837117f1b4Smrg return; 5847117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_POLYGON); 5857117f1b4Smrg ctx->Polygon.OffsetFill = state; 5867117f1b4Smrg break; 5877117f1b4Smrg case GL_RESCALE_NORMAL_EXT: 5887117f1b4Smrg if (ctx->Transform.RescaleNormals == state) 5897117f1b4Smrg return; 5907117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_TRANSFORM); 5917117f1b4Smrg ctx->Transform.RescaleNormals = state; 5927117f1b4Smrg break; 5937117f1b4Smrg case GL_SCISSOR_TEST: 5947117f1b4Smrg if (ctx->Scissor.Enabled == state) 5957117f1b4Smrg return; 5967117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_SCISSOR); 5977117f1b4Smrg ctx->Scissor.Enabled = state; 5987117f1b4Smrg break; 5997117f1b4Smrg case GL_SHARED_TEXTURE_PALETTE_EXT: 6007117f1b4Smrg if (ctx->Texture.SharedPalette == state) 6017117f1b4Smrg return; 6027117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_TEXTURE); 6037117f1b4Smrg ctx->Texture.SharedPalette = state; 6047117f1b4Smrg break; 6057117f1b4Smrg case GL_STENCIL_TEST: 6067117f1b4Smrg if (state && ctx->DrawBuffer->Visual.stencilBits == 0) { 6077117f1b4Smrg _mesa_warning(ctx, 6087117f1b4Smrg "glEnable(GL_STENCIL_TEST) but no stencil buffer"); 6097117f1b4Smrg return; 6107117f1b4Smrg } 6117117f1b4Smrg if (ctx->Stencil.Enabled == state) 6127117f1b4Smrg return; 6137117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_STENCIL); 6147117f1b4Smrg ctx->Stencil.Enabled = state; 6157117f1b4Smrg break; 6167117f1b4Smrg case GL_TEXTURE_1D: 6177117f1b4Smrg if (!enable_texture(ctx, state, TEXTURE_1D_BIT)) { 6187117f1b4Smrg return; 6197117f1b4Smrg } 6207117f1b4Smrg break; 6217117f1b4Smrg case GL_TEXTURE_2D: 6227117f1b4Smrg if (!enable_texture(ctx, state, TEXTURE_2D_BIT)) { 6237117f1b4Smrg return; 6247117f1b4Smrg } 6257117f1b4Smrg break; 6267117f1b4Smrg case GL_TEXTURE_3D: 6277117f1b4Smrg if (!enable_texture(ctx, state, TEXTURE_3D_BIT)) { 6287117f1b4Smrg return; 6297117f1b4Smrg } 6307117f1b4Smrg break; 631c1f859d4Smrg case GL_TEXTURE_GEN_Q: 632c1f859d4Smrg { 633c1f859d4Smrg struct gl_texture_unit *texUnit = get_texcoord_unit(ctx); 634c1f859d4Smrg if (texUnit) { 635c1f859d4Smrg GLuint newenabled = texUnit->TexGenEnabled & ~Q_BIT; 636c1f859d4Smrg if (state) 637c1f859d4Smrg newenabled |= Q_BIT; 638c1f859d4Smrg if (texUnit->TexGenEnabled == newenabled) 639c1f859d4Smrg return; 640c1f859d4Smrg FLUSH_VERTICES(ctx, _NEW_TEXTURE); 641c1f859d4Smrg texUnit->TexGenEnabled = newenabled; 642c1f859d4Smrg } 643c1f859d4Smrg } 6447117f1b4Smrg break; 645c1f859d4Smrg case GL_TEXTURE_GEN_R: 646c1f859d4Smrg { 647c1f859d4Smrg struct gl_texture_unit *texUnit = get_texcoord_unit(ctx); 648c1f859d4Smrg if (texUnit) { 649c1f859d4Smrg GLuint newenabled = texUnit->TexGenEnabled & ~R_BIT; 650c1f859d4Smrg if (state) 651c1f859d4Smrg newenabled |= R_BIT; 652c1f859d4Smrg if (texUnit->TexGenEnabled == newenabled) 653c1f859d4Smrg return; 654c1f859d4Smrg FLUSH_VERTICES(ctx, _NEW_TEXTURE); 655c1f859d4Smrg texUnit->TexGenEnabled = newenabled; 656c1f859d4Smrg } 657c1f859d4Smrg } 6587117f1b4Smrg break; 659c1f859d4Smrg case GL_TEXTURE_GEN_S: 660c1f859d4Smrg { 661c1f859d4Smrg struct gl_texture_unit *texUnit = get_texcoord_unit(ctx); 662c1f859d4Smrg if (texUnit) { 663c1f859d4Smrg GLuint newenabled = texUnit->TexGenEnabled & ~S_BIT; 664c1f859d4Smrg if (state) 665c1f859d4Smrg newenabled |= S_BIT; 666c1f859d4Smrg if (texUnit->TexGenEnabled == newenabled) 667c1f859d4Smrg return; 668c1f859d4Smrg FLUSH_VERTICES(ctx, _NEW_TEXTURE); 669c1f859d4Smrg texUnit->TexGenEnabled = newenabled; 670c1f859d4Smrg } 671c1f859d4Smrg } 6727117f1b4Smrg break; 673c1f859d4Smrg case GL_TEXTURE_GEN_T: 674c1f859d4Smrg { 675c1f859d4Smrg struct gl_texture_unit *texUnit = get_texcoord_unit(ctx); 676c1f859d4Smrg if (texUnit) { 677c1f859d4Smrg GLuint newenabled = texUnit->TexGenEnabled & ~T_BIT; 678c1f859d4Smrg if (state) 679c1f859d4Smrg newenabled |= T_BIT; 680c1f859d4Smrg if (texUnit->TexGenEnabled == newenabled) 681c1f859d4Smrg return; 682c1f859d4Smrg FLUSH_VERTICES(ctx, _NEW_TEXTURE); 683c1f859d4Smrg texUnit->TexGenEnabled = newenabled; 684c1f859d4Smrg } 685c1f859d4Smrg } 6867117f1b4Smrg break; 6877117f1b4Smrg 6887117f1b4Smrg /* 6897117f1b4Smrg * CLIENT STATE!!! 6907117f1b4Smrg */ 6917117f1b4Smrg case GL_VERTEX_ARRAY: 6927117f1b4Smrg case GL_NORMAL_ARRAY: 6937117f1b4Smrg case GL_COLOR_ARRAY: 6947117f1b4Smrg case GL_INDEX_ARRAY: 6957117f1b4Smrg case GL_TEXTURE_COORD_ARRAY: 6967117f1b4Smrg case GL_EDGE_FLAG_ARRAY: 6977117f1b4Smrg case GL_FOG_COORDINATE_ARRAY_EXT: 6987117f1b4Smrg case GL_SECONDARY_COLOR_ARRAY_EXT: 699c1f859d4Smrg case GL_POINT_SIZE_ARRAY_OES: 7007117f1b4Smrg client_state( ctx, cap, state ); 7017117f1b4Smrg return; 7027117f1b4Smrg 7037117f1b4Smrg /* GL_SGI_color_table */ 7047117f1b4Smrg case GL_COLOR_TABLE_SGI: 7057117f1b4Smrg CHECK_EXTENSION(SGI_color_table, cap); 7067117f1b4Smrg if (ctx->Pixel.ColorTableEnabled[COLORTABLE_PRECONVOLUTION] == state) 7077117f1b4Smrg return; 7087117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PIXEL); 7097117f1b4Smrg ctx->Pixel.ColorTableEnabled[COLORTABLE_PRECONVOLUTION] = state; 7107117f1b4Smrg break; 7117117f1b4Smrg case GL_POST_CONVOLUTION_COLOR_TABLE_SGI: 7127117f1b4Smrg CHECK_EXTENSION(SGI_color_table, cap); 7137117f1b4Smrg if (ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCONVOLUTION] == state) 7147117f1b4Smrg return; 7157117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PIXEL); 7167117f1b4Smrg ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCONVOLUTION] = state; 7177117f1b4Smrg break; 7187117f1b4Smrg case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI: 7197117f1b4Smrg CHECK_EXTENSION(SGI_color_table, cap); 7207117f1b4Smrg if (ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCOLORMATRIX] == state) 7217117f1b4Smrg return; 7227117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PIXEL); 7237117f1b4Smrg ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCOLORMATRIX] = state; 7247117f1b4Smrg break; 7257117f1b4Smrg case GL_TEXTURE_COLOR_TABLE_SGI: 7267117f1b4Smrg CHECK_EXTENSION(SGI_texture_color_table, cap); 7277117f1b4Smrg if (ctx->Texture.Unit[ctx->Texture.CurrentUnit].ColorTableEnabled == state) 7287117f1b4Smrg return; 7297117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_TEXTURE); 7307117f1b4Smrg ctx->Texture.Unit[ctx->Texture.CurrentUnit].ColorTableEnabled = state; 7317117f1b4Smrg break; 7327117f1b4Smrg 7337117f1b4Smrg /* GL_EXT_convolution */ 7347117f1b4Smrg case GL_CONVOLUTION_1D: 7357117f1b4Smrg CHECK_EXTENSION(EXT_convolution, cap); 7367117f1b4Smrg if (ctx->Pixel.Convolution1DEnabled == state) 7377117f1b4Smrg return; 7387117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PIXEL); 7397117f1b4Smrg ctx->Pixel.Convolution1DEnabled = state; 7407117f1b4Smrg break; 7417117f1b4Smrg case GL_CONVOLUTION_2D: 7427117f1b4Smrg CHECK_EXTENSION(EXT_convolution, cap); 7437117f1b4Smrg if (ctx->Pixel.Convolution2DEnabled == state) 7447117f1b4Smrg return; 7457117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PIXEL); 7467117f1b4Smrg ctx->Pixel.Convolution2DEnabled = state; 7477117f1b4Smrg break; 7487117f1b4Smrg case GL_SEPARABLE_2D: 7497117f1b4Smrg CHECK_EXTENSION(EXT_convolution, cap); 7507117f1b4Smrg if (ctx->Pixel.Separable2DEnabled == state) 7517117f1b4Smrg return; 7527117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PIXEL); 7537117f1b4Smrg ctx->Pixel.Separable2DEnabled = state; 7547117f1b4Smrg break; 7557117f1b4Smrg 7567117f1b4Smrg /* GL_ARB_texture_cube_map */ 7577117f1b4Smrg case GL_TEXTURE_CUBE_MAP_ARB: 7587117f1b4Smrg CHECK_EXTENSION(ARB_texture_cube_map, cap); 7597117f1b4Smrg if (!enable_texture(ctx, state, TEXTURE_CUBE_BIT)) { 7607117f1b4Smrg return; 7617117f1b4Smrg } 7627117f1b4Smrg break; 7637117f1b4Smrg 7647117f1b4Smrg /* GL_EXT_secondary_color */ 7657117f1b4Smrg case GL_COLOR_SUM_EXT: 7667117f1b4Smrg CHECK_EXTENSION2(EXT_secondary_color, ARB_vertex_program, cap); 7677117f1b4Smrg if (ctx->Fog.ColorSumEnabled == state) 7687117f1b4Smrg return; 7697117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_FOG); 7707117f1b4Smrg ctx->Fog.ColorSumEnabled = state; 7717117f1b4Smrg break; 7727117f1b4Smrg 7737117f1b4Smrg /* GL_ARB_multisample */ 7747117f1b4Smrg case GL_MULTISAMPLE_ARB: 7757117f1b4Smrg CHECK_EXTENSION(ARB_multisample, cap); 7767117f1b4Smrg if (ctx->Multisample.Enabled == state) 7777117f1b4Smrg return; 7787117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE); 7797117f1b4Smrg ctx->Multisample.Enabled = state; 7807117f1b4Smrg break; 7817117f1b4Smrg case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB: 7827117f1b4Smrg CHECK_EXTENSION(ARB_multisample, cap); 7837117f1b4Smrg if (ctx->Multisample.SampleAlphaToCoverage == state) 7847117f1b4Smrg return; 7857117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE); 7867117f1b4Smrg ctx->Multisample.SampleAlphaToCoverage = state; 7877117f1b4Smrg break; 7887117f1b4Smrg case GL_SAMPLE_ALPHA_TO_ONE_ARB: 7897117f1b4Smrg CHECK_EXTENSION(ARB_multisample, cap); 7907117f1b4Smrg if (ctx->Multisample.SampleAlphaToOne == state) 7917117f1b4Smrg return; 7927117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE); 7937117f1b4Smrg ctx->Multisample.SampleAlphaToOne = state; 7947117f1b4Smrg break; 7957117f1b4Smrg case GL_SAMPLE_COVERAGE_ARB: 7967117f1b4Smrg CHECK_EXTENSION(ARB_multisample, cap); 7977117f1b4Smrg if (ctx->Multisample.SampleCoverage == state) 7987117f1b4Smrg return; 7997117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE); 8007117f1b4Smrg ctx->Multisample.SampleCoverage = state; 8017117f1b4Smrg break; 8027117f1b4Smrg case GL_SAMPLE_COVERAGE_INVERT_ARB: 8037117f1b4Smrg CHECK_EXTENSION(ARB_multisample, cap); 8047117f1b4Smrg if (ctx->Multisample.SampleCoverageInvert == state) 8057117f1b4Smrg return; 8067117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE); 8077117f1b4Smrg ctx->Multisample.SampleCoverageInvert = state; 8087117f1b4Smrg break; 8097117f1b4Smrg 8107117f1b4Smrg /* GL_IBM_rasterpos_clip */ 8117117f1b4Smrg case GL_RASTER_POSITION_UNCLIPPED_IBM: 8127117f1b4Smrg CHECK_EXTENSION(IBM_rasterpos_clip, cap); 8137117f1b4Smrg if (ctx->Transform.RasterPositionUnclipped == state) 8147117f1b4Smrg return; 8157117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_TRANSFORM); 8167117f1b4Smrg ctx->Transform.RasterPositionUnclipped = state; 8177117f1b4Smrg break; 8187117f1b4Smrg 8197117f1b4Smrg /* GL_NV_point_sprite */ 8207117f1b4Smrg case GL_POINT_SPRITE_NV: 8217117f1b4Smrg CHECK_EXTENSION2(NV_point_sprite, ARB_point_sprite, cap); 8227117f1b4Smrg if (ctx->Point.PointSprite == state) 8237117f1b4Smrg return; 8247117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_POINT); 8257117f1b4Smrg ctx->Point.PointSprite = state; 8267117f1b4Smrg break; 8277117f1b4Smrg 8287117f1b4Smrg#if FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program 8297117f1b4Smrg case GL_VERTEX_PROGRAM_ARB: 8307117f1b4Smrg CHECK_EXTENSION2(ARB_vertex_program, NV_vertex_program, cap); 8317117f1b4Smrg if (ctx->VertexProgram.Enabled == state) 8327117f1b4Smrg return; 8337117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PROGRAM); 8347117f1b4Smrg ctx->VertexProgram.Enabled = state; 8357117f1b4Smrg break; 8367117f1b4Smrg case GL_VERTEX_PROGRAM_POINT_SIZE_ARB: 8377117f1b4Smrg CHECK_EXTENSION2(ARB_vertex_program, NV_vertex_program, cap); 8387117f1b4Smrg if (ctx->VertexProgram.PointSizeEnabled == state) 8397117f1b4Smrg return; 8407117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PROGRAM); 8417117f1b4Smrg ctx->VertexProgram.PointSizeEnabled = state; 8427117f1b4Smrg break; 8437117f1b4Smrg case GL_VERTEX_PROGRAM_TWO_SIDE_ARB: 8447117f1b4Smrg CHECK_EXTENSION2(ARB_vertex_program, NV_vertex_program, cap); 8457117f1b4Smrg if (ctx->VertexProgram.TwoSideEnabled == state) 8467117f1b4Smrg return; 8477117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PROGRAM); 8487117f1b4Smrg ctx->VertexProgram.TwoSideEnabled = state; 8497117f1b4Smrg break; 8507117f1b4Smrg#endif 8517117f1b4Smrg#if FEATURE_NV_vertex_program 8527117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB0_4_NV: 8537117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB1_4_NV: 8547117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB2_4_NV: 8557117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB3_4_NV: 8567117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB4_4_NV: 8577117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB5_4_NV: 8587117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB6_4_NV: 8597117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB7_4_NV: 8607117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB8_4_NV: 8617117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB9_4_NV: 8627117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB10_4_NV: 8637117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB11_4_NV: 8647117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB12_4_NV: 8657117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB13_4_NV: 8667117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB14_4_NV: 8677117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB15_4_NV: 8687117f1b4Smrg CHECK_EXTENSION(NV_vertex_program, cap); 8697117f1b4Smrg { 8707117f1b4Smrg const GLuint map = (GLuint) (cap - GL_MAP1_VERTEX_ATTRIB0_4_NV); 8717117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 8727117f1b4Smrg ctx->Eval.Map1Attrib[map] = state; 8737117f1b4Smrg } 8747117f1b4Smrg break; 8757117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB0_4_NV: 8767117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB1_4_NV: 8777117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB2_4_NV: 8787117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB3_4_NV: 8797117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB4_4_NV: 8807117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB5_4_NV: 8817117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB6_4_NV: 8827117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB7_4_NV: 8837117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB8_4_NV: 8847117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB9_4_NV: 8857117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB10_4_NV: 8867117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB11_4_NV: 8877117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB12_4_NV: 8887117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB13_4_NV: 8897117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB14_4_NV: 8907117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB15_4_NV: 8917117f1b4Smrg CHECK_EXTENSION(NV_vertex_program, cap); 8927117f1b4Smrg { 8937117f1b4Smrg const GLuint map = (GLuint) (cap - GL_MAP2_VERTEX_ATTRIB0_4_NV); 8947117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_EVAL); 8957117f1b4Smrg ctx->Eval.Map2Attrib[map] = state; 8967117f1b4Smrg } 8977117f1b4Smrg break; 8987117f1b4Smrg#endif /* FEATURE_NV_vertex_program */ 8997117f1b4Smrg 9007117f1b4Smrg#if FEATURE_NV_fragment_program 9017117f1b4Smrg case GL_FRAGMENT_PROGRAM_NV: 9027117f1b4Smrg CHECK_EXTENSION(NV_fragment_program, cap); 9037117f1b4Smrg if (ctx->FragmentProgram.Enabled == state) 9047117f1b4Smrg return; 9057117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PROGRAM); 9067117f1b4Smrg ctx->FragmentProgram.Enabled = state; 9077117f1b4Smrg break; 9087117f1b4Smrg#endif /* FEATURE_NV_fragment_program */ 9097117f1b4Smrg 9107117f1b4Smrg /* GL_NV_texture_rectangle */ 9117117f1b4Smrg case GL_TEXTURE_RECTANGLE_NV: 9127117f1b4Smrg CHECK_EXTENSION(NV_texture_rectangle, cap); 9137117f1b4Smrg if (!enable_texture(ctx, state, TEXTURE_RECT_BIT)) { 9147117f1b4Smrg return; 9157117f1b4Smrg } 9167117f1b4Smrg break; 9177117f1b4Smrg 9187117f1b4Smrg /* GL_EXT_stencil_two_side */ 9197117f1b4Smrg case GL_STENCIL_TEST_TWO_SIDE_EXT: 9207117f1b4Smrg CHECK_EXTENSION(EXT_stencil_two_side, cap); 9217117f1b4Smrg if (ctx->Stencil.TestTwoSide == state) 9227117f1b4Smrg return; 9237117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_STENCIL); 9247117f1b4Smrg ctx->Stencil.TestTwoSide = state; 925c1f859d4Smrg if (state) { 926c1f859d4Smrg ctx->Stencil._BackFace = 2; 9277117f1b4Smrg ctx->_TriangleCaps |= DD_TRI_TWOSTENCIL; 928c1f859d4Smrg } else { 929c1f859d4Smrg ctx->Stencil._BackFace = 1; 9307117f1b4Smrg ctx->_TriangleCaps &= ~DD_TRI_TWOSTENCIL; 931c1f859d4Smrg } 9327117f1b4Smrg break; 9337117f1b4Smrg 9347117f1b4Smrg#if FEATURE_ARB_fragment_program 9357117f1b4Smrg case GL_FRAGMENT_PROGRAM_ARB: 9367117f1b4Smrg CHECK_EXTENSION(ARB_fragment_program, cap); 9377117f1b4Smrg if (ctx->FragmentProgram.Enabled == state) 9387117f1b4Smrg return; 9397117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PROGRAM); 9407117f1b4Smrg ctx->FragmentProgram.Enabled = state; 9417117f1b4Smrg break; 9427117f1b4Smrg#endif /* FEATURE_ARB_fragment_program */ 9437117f1b4Smrg 9447117f1b4Smrg /* GL_EXT_depth_bounds_test */ 9457117f1b4Smrg case GL_DEPTH_BOUNDS_TEST_EXT: 9467117f1b4Smrg CHECK_EXTENSION(EXT_depth_bounds_test, cap); 9477117f1b4Smrg if (state && ctx->DrawBuffer->Visual.depthBits == 0) { 9487117f1b4Smrg _mesa_warning(ctx, 9497117f1b4Smrg "glEnable(GL_DEPTH_BOUNDS_TEST_EXT) but no depth buffer"); 9507117f1b4Smrg return; 9517117f1b4Smrg } 9527117f1b4Smrg if (ctx->Depth.BoundsTest == state) 9537117f1b4Smrg return; 9547117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_DEPTH); 9557117f1b4Smrg ctx->Depth.BoundsTest = state; 9567117f1b4Smrg break; 9577117f1b4Smrg 9587117f1b4Smrg /* GL_MESA_program_debug */ 9597117f1b4Smrg case GL_FRAGMENT_PROGRAM_CALLBACK_MESA: 9607117f1b4Smrg CHECK_EXTENSION(MESA_program_debug, cap); 9617117f1b4Smrg ctx->FragmentProgram.CallbackEnabled = state; 9627117f1b4Smrg break; 9637117f1b4Smrg case GL_VERTEX_PROGRAM_CALLBACK_MESA: 9647117f1b4Smrg CHECK_EXTENSION(MESA_program_debug, cap); 9657117f1b4Smrg ctx->VertexProgram.CallbackEnabled = state; 9667117f1b4Smrg break; 9677117f1b4Smrg 9687117f1b4Smrg#if FEATURE_ATI_fragment_shader 9697117f1b4Smrg case GL_FRAGMENT_SHADER_ATI: 9707117f1b4Smrg CHECK_EXTENSION(ATI_fragment_shader, cap); 9717117f1b4Smrg if (ctx->ATIFragmentShader.Enabled == state) 9727117f1b4Smrg return; 9737117f1b4Smrg FLUSH_VERTICES(ctx, _NEW_PROGRAM); 9747117f1b4Smrg ctx->ATIFragmentShader.Enabled = state; 9757117f1b4Smrg break; 9767117f1b4Smrg#endif 977c1f859d4Smrg 978c1f859d4Smrg /* GL_MESA_texture_array */ 979c1f859d4Smrg case GL_TEXTURE_1D_ARRAY_EXT: 980c1f859d4Smrg CHECK_EXTENSION(MESA_texture_array, cap); 981c1f859d4Smrg if (!enable_texture(ctx, state, TEXTURE_1D_ARRAY_BIT)) { 982c1f859d4Smrg return; 983c1f859d4Smrg } 984c1f859d4Smrg break; 985c1f859d4Smrg 986c1f859d4Smrg case GL_TEXTURE_2D_ARRAY_EXT: 987c1f859d4Smrg CHECK_EXTENSION(MESA_texture_array, cap); 988c1f859d4Smrg if (!enable_texture(ctx, state, TEXTURE_2D_ARRAY_BIT)) { 989c1f859d4Smrg return; 990c1f859d4Smrg } 991c1f859d4Smrg break; 992c1f859d4Smrg 9937117f1b4Smrg default: 9947117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, 9957117f1b4Smrg "%s(0x%x)", state ? "glEnable" : "glDisable", cap); 9967117f1b4Smrg return; 9977117f1b4Smrg } 9987117f1b4Smrg 9997117f1b4Smrg if (ctx->Driver.Enable) { 10007117f1b4Smrg ctx->Driver.Enable( ctx, cap, state ); 10017117f1b4Smrg } 10027117f1b4Smrg} 10037117f1b4Smrg 10047117f1b4Smrg 10057117f1b4Smrg/** 10067117f1b4Smrg * Enable GL capability. Called by glEnable() 10077117f1b4Smrg * \param cap state to enable. 10087117f1b4Smrg */ 10097117f1b4Smrgvoid GLAPIENTRY 10107117f1b4Smrg_mesa_Enable( GLenum cap ) 10117117f1b4Smrg{ 10127117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 10137117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 10147117f1b4Smrg 10157117f1b4Smrg _mesa_set_enable( ctx, cap, GL_TRUE ); 10167117f1b4Smrg} 10177117f1b4Smrg 10187117f1b4Smrg 10197117f1b4Smrg/** 10207117f1b4Smrg * Disable GL capability. Called by glDisable() 10217117f1b4Smrg * \param cap state to disable. 10227117f1b4Smrg */ 10237117f1b4Smrgvoid GLAPIENTRY 10247117f1b4Smrg_mesa_Disable( GLenum cap ) 10257117f1b4Smrg{ 10267117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 10277117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 10287117f1b4Smrg 10297117f1b4Smrg _mesa_set_enable( ctx, cap, GL_FALSE ); 10307117f1b4Smrg} 10317117f1b4Smrg 10327117f1b4Smrg 10337117f1b4Smrg#undef CHECK_EXTENSION 10347117f1b4Smrg#define CHECK_EXTENSION(EXTNAME) \ 10357117f1b4Smrg if (!ctx->Extensions.EXTNAME) { \ 10367117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabled"); \ 10377117f1b4Smrg return GL_FALSE; \ 10387117f1b4Smrg } 10397117f1b4Smrg 10407117f1b4Smrg#undef CHECK_EXTENSION2 10417117f1b4Smrg#define CHECK_EXTENSION2(EXT1, EXT2) \ 10427117f1b4Smrg if (!ctx->Extensions.EXT1 && !ctx->Extensions.EXT2) { \ 10437117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabled"); \ 10447117f1b4Smrg return GL_FALSE; \ 10457117f1b4Smrg } 10467117f1b4Smrg 10477117f1b4Smrg 10487117f1b4Smrg/** 10497117f1b4Smrg * Helper function to determine whether a texture target is enabled. 10507117f1b4Smrg */ 10517117f1b4Smrgstatic GLboolean 10527117f1b4Smrgis_texture_enabled(GLcontext *ctx, GLbitfield bit) 10537117f1b4Smrg{ 10547117f1b4Smrg const struct gl_texture_unit *const texUnit = 10557117f1b4Smrg &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 10567117f1b4Smrg return (texUnit->Enabled & bit) ? GL_TRUE : GL_FALSE; 10577117f1b4Smrg} 10587117f1b4Smrg 10597117f1b4Smrg 10607117f1b4Smrg/** 10617117f1b4Smrg * Return simple enable/disable state. 10627117f1b4Smrg * 10637117f1b4Smrg * \param cap state variable to query. 10647117f1b4Smrg * 10657117f1b4Smrg * Returns the state of the specified capability from the current GL context. 10667117f1b4Smrg * For the capabilities associated with extensions verifies that those 10677117f1b4Smrg * extensions are effectively present before reporting. 10687117f1b4Smrg */ 10697117f1b4SmrgGLboolean GLAPIENTRY 10707117f1b4Smrg_mesa_IsEnabled( GLenum cap ) 10717117f1b4Smrg{ 10727117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 10737117f1b4Smrg switch (cap) { 10747117f1b4Smrg case GL_ALPHA_TEST: 10757117f1b4Smrg return ctx->Color.AlphaEnabled; 10767117f1b4Smrg case GL_AUTO_NORMAL: 10777117f1b4Smrg return ctx->Eval.AutoNormal; 10787117f1b4Smrg case GL_BLEND: 10797117f1b4Smrg return ctx->Color.BlendEnabled; 10807117f1b4Smrg case GL_CLIP_PLANE0: 10817117f1b4Smrg case GL_CLIP_PLANE1: 10827117f1b4Smrg case GL_CLIP_PLANE2: 10837117f1b4Smrg case GL_CLIP_PLANE3: 10847117f1b4Smrg case GL_CLIP_PLANE4: 10857117f1b4Smrg case GL_CLIP_PLANE5: 10867117f1b4Smrg return (ctx->Transform.ClipPlanesEnabled >> (cap - GL_CLIP_PLANE0)) & 1; 10877117f1b4Smrg case GL_COLOR_MATERIAL: 10887117f1b4Smrg return ctx->Light.ColorMaterialEnabled; 10897117f1b4Smrg case GL_CULL_FACE: 10907117f1b4Smrg return ctx->Polygon.CullFlag; 10917117f1b4Smrg case GL_DEPTH_TEST: 10927117f1b4Smrg return ctx->Depth.Test; 10937117f1b4Smrg case GL_DITHER: 10947117f1b4Smrg return ctx->Color.DitherFlag; 10957117f1b4Smrg case GL_FOG: 10967117f1b4Smrg return ctx->Fog.Enabled; 10977117f1b4Smrg case GL_LIGHTING: 10987117f1b4Smrg return ctx->Light.Enabled; 10997117f1b4Smrg case GL_LIGHT0: 11007117f1b4Smrg case GL_LIGHT1: 11017117f1b4Smrg case GL_LIGHT2: 11027117f1b4Smrg case GL_LIGHT3: 11037117f1b4Smrg case GL_LIGHT4: 11047117f1b4Smrg case GL_LIGHT5: 11057117f1b4Smrg case GL_LIGHT6: 11067117f1b4Smrg case GL_LIGHT7: 11077117f1b4Smrg return ctx->Light.Light[cap-GL_LIGHT0].Enabled; 11087117f1b4Smrg case GL_LINE_SMOOTH: 11097117f1b4Smrg return ctx->Line.SmoothFlag; 11107117f1b4Smrg case GL_LINE_STIPPLE: 11117117f1b4Smrg return ctx->Line.StippleFlag; 11127117f1b4Smrg case GL_INDEX_LOGIC_OP: 11137117f1b4Smrg return ctx->Color.IndexLogicOpEnabled; 11147117f1b4Smrg case GL_COLOR_LOGIC_OP: 11157117f1b4Smrg return ctx->Color.ColorLogicOpEnabled; 11167117f1b4Smrg case GL_MAP1_COLOR_4: 11177117f1b4Smrg return ctx->Eval.Map1Color4; 11187117f1b4Smrg case GL_MAP1_INDEX: 11197117f1b4Smrg return ctx->Eval.Map1Index; 11207117f1b4Smrg case GL_MAP1_NORMAL: 11217117f1b4Smrg return ctx->Eval.Map1Normal; 11227117f1b4Smrg case GL_MAP1_TEXTURE_COORD_1: 11237117f1b4Smrg return ctx->Eval.Map1TextureCoord1; 11247117f1b4Smrg case GL_MAP1_TEXTURE_COORD_2: 11257117f1b4Smrg return ctx->Eval.Map1TextureCoord2; 11267117f1b4Smrg case GL_MAP1_TEXTURE_COORD_3: 11277117f1b4Smrg return ctx->Eval.Map1TextureCoord3; 11287117f1b4Smrg case GL_MAP1_TEXTURE_COORD_4: 11297117f1b4Smrg return ctx->Eval.Map1TextureCoord4; 11307117f1b4Smrg case GL_MAP1_VERTEX_3: 11317117f1b4Smrg return ctx->Eval.Map1Vertex3; 11327117f1b4Smrg case GL_MAP1_VERTEX_4: 11337117f1b4Smrg return ctx->Eval.Map1Vertex4; 11347117f1b4Smrg case GL_MAP2_COLOR_4: 11357117f1b4Smrg return ctx->Eval.Map2Color4; 11367117f1b4Smrg case GL_MAP2_INDEX: 11377117f1b4Smrg return ctx->Eval.Map2Index; 11387117f1b4Smrg case GL_MAP2_NORMAL: 11397117f1b4Smrg return ctx->Eval.Map2Normal; 11407117f1b4Smrg case GL_MAP2_TEXTURE_COORD_1: 11417117f1b4Smrg return ctx->Eval.Map2TextureCoord1; 11427117f1b4Smrg case GL_MAP2_TEXTURE_COORD_2: 11437117f1b4Smrg return ctx->Eval.Map2TextureCoord2; 11447117f1b4Smrg case GL_MAP2_TEXTURE_COORD_3: 11457117f1b4Smrg return ctx->Eval.Map2TextureCoord3; 11467117f1b4Smrg case GL_MAP2_TEXTURE_COORD_4: 11477117f1b4Smrg return ctx->Eval.Map2TextureCoord4; 11487117f1b4Smrg case GL_MAP2_VERTEX_3: 11497117f1b4Smrg return ctx->Eval.Map2Vertex3; 11507117f1b4Smrg case GL_MAP2_VERTEX_4: 11517117f1b4Smrg return ctx->Eval.Map2Vertex4; 11527117f1b4Smrg case GL_NORMALIZE: 11537117f1b4Smrg return ctx->Transform.Normalize; 11547117f1b4Smrg case GL_POINT_SMOOTH: 11557117f1b4Smrg return ctx->Point.SmoothFlag; 11567117f1b4Smrg case GL_POLYGON_SMOOTH: 11577117f1b4Smrg return ctx->Polygon.SmoothFlag; 11587117f1b4Smrg case GL_POLYGON_STIPPLE: 11597117f1b4Smrg return ctx->Polygon.StippleFlag; 11607117f1b4Smrg case GL_POLYGON_OFFSET_POINT: 11617117f1b4Smrg return ctx->Polygon.OffsetPoint; 11627117f1b4Smrg case GL_POLYGON_OFFSET_LINE: 11637117f1b4Smrg return ctx->Polygon.OffsetLine; 11647117f1b4Smrg case GL_POLYGON_OFFSET_FILL: 11657117f1b4Smrg /*case GL_POLYGON_OFFSET_EXT:*/ 11667117f1b4Smrg return ctx->Polygon.OffsetFill; 11677117f1b4Smrg case GL_RESCALE_NORMAL_EXT: 11687117f1b4Smrg return ctx->Transform.RescaleNormals; 11697117f1b4Smrg case GL_SCISSOR_TEST: 11707117f1b4Smrg return ctx->Scissor.Enabled; 11717117f1b4Smrg case GL_SHARED_TEXTURE_PALETTE_EXT: 11727117f1b4Smrg return ctx->Texture.SharedPalette; 11737117f1b4Smrg case GL_STENCIL_TEST: 11747117f1b4Smrg return ctx->Stencil.Enabled; 11757117f1b4Smrg case GL_TEXTURE_1D: 11767117f1b4Smrg return is_texture_enabled(ctx, TEXTURE_1D_BIT); 11777117f1b4Smrg case GL_TEXTURE_2D: 11787117f1b4Smrg return is_texture_enabled(ctx, TEXTURE_2D_BIT); 11797117f1b4Smrg case GL_TEXTURE_3D: 11807117f1b4Smrg return is_texture_enabled(ctx, TEXTURE_3D_BIT); 11817117f1b4Smrg case GL_TEXTURE_GEN_Q: 11827117f1b4Smrg { 1183c1f859d4Smrg const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx); 1184c1f859d4Smrg if (texUnit) { 1185c1f859d4Smrg return (texUnit->TexGenEnabled & Q_BIT) ? GL_TRUE : GL_FALSE; 1186c1f859d4Smrg } 11877117f1b4Smrg } 1188c1f859d4Smrg return GL_FALSE; 11897117f1b4Smrg case GL_TEXTURE_GEN_R: 11907117f1b4Smrg { 1191c1f859d4Smrg const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx); 1192c1f859d4Smrg if (texUnit) { 1193c1f859d4Smrg return (texUnit->TexGenEnabled & R_BIT) ? GL_TRUE : GL_FALSE; 1194c1f859d4Smrg } 11957117f1b4Smrg } 1196c1f859d4Smrg return GL_FALSE; 11977117f1b4Smrg case GL_TEXTURE_GEN_S: 11987117f1b4Smrg { 1199c1f859d4Smrg const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx); 1200c1f859d4Smrg if (texUnit) { 1201c1f859d4Smrg return (texUnit->TexGenEnabled & S_BIT) ? GL_TRUE : GL_FALSE; 1202c1f859d4Smrg } 12037117f1b4Smrg } 1204c1f859d4Smrg return GL_FALSE; 12057117f1b4Smrg case GL_TEXTURE_GEN_T: 12067117f1b4Smrg { 1207c1f859d4Smrg const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx); 1208c1f859d4Smrg if (texUnit) { 1209c1f859d4Smrg return (texUnit->TexGenEnabled & T_BIT) ? GL_TRUE : GL_FALSE; 1210c1f859d4Smrg } 12117117f1b4Smrg } 1212c1f859d4Smrg return GL_FALSE; 12137117f1b4Smrg 12147117f1b4Smrg /* 12157117f1b4Smrg * CLIENT STATE!!! 12167117f1b4Smrg */ 12177117f1b4Smrg case GL_VERTEX_ARRAY: 12187117f1b4Smrg return (ctx->Array.ArrayObj->Vertex.Enabled != 0); 12197117f1b4Smrg case GL_NORMAL_ARRAY: 12207117f1b4Smrg return (ctx->Array.ArrayObj->Normal.Enabled != 0); 12217117f1b4Smrg case GL_COLOR_ARRAY: 12227117f1b4Smrg return (ctx->Array.ArrayObj->Color.Enabled != 0); 12237117f1b4Smrg case GL_INDEX_ARRAY: 12247117f1b4Smrg return (ctx->Array.ArrayObj->Index.Enabled != 0); 12257117f1b4Smrg case GL_TEXTURE_COORD_ARRAY: 12267117f1b4Smrg return (ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled != 0); 12277117f1b4Smrg case GL_EDGE_FLAG_ARRAY: 12287117f1b4Smrg return (ctx->Array.ArrayObj->EdgeFlag.Enabled != 0); 12297117f1b4Smrg case GL_FOG_COORDINATE_ARRAY_EXT: 12307117f1b4Smrg CHECK_EXTENSION(EXT_fog_coord); 12317117f1b4Smrg return (ctx->Array.ArrayObj->FogCoord.Enabled != 0); 12327117f1b4Smrg case GL_SECONDARY_COLOR_ARRAY_EXT: 12337117f1b4Smrg CHECK_EXTENSION(EXT_secondary_color); 12347117f1b4Smrg return (ctx->Array.ArrayObj->SecondaryColor.Enabled != 0); 1235c1f859d4Smrg#if FEATURE_point_size_array 1236c1f859d4Smrg case GL_POINT_SIZE_ARRAY_OES: 1237c1f859d4Smrg return (ctx->Array.ArrayObj->PointSize.Enabled != 0); 1238c1f859d4Smrg#endif 12397117f1b4Smrg 12407117f1b4Smrg /* GL_EXT_histogram */ 12417117f1b4Smrg case GL_HISTOGRAM: 12427117f1b4Smrg CHECK_EXTENSION(EXT_histogram); 12437117f1b4Smrg return ctx->Pixel.HistogramEnabled; 12447117f1b4Smrg case GL_MINMAX: 12457117f1b4Smrg CHECK_EXTENSION(EXT_histogram); 12467117f1b4Smrg return ctx->Pixel.MinMaxEnabled; 12477117f1b4Smrg 12487117f1b4Smrg /* GL_SGI_color_table */ 12497117f1b4Smrg case GL_COLOR_TABLE_SGI: 12507117f1b4Smrg CHECK_EXTENSION(SGI_color_table); 12517117f1b4Smrg return ctx->Pixel.ColorTableEnabled[COLORTABLE_PRECONVOLUTION]; 12527117f1b4Smrg case GL_POST_CONVOLUTION_COLOR_TABLE_SGI: 12537117f1b4Smrg CHECK_EXTENSION(SGI_color_table); 12547117f1b4Smrg return ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCONVOLUTION]; 12557117f1b4Smrg case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI: 12567117f1b4Smrg CHECK_EXTENSION(SGI_color_table); 12577117f1b4Smrg return ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCOLORMATRIX]; 12587117f1b4Smrg 12597117f1b4Smrg /* GL_SGI_texture_color_table */ 12607117f1b4Smrg case GL_TEXTURE_COLOR_TABLE_SGI: 12617117f1b4Smrg CHECK_EXTENSION(SGI_texture_color_table); 12627117f1b4Smrg return ctx->Texture.Unit[ctx->Texture.CurrentUnit].ColorTableEnabled; 12637117f1b4Smrg 12647117f1b4Smrg /* GL_EXT_convolution */ 12657117f1b4Smrg case GL_CONVOLUTION_1D: 12667117f1b4Smrg CHECK_EXTENSION(EXT_convolution); 12677117f1b4Smrg return ctx->Pixel.Convolution1DEnabled; 12687117f1b4Smrg case GL_CONVOLUTION_2D: 12697117f1b4Smrg CHECK_EXTENSION(EXT_convolution); 12707117f1b4Smrg return ctx->Pixel.Convolution2DEnabled; 12717117f1b4Smrg case GL_SEPARABLE_2D: 12727117f1b4Smrg CHECK_EXTENSION(EXT_convolution); 12737117f1b4Smrg return ctx->Pixel.Separable2DEnabled; 12747117f1b4Smrg 12757117f1b4Smrg /* GL_ARB_texture_cube_map */ 12767117f1b4Smrg case GL_TEXTURE_CUBE_MAP_ARB: 12777117f1b4Smrg CHECK_EXTENSION(ARB_texture_cube_map); 12787117f1b4Smrg return is_texture_enabled(ctx, TEXTURE_CUBE_BIT); 12797117f1b4Smrg 12807117f1b4Smrg /* GL_EXT_secondary_color */ 12817117f1b4Smrg case GL_COLOR_SUM_EXT: 12827117f1b4Smrg CHECK_EXTENSION2(EXT_secondary_color, ARB_vertex_program); 12837117f1b4Smrg return ctx->Fog.ColorSumEnabled; 12847117f1b4Smrg 12857117f1b4Smrg /* GL_ARB_multisample */ 12867117f1b4Smrg case GL_MULTISAMPLE_ARB: 12877117f1b4Smrg CHECK_EXTENSION(ARB_multisample); 12887117f1b4Smrg return ctx->Multisample.Enabled; 12897117f1b4Smrg case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB: 12907117f1b4Smrg CHECK_EXTENSION(ARB_multisample); 12917117f1b4Smrg return ctx->Multisample.SampleAlphaToCoverage; 12927117f1b4Smrg case GL_SAMPLE_ALPHA_TO_ONE_ARB: 12937117f1b4Smrg CHECK_EXTENSION(ARB_multisample); 12947117f1b4Smrg return ctx->Multisample.SampleAlphaToOne; 12957117f1b4Smrg case GL_SAMPLE_COVERAGE_ARB: 12967117f1b4Smrg CHECK_EXTENSION(ARB_multisample); 12977117f1b4Smrg return ctx->Multisample.SampleCoverage; 12987117f1b4Smrg case GL_SAMPLE_COVERAGE_INVERT_ARB: 12997117f1b4Smrg CHECK_EXTENSION(ARB_multisample); 13007117f1b4Smrg return ctx->Multisample.SampleCoverageInvert; 13017117f1b4Smrg 13027117f1b4Smrg /* GL_IBM_rasterpos_clip */ 13037117f1b4Smrg case GL_RASTER_POSITION_UNCLIPPED_IBM: 13047117f1b4Smrg CHECK_EXTENSION(IBM_rasterpos_clip); 13057117f1b4Smrg return ctx->Transform.RasterPositionUnclipped; 13067117f1b4Smrg 13077117f1b4Smrg /* GL_NV_point_sprite */ 13087117f1b4Smrg case GL_POINT_SPRITE_NV: 13097117f1b4Smrg CHECK_EXTENSION2(NV_point_sprite, ARB_point_sprite) 13107117f1b4Smrg return ctx->Point.PointSprite; 13117117f1b4Smrg 13127117f1b4Smrg#if FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program 13137117f1b4Smrg case GL_VERTEX_PROGRAM_ARB: 13147117f1b4Smrg CHECK_EXTENSION2(ARB_vertex_program, NV_vertex_program); 13157117f1b4Smrg return ctx->VertexProgram.Enabled; 13167117f1b4Smrg case GL_VERTEX_PROGRAM_POINT_SIZE_ARB: 13177117f1b4Smrg CHECK_EXTENSION2(ARB_vertex_program, NV_vertex_program); 13187117f1b4Smrg return ctx->VertexProgram.PointSizeEnabled; 13197117f1b4Smrg case GL_VERTEX_PROGRAM_TWO_SIDE_ARB: 13207117f1b4Smrg CHECK_EXTENSION2(ARB_vertex_program, NV_vertex_program); 13217117f1b4Smrg return ctx->VertexProgram.TwoSideEnabled; 13227117f1b4Smrg#endif 13237117f1b4Smrg#if FEATURE_NV_vertex_program 13247117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY0_NV: 13257117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY1_NV: 13267117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY2_NV: 13277117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY3_NV: 13287117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY4_NV: 13297117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY5_NV: 13307117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY6_NV: 13317117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY7_NV: 13327117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY8_NV: 13337117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY9_NV: 13347117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY10_NV: 13357117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY11_NV: 13367117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY12_NV: 13377117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY13_NV: 13387117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY14_NV: 13397117f1b4Smrg case GL_VERTEX_ATTRIB_ARRAY15_NV: 13407117f1b4Smrg CHECK_EXTENSION(NV_vertex_program); 13417117f1b4Smrg { 13427117f1b4Smrg GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV; 13437117f1b4Smrg return (ctx->Array.ArrayObj->VertexAttrib[n].Enabled != 0); 13447117f1b4Smrg } 13457117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB0_4_NV: 13467117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB1_4_NV: 13477117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB2_4_NV: 13487117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB3_4_NV: 13497117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB4_4_NV: 13507117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB5_4_NV: 13517117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB6_4_NV: 13527117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB7_4_NV: 13537117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB8_4_NV: 13547117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB9_4_NV: 13557117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB10_4_NV: 13567117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB11_4_NV: 13577117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB12_4_NV: 13587117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB13_4_NV: 13597117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB14_4_NV: 13607117f1b4Smrg case GL_MAP1_VERTEX_ATTRIB15_4_NV: 13617117f1b4Smrg CHECK_EXTENSION(NV_vertex_program); 13627117f1b4Smrg { 13637117f1b4Smrg const GLuint map = (GLuint) (cap - GL_MAP1_VERTEX_ATTRIB0_4_NV); 13647117f1b4Smrg return ctx->Eval.Map1Attrib[map]; 13657117f1b4Smrg } 13667117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB0_4_NV: 13677117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB1_4_NV: 13687117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB2_4_NV: 13697117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB3_4_NV: 13707117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB4_4_NV: 13717117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB5_4_NV: 13727117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB6_4_NV: 13737117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB7_4_NV: 13747117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB8_4_NV: 13757117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB9_4_NV: 13767117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB10_4_NV: 13777117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB11_4_NV: 13787117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB12_4_NV: 13797117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB13_4_NV: 13807117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB14_4_NV: 13817117f1b4Smrg case GL_MAP2_VERTEX_ATTRIB15_4_NV: 13827117f1b4Smrg CHECK_EXTENSION(NV_vertex_program); 13837117f1b4Smrg { 13847117f1b4Smrg const GLuint map = (GLuint) (cap - GL_MAP2_VERTEX_ATTRIB0_4_NV); 13857117f1b4Smrg return ctx->Eval.Map2Attrib[map]; 13867117f1b4Smrg } 13877117f1b4Smrg#endif /* FEATURE_NV_vertex_program */ 13887117f1b4Smrg 13897117f1b4Smrg#if FEATURE_NV_fragment_program 13907117f1b4Smrg case GL_FRAGMENT_PROGRAM_NV: 13917117f1b4Smrg CHECK_EXTENSION(NV_fragment_program); 13927117f1b4Smrg return ctx->FragmentProgram.Enabled; 13937117f1b4Smrg#endif /* FEATURE_NV_fragment_program */ 13947117f1b4Smrg 13957117f1b4Smrg /* GL_NV_texture_rectangle */ 13967117f1b4Smrg case GL_TEXTURE_RECTANGLE_NV: 13977117f1b4Smrg CHECK_EXTENSION(NV_texture_rectangle); 13987117f1b4Smrg return is_texture_enabled(ctx, TEXTURE_RECT_BIT); 13997117f1b4Smrg 14007117f1b4Smrg /* GL_EXT_stencil_two_side */ 14017117f1b4Smrg case GL_STENCIL_TEST_TWO_SIDE_EXT: 14027117f1b4Smrg CHECK_EXTENSION(EXT_stencil_two_side); 14037117f1b4Smrg return ctx->Stencil.TestTwoSide; 14047117f1b4Smrg 14057117f1b4Smrg#if FEATURE_ARB_fragment_program 14067117f1b4Smrg case GL_FRAGMENT_PROGRAM_ARB: 14077117f1b4Smrg return ctx->FragmentProgram.Enabled; 14087117f1b4Smrg#endif /* FEATURE_ARB_fragment_program */ 14097117f1b4Smrg 14107117f1b4Smrg /* GL_EXT_depth_bounds_test */ 14117117f1b4Smrg case GL_DEPTH_BOUNDS_TEST_EXT: 14127117f1b4Smrg CHECK_EXTENSION(EXT_depth_bounds_test); 14137117f1b4Smrg return ctx->Depth.BoundsTest; 14147117f1b4Smrg 14157117f1b4Smrg /* GL_MESA_program_debug */ 14167117f1b4Smrg case GL_FRAGMENT_PROGRAM_CALLBACK_MESA: 14177117f1b4Smrg CHECK_EXTENSION(MESA_program_debug); 14187117f1b4Smrg return ctx->FragmentProgram.CallbackEnabled; 14197117f1b4Smrg case GL_VERTEX_PROGRAM_CALLBACK_MESA: 14207117f1b4Smrg CHECK_EXTENSION(MESA_program_debug); 14217117f1b4Smrg return ctx->VertexProgram.CallbackEnabled; 14227117f1b4Smrg#if FEATURE_ATI_fragment_shader 14237117f1b4Smrg case GL_FRAGMENT_SHADER_ATI: 14247117f1b4Smrg CHECK_EXTENSION(ATI_fragment_shader); 14257117f1b4Smrg return ctx->ATIFragmentShader.Enabled; 14267117f1b4Smrg#endif /* FEATURE_ATI_fragment_shader */ 14277117f1b4Smrg default: 14287117f1b4Smrg _mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabled(0x%x)", (int) cap); 14297117f1b4Smrg return GL_FALSE; 14307117f1b4Smrg } 14317117f1b4Smrg} 1432