Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /**
  2.  * \file enable.c
  3.  * Enable/disable/query GL capabilities.
  4.  */
  5.  
  6. /*
  7.  * Mesa 3-D graphics library
  8.  *
  9.  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
  10.  *
  11.  * Permission is hereby granted, free of charge, to any person obtaining a
  12.  * copy of this software and associated documentation files (the "Software"),
  13.  * to deal in the Software without restriction, including without limitation
  14.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  15.  * and/or sell copies of the Software, and to permit persons to whom the
  16.  * Software is furnished to do so, subject to the following conditions:
  17.  *
  18.  * The above copyright notice and this permission notice shall be included
  19.  * in all copies or substantial portions of the Software.
  20.  *
  21.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  22.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  23.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  24.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  25.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  26.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  27.  * OTHER DEALINGS IN THE SOFTWARE.
  28.  */
  29.  
  30.  
  31. #include "glheader.h"
  32. #include "clip.h"
  33. #include "context.h"
  34. #include "enable.h"
  35. #include "errors.h"
  36. #include "light.h"
  37. #include "util/simple_list.h"
  38. #include "mtypes.h"
  39. #include "enums.h"
  40. #include "api_arrayelt.h"
  41. #include "texstate.h"
  42. #include "drivers/common/meta.h"
  43.  
  44.  
  45.  
  46. #define CHECK_EXTENSION(EXTNAME, CAP)                                   \
  47.    if (!ctx->Extensions.EXTNAME) {                                      \
  48.       goto invalid_enum_error;                                          \
  49.    }
  50.  
  51.  
  52. static void
  53. update_derived_primitive_restart_state(struct gl_context *ctx)
  54. {
  55.    /* Update derived primitive restart state.
  56.     */
  57.    ctx->Array._PrimitiveRestart = ctx->Array.PrimitiveRestart
  58.       || ctx->Array.PrimitiveRestartFixedIndex;
  59. }
  60.  
  61. /**
  62.  * Helper to enable/disable client-side state.
  63.  */
  64. static void
  65. client_state(struct gl_context *ctx, GLenum cap, GLboolean state)
  66. {
  67.    struct gl_vertex_array_object *vao = ctx->Array.VAO;
  68.    GLbitfield64 flag;
  69.    GLboolean *var;
  70.  
  71.    switch (cap) {
  72.       case GL_VERTEX_ARRAY:
  73.          var = &vao->VertexAttrib[VERT_ATTRIB_POS].Enabled;
  74.          flag = VERT_BIT_POS;
  75.          break;
  76.       case GL_NORMAL_ARRAY:
  77.          var = &vao->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled;
  78.          flag = VERT_BIT_NORMAL;
  79.          break;
  80.       case GL_COLOR_ARRAY:
  81.          var = &vao->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled;
  82.          flag = VERT_BIT_COLOR0;
  83.          break;
  84.       case GL_INDEX_ARRAY:
  85.          var = &vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled;
  86.          flag = VERT_BIT_COLOR_INDEX;
  87.          break;
  88.       case GL_TEXTURE_COORD_ARRAY:
  89.          var = &vao->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].Enabled;
  90.          flag = VERT_BIT_TEX(ctx->Array.ActiveTexture);
  91.          break;
  92.       case GL_EDGE_FLAG_ARRAY:
  93.          var = &vao->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Enabled;
  94.          flag = VERT_BIT_EDGEFLAG;
  95.          break;
  96.       case GL_FOG_COORDINATE_ARRAY_EXT:
  97.          var = &vao->VertexAttrib[VERT_ATTRIB_FOG].Enabled;
  98.          flag = VERT_BIT_FOG;
  99.          break;
  100.       case GL_SECONDARY_COLOR_ARRAY_EXT:
  101.          var = &vao->VertexAttrib[VERT_ATTRIB_COLOR1].Enabled;
  102.          flag = VERT_BIT_COLOR1;
  103.          break;
  104.  
  105.       case GL_POINT_SIZE_ARRAY_OES:
  106.          var = &vao->VertexAttrib[VERT_ATTRIB_POINT_SIZE].Enabled;
  107.          flag = VERT_BIT_POINT_SIZE;
  108.          break;
  109.  
  110.       /* GL_NV_primitive_restart */
  111.       case GL_PRIMITIVE_RESTART_NV:
  112.          if (!ctx->Extensions.NV_primitive_restart) {
  113.             goto invalid_enum_error;
  114.          }
  115.          var = &ctx->Array.PrimitiveRestart;
  116.          flag = 0;
  117.          break;
  118.  
  119.       default:
  120.          goto invalid_enum_error;
  121.    }
  122.  
  123.    if (*var == state)
  124.       return;
  125.  
  126.    FLUSH_VERTICES(ctx, _NEW_ARRAY);
  127.  
  128.    _ae_invalidate_state(ctx, _NEW_ARRAY);
  129.  
  130.    *var = state;
  131.  
  132.    update_derived_primitive_restart_state(ctx);
  133.  
  134.    if (state)
  135.       vao->_Enabled |= flag;
  136.    else
  137.       vao->_Enabled &= ~flag;
  138.  
  139.    vao->NewArrays |= flag;
  140.  
  141.    if (ctx->Driver.Enable) {
  142.       ctx->Driver.Enable( ctx, cap, state );
  143.    }
  144.  
  145.    return;
  146.  
  147. invalid_enum_error:
  148.    _mesa_error(ctx, GL_INVALID_ENUM, "gl%sClientState(%s)",
  149.                state ? "Enable" : "Disable", _mesa_lookup_enum_by_nr(cap));
  150. }
  151.  
  152.  
  153. /**
  154.  * Enable GL capability.
  155.  * \param cap  state to enable/disable.
  156.  *
  157.  * Get's the current context, assures that we're outside glBegin()/glEnd() and
  158.  * calls client_state().
  159.  */
  160. void GLAPIENTRY
  161. _mesa_EnableClientState( GLenum cap )
  162. {
  163.    GET_CURRENT_CONTEXT(ctx);
  164.    client_state( ctx, cap, GL_TRUE );
  165. }
  166.  
  167.  
  168. /**
  169.  * Disable GL capability.
  170.  * \param cap  state to enable/disable.
  171.  *
  172.  * Get's the current context, assures that we're outside glBegin()/glEnd() and
  173.  * calls client_state().
  174.  */
  175. void GLAPIENTRY
  176. _mesa_DisableClientState( GLenum cap )
  177. {
  178.    GET_CURRENT_CONTEXT(ctx);
  179.    client_state( ctx, cap, GL_FALSE );
  180. }
  181.  
  182.  
  183. #undef CHECK_EXTENSION
  184. #define CHECK_EXTENSION(EXTNAME, CAP)                                   \
  185.    if (!ctx->Extensions.EXTNAME) {                                      \
  186.       goto invalid_enum_error;                                          \
  187.    }
  188.  
  189. #define CHECK_EXTENSION2(EXT1, EXT2, CAP)                               \
  190.    if (!ctx->Extensions.EXT1 && !ctx->Extensions.EXT2) {                \
  191.       goto invalid_enum_error;                                          \
  192.    }
  193.  
  194. /**
  195.  * Return pointer to current texture unit for setting/getting coordinate
  196.  * state.
  197.  * Note that we'll set GL_INVALID_OPERATION and return NULL if the active
  198.  * texture unit is higher than the number of supported coordinate units.
  199.  */
  200. static struct gl_texture_unit *
  201. get_texcoord_unit(struct gl_context *ctx)
  202. {
  203.    if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
  204.       _mesa_error(ctx, GL_INVALID_OPERATION, "glEnable/Disable(texcoord unit)");
  205.       return NULL;
  206.    }
  207.    else {
  208.       return &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
  209.    }
  210. }
  211.  
  212.  
  213. /**
  214.  * Helper function to enable or disable a texture target.
  215.  * \param bit  one of the TEXTURE_x_BIT values
  216.  * \return GL_TRUE if state is changing or GL_FALSE if no change
  217.  */
  218. static GLboolean
  219. enable_texture(struct gl_context *ctx, GLboolean state, GLbitfield texBit)
  220. {
  221.    struct gl_texture_unit *texUnit = _mesa_get_current_tex_unit(ctx);
  222.    const GLbitfield newenabled = state
  223.       ? (texUnit->Enabled | texBit) : (texUnit->Enabled & ~texBit);
  224.  
  225.    if (texUnit->Enabled == newenabled)
  226.        return GL_FALSE;
  227.  
  228.    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
  229.    texUnit->Enabled = newenabled;
  230.    return GL_TRUE;
  231. }
  232.  
  233.  
  234. /**
  235.  * Helper function to enable or disable GL_MULTISAMPLE, skipping the check for
  236.  * whether the API supports it (GLES doesn't).
  237.  */
  238. void
  239. _mesa_set_multisample(struct gl_context *ctx, GLboolean state)
  240. {
  241.    if (ctx->Multisample.Enabled == state)
  242.       return;
  243.    FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
  244.    ctx->Multisample.Enabled = state;
  245.  
  246.    if (ctx->Driver.Enable) {
  247.       ctx->Driver.Enable(ctx, GL_MULTISAMPLE, state);
  248.    }
  249. }
  250.  
  251. /**
  252.  * Helper function to enable or disable GL_FRAMEBUFFER_SRGB, skipping the
  253.  * check for whether the API supports it (GLES doesn't).
  254.  */
  255. void
  256. _mesa_set_framebuffer_srgb(struct gl_context *ctx, GLboolean state)
  257. {
  258.    if (ctx->Color.sRGBEnabled == state)
  259.       return;
  260.    FLUSH_VERTICES(ctx, _NEW_BUFFERS);
  261.    ctx->Color.sRGBEnabled = state;
  262.  
  263.    if (ctx->Driver.Enable) {
  264.       ctx->Driver.Enable(ctx, GL_FRAMEBUFFER_SRGB, state);
  265.    }
  266. }
  267.  
  268. /**
  269.  * Helper function to enable or disable state.
  270.  *
  271.  * \param ctx GL context.
  272.  * \param cap  the state to enable/disable
  273.  * \param state whether to enable or disable the specified capability.
  274.  *
  275.  * Updates the current context and flushes the vertices as needed. For
  276.  * capabilities associated with extensions it verifies that those extensions
  277.  * are effectivly present before updating. Notifies the driver via
  278.  * dd_function_table::Enable.
  279.  */
  280. void
  281. _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
  282. {
  283.    if (MESA_VERBOSE & VERBOSE_API)
  284.       _mesa_debug(ctx, "%s %s (newstate is %x)\n",
  285.                   state ? "glEnable" : "glDisable",
  286.                   _mesa_lookup_enum_by_nr(cap),
  287.                   ctx->NewState);
  288.  
  289.    switch (cap) {
  290.       case GL_ALPHA_TEST:
  291.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  292.             goto invalid_enum_error;
  293.          if (ctx->Color.AlphaEnabled == state)
  294.             return;
  295.          FLUSH_VERTICES(ctx, _NEW_COLOR);
  296.          ctx->Color.AlphaEnabled = state;
  297.          break;
  298.       case GL_AUTO_NORMAL:
  299.          if (ctx->API != API_OPENGL_COMPAT)
  300.             goto invalid_enum_error;
  301.          if (ctx->Eval.AutoNormal == state)
  302.             return;
  303.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  304.          ctx->Eval.AutoNormal = state;
  305.          break;
  306.       case GL_BLEND:
  307.          {
  308.             GLbitfield newEnabled =
  309.                state * ((1 << ctx->Const.MaxDrawBuffers) - 1);
  310.             if (newEnabled != ctx->Color.BlendEnabled) {
  311.                FLUSH_VERTICES(ctx, _NEW_COLOR);
  312.                ctx->Color.BlendEnabled = newEnabled;
  313.             }
  314.          }
  315.          break;
  316.       case GL_CLIP_DISTANCE0: /* aka GL_CLIP_PLANE0 */
  317.       case GL_CLIP_DISTANCE1:
  318.       case GL_CLIP_DISTANCE2:
  319.       case GL_CLIP_DISTANCE3:
  320.       case GL_CLIP_DISTANCE4:
  321.       case GL_CLIP_DISTANCE5:
  322.       case GL_CLIP_DISTANCE6:
  323.       case GL_CLIP_DISTANCE7:
  324.          {
  325.             const GLuint p = cap - GL_CLIP_DISTANCE0;
  326.  
  327.             if (p >= ctx->Const.MaxClipPlanes)
  328.                goto invalid_enum_error;
  329.  
  330.             if ((ctx->Transform.ClipPlanesEnabled & (1 << p))
  331.                 == ((GLuint) state << p))
  332.                return;
  333.  
  334.             FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
  335.  
  336.             if (state) {
  337.                ctx->Transform.ClipPlanesEnabled |= (1 << p);
  338.                _mesa_update_clip_plane(ctx, p);
  339.             }
  340.             else {
  341.                ctx->Transform.ClipPlanesEnabled &= ~(1 << p);
  342.             }              
  343.          }
  344.          break;
  345.       case GL_COLOR_MATERIAL:
  346.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  347.             goto invalid_enum_error;
  348.          if (ctx->Light.ColorMaterialEnabled == state)
  349.             return;
  350.          FLUSH_VERTICES(ctx, _NEW_LIGHT);
  351.          FLUSH_CURRENT(ctx, 0);
  352.          ctx->Light.ColorMaterialEnabled = state;
  353.          if (state) {
  354.             _mesa_update_color_material( ctx,
  355.                                   ctx->Current.Attrib[VERT_ATTRIB_COLOR0] );
  356.          }
  357.          break;
  358.       case GL_CULL_FACE:
  359.          if (ctx->Polygon.CullFlag == state)
  360.             return;
  361.          FLUSH_VERTICES(ctx, _NEW_POLYGON);
  362.          ctx->Polygon.CullFlag = state;
  363.          break;
  364.       case GL_DEPTH_TEST:
  365.          if (ctx->Depth.Test == state)
  366.             return;
  367.          FLUSH_VERTICES(ctx, _NEW_DEPTH);
  368.          ctx->Depth.Test = state;
  369.          break;
  370.       case GL_DEBUG_OUTPUT:
  371.       case GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB:
  372.          if (!_mesa_is_desktop_gl(ctx))
  373.             goto invalid_enum_error;
  374.          else
  375.             _mesa_set_debug_state_int(ctx, cap, state);
  376.          break;
  377.       case GL_DITHER:
  378.          if (ctx->Color.DitherFlag == state)
  379.             return;
  380.          FLUSH_VERTICES(ctx, _NEW_COLOR);
  381.          ctx->Color.DitherFlag = state;
  382.          break;
  383.       case GL_FOG:
  384.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  385.             goto invalid_enum_error;
  386.          if (ctx->Fog.Enabled == state)
  387.             return;
  388.          FLUSH_VERTICES(ctx, _NEW_FOG);
  389.          ctx->Fog.Enabled = state;
  390.          break;
  391.       case GL_LIGHT0:
  392.       case GL_LIGHT1:
  393.       case GL_LIGHT2:
  394.       case GL_LIGHT3:
  395.       case GL_LIGHT4:
  396.       case GL_LIGHT5:
  397.       case GL_LIGHT6:
  398.       case GL_LIGHT7:
  399.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  400.             goto invalid_enum_error;
  401.          if (ctx->Light.Light[cap-GL_LIGHT0].Enabled == state)
  402.             return;
  403.          FLUSH_VERTICES(ctx, _NEW_LIGHT);
  404.          ctx->Light.Light[cap-GL_LIGHT0].Enabled = state;
  405.          if (state) {
  406.             insert_at_tail(&ctx->Light.EnabledList,
  407.                            &ctx->Light.Light[cap-GL_LIGHT0]);
  408.          }
  409.          else {
  410.             remove_from_list(&ctx->Light.Light[cap-GL_LIGHT0]);
  411.          }
  412.          break;
  413.       case GL_LIGHTING:
  414.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  415.             goto invalid_enum_error;
  416.          if (ctx->Light.Enabled == state)
  417.             return;
  418.          FLUSH_VERTICES(ctx, _NEW_LIGHT);
  419.          ctx->Light.Enabled = state;
  420.          break;
  421.       case GL_LINE_SMOOTH:
  422.          if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
  423.             goto invalid_enum_error;
  424.          if (ctx->Line.SmoothFlag == state)
  425.             return;
  426.          FLUSH_VERTICES(ctx, _NEW_LINE);
  427.          ctx->Line.SmoothFlag = state;
  428.          break;
  429.       case GL_LINE_STIPPLE:
  430.          if (ctx->API != API_OPENGL_COMPAT)
  431.             goto invalid_enum_error;
  432.          if (ctx->Line.StippleFlag == state)
  433.             return;
  434.          FLUSH_VERTICES(ctx, _NEW_LINE);
  435.          ctx->Line.StippleFlag = state;
  436.          break;
  437.       case GL_INDEX_LOGIC_OP:
  438.          if (ctx->API != API_OPENGL_COMPAT)
  439.             goto invalid_enum_error;
  440.          if (ctx->Color.IndexLogicOpEnabled == state)
  441.             return;
  442.          FLUSH_VERTICES(ctx, _NEW_COLOR);
  443.          ctx->Color.IndexLogicOpEnabled = state;
  444.          break;
  445.       case GL_COLOR_LOGIC_OP:
  446.          if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
  447.             goto invalid_enum_error;
  448.          if (ctx->Color.ColorLogicOpEnabled == state)
  449.             return;
  450.          FLUSH_VERTICES(ctx, _NEW_COLOR);
  451.          ctx->Color.ColorLogicOpEnabled = state;
  452.          break;
  453.       case GL_MAP1_COLOR_4:
  454.          if (ctx->API != API_OPENGL_COMPAT)
  455.             goto invalid_enum_error;
  456.          if (ctx->Eval.Map1Color4 == state)
  457.             return;
  458.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  459.          ctx->Eval.Map1Color4 = state;
  460.          break;
  461.       case GL_MAP1_INDEX:
  462.          if (ctx->API != API_OPENGL_COMPAT)
  463.             goto invalid_enum_error;
  464.          if (ctx->Eval.Map1Index == state)
  465.             return;
  466.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  467.          ctx->Eval.Map1Index = state;
  468.          break;
  469.       case GL_MAP1_NORMAL:
  470.          if (ctx->API != API_OPENGL_COMPAT)
  471.             goto invalid_enum_error;
  472.          if (ctx->Eval.Map1Normal == state)
  473.             return;
  474.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  475.          ctx->Eval.Map1Normal = state;
  476.          break;
  477.       case GL_MAP1_TEXTURE_COORD_1:
  478.          if (ctx->API != API_OPENGL_COMPAT)
  479.             goto invalid_enum_error;
  480.          if (ctx->Eval.Map1TextureCoord1 == state)
  481.             return;
  482.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  483.          ctx->Eval.Map1TextureCoord1 = state;
  484.          break;
  485.       case GL_MAP1_TEXTURE_COORD_2:
  486.          if (ctx->API != API_OPENGL_COMPAT)
  487.             goto invalid_enum_error;
  488.          if (ctx->Eval.Map1TextureCoord2 == state)
  489.             return;
  490.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  491.          ctx->Eval.Map1TextureCoord2 = state;
  492.          break;
  493.       case GL_MAP1_TEXTURE_COORD_3:
  494.          if (ctx->API != API_OPENGL_COMPAT)
  495.             goto invalid_enum_error;
  496.          if (ctx->Eval.Map1TextureCoord3 == state)
  497.             return;
  498.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  499.          ctx->Eval.Map1TextureCoord3 = state;
  500.          break;
  501.       case GL_MAP1_TEXTURE_COORD_4:
  502.          if (ctx->API != API_OPENGL_COMPAT)
  503.             goto invalid_enum_error;
  504.          if (ctx->Eval.Map1TextureCoord4 == state)
  505.             return;
  506.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  507.          ctx->Eval.Map1TextureCoord4 = state;
  508.          break;
  509.       case GL_MAP1_VERTEX_3:
  510.          if (ctx->API != API_OPENGL_COMPAT)
  511.             goto invalid_enum_error;
  512.          if (ctx->Eval.Map1Vertex3 == state)
  513.             return;
  514.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  515.          ctx->Eval.Map1Vertex3 = state;
  516.          break;
  517.       case GL_MAP1_VERTEX_4:
  518.          if (ctx->API != API_OPENGL_COMPAT)
  519.             goto invalid_enum_error;
  520.          if (ctx->Eval.Map1Vertex4 == state)
  521.             return;
  522.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  523.          ctx->Eval.Map1Vertex4 = state;
  524.          break;
  525.       case GL_MAP2_COLOR_4:
  526.          if (ctx->API != API_OPENGL_COMPAT)
  527.             goto invalid_enum_error;
  528.          if (ctx->Eval.Map2Color4 == state)
  529.             return;
  530.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  531.          ctx->Eval.Map2Color4 = state;
  532.          break;
  533.       case GL_MAP2_INDEX:
  534.          if (ctx->API != API_OPENGL_COMPAT)
  535.             goto invalid_enum_error;
  536.          if (ctx->Eval.Map2Index == state)
  537.             return;
  538.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  539.          ctx->Eval.Map2Index = state;
  540.          break;
  541.       case GL_MAP2_NORMAL:
  542.          if (ctx->API != API_OPENGL_COMPAT)
  543.             goto invalid_enum_error;
  544.          if (ctx->Eval.Map2Normal == state)
  545.             return;
  546.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  547.          ctx->Eval.Map2Normal = state;
  548.          break;
  549.       case GL_MAP2_TEXTURE_COORD_1:
  550.          if (ctx->API != API_OPENGL_COMPAT)
  551.             goto invalid_enum_error;
  552.          if (ctx->Eval.Map2TextureCoord1 == state)
  553.             return;
  554.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  555.          ctx->Eval.Map2TextureCoord1 = state;
  556.          break;
  557.       case GL_MAP2_TEXTURE_COORD_2:
  558.          if (ctx->API != API_OPENGL_COMPAT)
  559.             goto invalid_enum_error;
  560.          if (ctx->Eval.Map2TextureCoord2 == state)
  561.             return;
  562.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  563.          ctx->Eval.Map2TextureCoord2 = state;
  564.          break;
  565.       case GL_MAP2_TEXTURE_COORD_3:
  566.          if (ctx->API != API_OPENGL_COMPAT)
  567.             goto invalid_enum_error;
  568.          if (ctx->Eval.Map2TextureCoord3 == state)
  569.             return;
  570.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  571.          ctx->Eval.Map2TextureCoord3 = state;
  572.          break;
  573.       case GL_MAP2_TEXTURE_COORD_4:
  574.          if (ctx->API != API_OPENGL_COMPAT)
  575.             goto invalid_enum_error;
  576.          if (ctx->Eval.Map2TextureCoord4 == state)
  577.             return;
  578.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  579.          ctx->Eval.Map2TextureCoord4 = state;
  580.          break;
  581.       case GL_MAP2_VERTEX_3:
  582.          if (ctx->API != API_OPENGL_COMPAT)
  583.             goto invalid_enum_error;
  584.          if (ctx->Eval.Map2Vertex3 == state)
  585.             return;
  586.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  587.          ctx->Eval.Map2Vertex3 = state;
  588.          break;
  589.       case GL_MAP2_VERTEX_4:
  590.          if (ctx->API != API_OPENGL_COMPAT)
  591.             goto invalid_enum_error;
  592.          if (ctx->Eval.Map2Vertex4 == state)
  593.             return;
  594.          FLUSH_VERTICES(ctx, _NEW_EVAL);
  595.          ctx->Eval.Map2Vertex4 = state;
  596.          break;
  597.       case GL_NORMALIZE:
  598.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  599.             goto invalid_enum_error;
  600.          if (ctx->Transform.Normalize == state)
  601.             return;
  602.          FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
  603.          ctx->Transform.Normalize = state;
  604.          break;
  605.       case GL_POINT_SMOOTH:
  606.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  607.             goto invalid_enum_error;
  608.          if (ctx->Point.SmoothFlag == state)
  609.             return;
  610.          FLUSH_VERTICES(ctx, _NEW_POINT);
  611.          ctx->Point.SmoothFlag = state;
  612.          break;
  613.       case GL_POLYGON_SMOOTH:
  614.          if (!_mesa_is_desktop_gl(ctx))
  615.             goto invalid_enum_error;
  616.          if (ctx->Polygon.SmoothFlag == state)
  617.             return;
  618.          FLUSH_VERTICES(ctx, _NEW_POLYGON);
  619.          ctx->Polygon.SmoothFlag = state;
  620.          break;
  621.       case GL_POLYGON_STIPPLE:
  622.          if (ctx->API != API_OPENGL_COMPAT)
  623.             goto invalid_enum_error;
  624.          if (ctx->Polygon.StippleFlag == state)
  625.             return;
  626.          FLUSH_VERTICES(ctx, _NEW_POLYGON);
  627.          ctx->Polygon.StippleFlag = state;
  628.          break;
  629.       case GL_POLYGON_OFFSET_POINT:
  630.          if (!_mesa_is_desktop_gl(ctx))
  631.             goto invalid_enum_error;
  632.          if (ctx->Polygon.OffsetPoint == state)
  633.             return;
  634.          FLUSH_VERTICES(ctx, _NEW_POLYGON);
  635.          ctx->Polygon.OffsetPoint = state;
  636.          break;
  637.       case GL_POLYGON_OFFSET_LINE:
  638.          if (!_mesa_is_desktop_gl(ctx))
  639.             goto invalid_enum_error;
  640.          if (ctx->Polygon.OffsetLine == state)
  641.             return;
  642.          FLUSH_VERTICES(ctx, _NEW_POLYGON);
  643.          ctx->Polygon.OffsetLine = state;
  644.          break;
  645.       case GL_POLYGON_OFFSET_FILL:
  646.          if (ctx->Polygon.OffsetFill == state)
  647.             return;
  648.          FLUSH_VERTICES(ctx, _NEW_POLYGON);
  649.          ctx->Polygon.OffsetFill = state;
  650.          break;
  651.       case GL_RESCALE_NORMAL_EXT:
  652.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  653.             goto invalid_enum_error;
  654.          if (ctx->Transform.RescaleNormals == state)
  655.             return;
  656.          FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
  657.          ctx->Transform.RescaleNormals = state;
  658.          break;
  659.       case GL_SCISSOR_TEST:
  660.          {
  661.             /* Must expand glEnable to all scissors */
  662.             GLbitfield newEnabled =
  663.                state * ((1 << ctx->Const.MaxViewports) - 1);
  664.             if (newEnabled != ctx->Scissor.EnableFlags) {
  665.                FLUSH_VERTICES(ctx, _NEW_SCISSOR);
  666.                ctx->Scissor.EnableFlags = newEnabled;
  667.             }
  668.          }
  669.          break;
  670.       case GL_STENCIL_TEST:
  671.          if (ctx->Stencil.Enabled == state)
  672.             return;
  673.          FLUSH_VERTICES(ctx, _NEW_STENCIL);
  674.          ctx->Stencil.Enabled = state;
  675.          break;
  676.       case GL_TEXTURE_1D:
  677.          if (ctx->API != API_OPENGL_COMPAT)
  678.             goto invalid_enum_error;
  679.          if (!enable_texture(ctx, state, TEXTURE_1D_BIT)) {
  680.             return;
  681.          }
  682.          break;
  683.       case GL_TEXTURE_2D:
  684.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  685.             goto invalid_enum_error;
  686.          if (!enable_texture(ctx, state, TEXTURE_2D_BIT)) {
  687.             return;
  688.          }
  689.          break;
  690.       case GL_TEXTURE_3D:
  691.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  692.             goto invalid_enum_error;
  693.          if (!enable_texture(ctx, state, TEXTURE_3D_BIT)) {
  694.             return;
  695.          }
  696.          break;
  697.       case GL_TEXTURE_GEN_S:
  698.       case GL_TEXTURE_GEN_T:
  699.       case GL_TEXTURE_GEN_R:
  700.       case GL_TEXTURE_GEN_Q:
  701.          {
  702.             struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
  703.  
  704.             if (ctx->API != API_OPENGL_COMPAT)
  705.                goto invalid_enum_error;
  706.  
  707.             if (texUnit) {
  708.                GLbitfield coordBit = S_BIT << (cap - GL_TEXTURE_GEN_S);
  709.                GLbitfield newenabled = texUnit->TexGenEnabled & ~coordBit;
  710.                if (state)
  711.                   newenabled |= coordBit;
  712.                if (texUnit->TexGenEnabled == newenabled)
  713.                   return;
  714.                FLUSH_VERTICES(ctx, _NEW_TEXTURE);
  715.                texUnit->TexGenEnabled = newenabled;
  716.             }
  717.          }
  718.          break;
  719.  
  720.       case GL_TEXTURE_GEN_STR_OES:
  721.          /* disable S, T, and R at the same time */
  722.          {
  723.             struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
  724.  
  725.             if (ctx->API != API_OPENGLES)
  726.                goto invalid_enum_error;
  727.  
  728.             if (texUnit) {
  729.                GLuint newenabled =
  730.                   texUnit->TexGenEnabled & ~STR_BITS;
  731.                if (state)
  732.                   newenabled |= STR_BITS;
  733.                if (texUnit->TexGenEnabled == newenabled)
  734.                   return;
  735.                FLUSH_VERTICES(ctx, _NEW_TEXTURE);
  736.                texUnit->TexGenEnabled = newenabled;
  737.             }
  738.          }
  739.          break;
  740.  
  741.       /* client-side state */
  742.       case GL_VERTEX_ARRAY:
  743.       case GL_NORMAL_ARRAY:
  744.       case GL_COLOR_ARRAY:
  745.       case GL_INDEX_ARRAY:
  746.       case GL_TEXTURE_COORD_ARRAY:
  747.       case GL_EDGE_FLAG_ARRAY:
  748.       case GL_FOG_COORDINATE_ARRAY_EXT:
  749.       case GL_SECONDARY_COLOR_ARRAY_EXT:
  750.       case GL_POINT_SIZE_ARRAY_OES:
  751.          client_state( ctx, cap, state );
  752.          return;
  753.  
  754.       /* GL_ARB_texture_cube_map */
  755.       case GL_TEXTURE_CUBE_MAP_ARB:
  756.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  757.             goto invalid_enum_error;
  758.          CHECK_EXTENSION(ARB_texture_cube_map, cap);
  759.          if (!enable_texture(ctx, state, TEXTURE_CUBE_BIT)) {
  760.             return;
  761.          }
  762.          break;
  763.  
  764.       /* GL_EXT_secondary_color */
  765.       case GL_COLOR_SUM_EXT:
  766.          if (ctx->API != API_OPENGL_COMPAT)
  767.             goto invalid_enum_error;
  768.          if (ctx->Fog.ColorSumEnabled == state)
  769.             return;
  770.          FLUSH_VERTICES(ctx, _NEW_FOG);
  771.          ctx->Fog.ColorSumEnabled = state;
  772.          break;
  773.  
  774.       /* GL_ARB_multisample */
  775.       case GL_MULTISAMPLE_ARB:
  776.          if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
  777.             goto invalid_enum_error;
  778.          _mesa_set_multisample(ctx, state);
  779.          return;
  780.       case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:
  781.          if (ctx->Multisample.SampleAlphaToCoverage == state)
  782.             return;
  783.          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
  784.          ctx->Multisample.SampleAlphaToCoverage = state;
  785.          break;
  786.       case GL_SAMPLE_ALPHA_TO_ONE_ARB:
  787.          if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
  788.             goto invalid_enum_error;
  789.          if (ctx->Multisample.SampleAlphaToOne == state)
  790.             return;
  791.          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
  792.          ctx->Multisample.SampleAlphaToOne = state;
  793.          break;
  794.       case GL_SAMPLE_COVERAGE_ARB:
  795.          if (ctx->Multisample.SampleCoverage == state)
  796.             return;
  797.          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
  798.          ctx->Multisample.SampleCoverage = state;
  799.          break;
  800.       case GL_SAMPLE_COVERAGE_INVERT_ARB:
  801.          if (!_mesa_is_desktop_gl(ctx))
  802.             goto invalid_enum_error;
  803.          if (ctx->Multisample.SampleCoverageInvert == state)
  804.             return;
  805.          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
  806.          ctx->Multisample.SampleCoverageInvert = state;
  807.          break;
  808.  
  809.       /* GL_ARB_sample_shading */
  810.       case GL_SAMPLE_SHADING:
  811.          if (!_mesa_is_desktop_gl(ctx))
  812.             goto invalid_enum_error;
  813.          CHECK_EXTENSION(ARB_sample_shading, cap);
  814.          if (ctx->Multisample.SampleShading == state)
  815.             return;
  816.          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
  817.          ctx->Multisample.SampleShading = state;
  818.          break;
  819.  
  820.       /* GL_IBM_rasterpos_clip */
  821.       case GL_RASTER_POSITION_UNCLIPPED_IBM:
  822.          if (ctx->API != API_OPENGL_COMPAT)
  823.             goto invalid_enum_error;
  824.          if (ctx->Transform.RasterPositionUnclipped == state)
  825.             return;
  826.          FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
  827.          ctx->Transform.RasterPositionUnclipped = state;
  828.          break;
  829.  
  830.       /* GL_NV_point_sprite */
  831.       case GL_POINT_SPRITE_NV:
  832.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  833.             goto invalid_enum_error;
  834.          CHECK_EXTENSION2(NV_point_sprite, ARB_point_sprite, cap);
  835.          if (ctx->Point.PointSprite == state)
  836.             return;
  837.          FLUSH_VERTICES(ctx, _NEW_POINT);
  838.          ctx->Point.PointSprite = state;
  839.          break;
  840.  
  841.       case GL_VERTEX_PROGRAM_ARB:
  842.          if (ctx->API != API_OPENGL_COMPAT)
  843.             goto invalid_enum_error;
  844.          CHECK_EXTENSION(ARB_vertex_program, cap);
  845.          if (ctx->VertexProgram.Enabled == state)
  846.             return;
  847.          FLUSH_VERTICES(ctx, _NEW_PROGRAM);
  848.          ctx->VertexProgram.Enabled = state;
  849.          break;
  850.       case GL_VERTEX_PROGRAM_POINT_SIZE_ARB:
  851.          /* This was added with ARB_vertex_program, but it is also used with
  852.           * GLSL vertex shaders on desktop.
  853.           */
  854.          if (!_mesa_is_desktop_gl(ctx))
  855.             goto invalid_enum_error;
  856.          CHECK_EXTENSION(ARB_vertex_program, cap);
  857.          if (ctx->VertexProgram.PointSizeEnabled == state)
  858.             return;
  859.          FLUSH_VERTICES(ctx, _NEW_PROGRAM);
  860.          ctx->VertexProgram.PointSizeEnabled = state;
  861.          break;
  862.       case GL_VERTEX_PROGRAM_TWO_SIDE_ARB:
  863.          if (ctx->API != API_OPENGL_COMPAT)
  864.             goto invalid_enum_error;
  865.          CHECK_EXTENSION(ARB_vertex_program, cap);
  866.          if (ctx->VertexProgram.TwoSideEnabled == state)
  867.             return;
  868.          FLUSH_VERTICES(ctx, _NEW_PROGRAM);
  869.          ctx->VertexProgram.TwoSideEnabled = state;
  870.          break;
  871.  
  872.       /* GL_NV_texture_rectangle */
  873.       case GL_TEXTURE_RECTANGLE_NV:
  874.          if (ctx->API != API_OPENGL_COMPAT)
  875.             goto invalid_enum_error;
  876.          CHECK_EXTENSION(NV_texture_rectangle, cap);
  877.          if (!enable_texture(ctx, state, TEXTURE_RECT_BIT)) {
  878.             return;
  879.          }
  880.          break;
  881.  
  882.       /* GL_EXT_stencil_two_side */
  883.       case GL_STENCIL_TEST_TWO_SIDE_EXT:
  884.          if (ctx->API != API_OPENGL_COMPAT)
  885.             goto invalid_enum_error;
  886.          CHECK_EXTENSION(EXT_stencil_two_side, cap);
  887.          if (ctx->Stencil.TestTwoSide == state)
  888.             return;
  889.          FLUSH_VERTICES(ctx, _NEW_STENCIL);
  890.          ctx->Stencil.TestTwoSide = state;
  891.          if (state) {
  892.             ctx->Stencil._BackFace = 2;
  893.          } else {
  894.             ctx->Stencil._BackFace = 1;
  895.          }
  896.          break;
  897.  
  898.       case GL_FRAGMENT_PROGRAM_ARB:
  899.          if (ctx->API != API_OPENGL_COMPAT)
  900.             goto invalid_enum_error;
  901.          CHECK_EXTENSION(ARB_fragment_program, cap);
  902.          if (ctx->FragmentProgram.Enabled == state)
  903.             return;
  904.          FLUSH_VERTICES(ctx, _NEW_PROGRAM);
  905.          ctx->FragmentProgram.Enabled = state;
  906.          break;
  907.  
  908.       /* GL_EXT_depth_bounds_test */
  909.       case GL_DEPTH_BOUNDS_TEST_EXT:
  910.          if (!_mesa_is_desktop_gl(ctx))
  911.             goto invalid_enum_error;
  912.          CHECK_EXTENSION(EXT_depth_bounds_test, cap);
  913.          if (ctx->Depth.BoundsTest == state)
  914.             return;
  915.          FLUSH_VERTICES(ctx, _NEW_DEPTH);
  916.          ctx->Depth.BoundsTest = state;
  917.          break;
  918.  
  919.       case GL_DEPTH_CLAMP:
  920.          if (!_mesa_is_desktop_gl(ctx))
  921.             goto invalid_enum_error;
  922.          CHECK_EXTENSION(ARB_depth_clamp, cap);
  923.          if (ctx->Transform.DepthClamp == state)
  924.             return;
  925.          FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
  926.          ctx->Transform.DepthClamp = state;
  927.          break;
  928.  
  929.       case GL_FRAGMENT_SHADER_ATI:
  930.          if (ctx->API != API_OPENGL_COMPAT)
  931.             goto invalid_enum_error;
  932.         CHECK_EXTENSION(ATI_fragment_shader, cap);
  933.         if (ctx->ATIFragmentShader.Enabled == state)
  934.           return;
  935.         FLUSH_VERTICES(ctx, _NEW_PROGRAM);
  936.         ctx->ATIFragmentShader.Enabled = state;
  937.         break;
  938.  
  939.       case GL_TEXTURE_CUBE_MAP_SEAMLESS:
  940.          if (!_mesa_is_desktop_gl(ctx))
  941.             goto invalid_enum_error;
  942.          CHECK_EXTENSION(ARB_seamless_cube_map, cap);
  943.          if (ctx->Texture.CubeMapSeamless != state) {
  944.             FLUSH_VERTICES(ctx, _NEW_TEXTURE);
  945.             ctx->Texture.CubeMapSeamless = state;
  946.          }
  947.          break;
  948.  
  949.       case GL_RASTERIZER_DISCARD:
  950.          if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
  951.             goto invalid_enum_error;
  952.          CHECK_EXTENSION(EXT_transform_feedback, cap);
  953.          if (ctx->RasterDiscard != state) {
  954.             FLUSH_VERTICES(ctx, 0);
  955.             ctx->NewDriverState |= ctx->DriverFlags.NewRasterizerDiscard;
  956.             ctx->RasterDiscard = state;
  957.          }
  958.          break;
  959.  
  960.       /* GL 3.1 primitive restart.  Note: this enum is different from
  961.        * GL_PRIMITIVE_RESTART_NV (which is client state).
  962.        */
  963.       case GL_PRIMITIVE_RESTART:
  964.          if (!_mesa_is_desktop_gl(ctx) || ctx->Version < 31) {
  965.             goto invalid_enum_error;
  966.          }
  967.          if (ctx->Array.PrimitiveRestart != state) {
  968.             FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
  969.             ctx->Array.PrimitiveRestart = state;
  970.             update_derived_primitive_restart_state(ctx);
  971.          }
  972.          break;
  973.  
  974.       case GL_PRIMITIVE_RESTART_FIXED_INDEX:
  975.          if (!_mesa_is_gles3(ctx) && !ctx->Extensions.ARB_ES3_compatibility)
  976.             goto invalid_enum_error;
  977.          if (ctx->Array.PrimitiveRestartFixedIndex != state) {
  978.             FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
  979.             ctx->Array.PrimitiveRestartFixedIndex = state;
  980.             update_derived_primitive_restart_state(ctx);
  981.          }
  982.          break;
  983.  
  984.       /* GL3.0 - GL_framebuffer_sRGB */
  985.       case GL_FRAMEBUFFER_SRGB_EXT:
  986.          if (!_mesa_is_desktop_gl(ctx))
  987.             goto invalid_enum_error;
  988.          CHECK_EXTENSION(EXT_framebuffer_sRGB, cap);
  989.          _mesa_set_framebuffer_srgb(ctx, state);
  990.          return;
  991.  
  992.       /* GL_OES_EGL_image_external */
  993.       case GL_TEXTURE_EXTERNAL_OES:
  994.          if (!_mesa_is_gles(ctx))
  995.             goto invalid_enum_error;
  996.          CHECK_EXTENSION(OES_EGL_image_external, cap);
  997.          if (!enable_texture(ctx, state, TEXTURE_EXTERNAL_BIT)) {
  998.             return;
  999.          }
  1000.          break;
  1001.  
  1002.       /* ARB_texture_multisample */
  1003.       case GL_SAMPLE_MASK:
  1004.          if (!_mesa_is_desktop_gl(ctx))
  1005.             goto invalid_enum_error;
  1006.          CHECK_EXTENSION(ARB_texture_multisample, cap);
  1007.          if (ctx->Multisample.SampleMask == state)
  1008.             return;
  1009.          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
  1010.          ctx->Multisample.SampleMask = state;
  1011.          break;
  1012.  
  1013.       default:
  1014.          goto invalid_enum_error;
  1015.    }
  1016.  
  1017.    if (ctx->Driver.Enable) {
  1018.       ctx->Driver.Enable( ctx, cap, state );
  1019.    }
  1020.  
  1021.    return;
  1022.  
  1023. invalid_enum_error:
  1024.    _mesa_error(ctx, GL_INVALID_ENUM, "gl%s(%s)",
  1025.                state ? "Enable" : "Disable", _mesa_lookup_enum_by_nr(cap));
  1026. }
  1027.  
  1028.  
  1029. /**
  1030.  * Enable GL capability.  Called by glEnable()
  1031.  * \param cap  state to enable.
  1032.  */
  1033. void GLAPIENTRY
  1034. _mesa_Enable( GLenum cap )
  1035. {
  1036.    GET_CURRENT_CONTEXT(ctx);
  1037.  
  1038.    _mesa_set_enable( ctx, cap, GL_TRUE );
  1039. }
  1040.  
  1041.  
  1042. /**
  1043.  * Disable GL capability.  Called by glDisable()
  1044.  * \param cap  state to disable.
  1045.  */
  1046. void GLAPIENTRY
  1047. _mesa_Disable( GLenum cap )
  1048. {
  1049.    GET_CURRENT_CONTEXT(ctx);
  1050.  
  1051.    _mesa_set_enable( ctx, cap, GL_FALSE );
  1052. }
  1053.  
  1054.  
  1055.  
  1056. /**
  1057.  * Enable/disable an indexed state var.
  1058.  */
  1059. void
  1060. _mesa_set_enablei(struct gl_context *ctx, GLenum cap,
  1061.                   GLuint index, GLboolean state)
  1062. {
  1063.    assert(state == 0 || state == 1);
  1064.    switch (cap) {
  1065.    case GL_BLEND:
  1066.       if (!ctx->Extensions.EXT_draw_buffers2) {
  1067.          goto invalid_enum_error;
  1068.       }
  1069.       if (index >= ctx->Const.MaxDrawBuffers) {
  1070.          _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)",
  1071.                      state ? "glEnableIndexed" : "glDisableIndexed", index);
  1072.          return;
  1073.       }
  1074.       if (((ctx->Color.BlendEnabled >> index) & 1) != state) {
  1075.          FLUSH_VERTICES(ctx, _NEW_COLOR);
  1076.          if (state)
  1077.             ctx->Color.BlendEnabled |= (1 << index);
  1078.          else
  1079.             ctx->Color.BlendEnabled &= ~(1 << index);
  1080.       }
  1081.       break;
  1082.    case GL_SCISSOR_TEST:
  1083.       if (index >= ctx->Const.MaxViewports) {
  1084.          _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)",
  1085.                      state ? "glEnablei" : "glDisablei", index);
  1086.          return;
  1087.       }
  1088.       if (((ctx->Scissor.EnableFlags >> index) & 1) != state) {
  1089.          FLUSH_VERTICES(ctx, _NEW_SCISSOR);
  1090.          if (state)
  1091.             ctx->Scissor.EnableFlags |= (1 << index);
  1092.          else
  1093.             ctx->Scissor.EnableFlags &= ~(1 << index);
  1094.       }
  1095.       break;
  1096.    default:
  1097.       goto invalid_enum_error;
  1098.    }
  1099.    return;
  1100.  
  1101. invalid_enum_error:
  1102.     _mesa_error(ctx, GL_INVALID_ENUM, "%s(cap=%s)",
  1103.                 state ? "glEnablei" : "glDisablei",
  1104.                 _mesa_lookup_enum_by_nr(cap));
  1105. }
  1106.  
  1107.  
  1108. void GLAPIENTRY
  1109. _mesa_Disablei( GLenum cap, GLuint index )
  1110. {
  1111.    GET_CURRENT_CONTEXT(ctx);
  1112.    _mesa_set_enablei(ctx, cap, index, GL_FALSE);
  1113. }
  1114.  
  1115.  
  1116. void GLAPIENTRY
  1117. _mesa_Enablei( GLenum cap, GLuint index )
  1118. {
  1119.    GET_CURRENT_CONTEXT(ctx);
  1120.    _mesa_set_enablei(ctx, cap, index, GL_TRUE);
  1121. }
  1122.  
  1123.  
  1124. GLboolean GLAPIENTRY
  1125. _mesa_IsEnabledi( GLenum cap, GLuint index )
  1126. {
  1127.    GET_CURRENT_CONTEXT(ctx);
  1128.    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
  1129.    switch (cap) {
  1130.    case GL_BLEND:
  1131.       if (index >= ctx->Const.MaxDrawBuffers) {
  1132.          _mesa_error(ctx, GL_INVALID_VALUE, "glIsEnabledIndexed(index=%u)",
  1133.                      index);
  1134.          return GL_FALSE;
  1135.       }
  1136.       return (ctx->Color.BlendEnabled >> index) & 1;
  1137.    case GL_SCISSOR_TEST:
  1138.       if (index >= ctx->Const.MaxViewports) {
  1139.          _mesa_error(ctx, GL_INVALID_VALUE, "glIsEnabledIndexed(index=%u)",
  1140.                      index);
  1141.          return GL_FALSE;
  1142.       }
  1143.       return (ctx->Scissor.EnableFlags >> index) & 1;
  1144.    default:
  1145.       _mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabledIndexed(cap=%s)",
  1146.                   _mesa_lookup_enum_by_nr(cap));
  1147.       return GL_FALSE;
  1148.    }
  1149. }
  1150.  
  1151.  
  1152.  
  1153.  
  1154. #undef CHECK_EXTENSION
  1155. #define CHECK_EXTENSION(EXTNAME)                        \
  1156.    if (!ctx->Extensions.EXTNAME) {                      \
  1157.       goto invalid_enum_error;                          \
  1158.    }
  1159.  
  1160. #undef CHECK_EXTENSION2
  1161. #define CHECK_EXTENSION2(EXT1, EXT2)                            \
  1162.    if (!ctx->Extensions.EXT1 && !ctx->Extensions.EXT2) {        \
  1163.       goto invalid_enum_error;                                  \
  1164.    }
  1165.  
  1166.  
  1167. /**
  1168.  * Helper function to determine whether a texture target is enabled.
  1169.  */
  1170. static GLboolean
  1171. is_texture_enabled(struct gl_context *ctx, GLbitfield bit)
  1172. {
  1173.    const struct gl_texture_unit *const texUnit =
  1174.        &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
  1175.    return (texUnit->Enabled & bit) ? GL_TRUE : GL_FALSE;
  1176. }
  1177.  
  1178.  
  1179. /**
  1180.  * Return simple enable/disable state.
  1181.  *
  1182.  * \param cap  state variable to query.
  1183.  *
  1184.  * Returns the state of the specified capability from the current GL context.
  1185.  * For the capabilities associated with extensions verifies that those
  1186.  * extensions are effectively present before reporting.
  1187.  */
  1188. GLboolean GLAPIENTRY
  1189. _mesa_IsEnabled( GLenum cap )
  1190. {
  1191.    GET_CURRENT_CONTEXT(ctx);
  1192.    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
  1193.  
  1194.    switch (cap) {
  1195.       case GL_ALPHA_TEST:
  1196.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1197.             goto invalid_enum_error;
  1198.          return ctx->Color.AlphaEnabled;
  1199.       case GL_AUTO_NORMAL:
  1200.          if (ctx->API != API_OPENGL_COMPAT)
  1201.             goto invalid_enum_error;
  1202.          return ctx->Eval.AutoNormal;
  1203.       case GL_BLEND:
  1204.          return ctx->Color.BlendEnabled & 1;  /* return state for buffer[0] */
  1205.       case GL_CLIP_DISTANCE0: /* aka GL_CLIP_PLANE0 */
  1206.       case GL_CLIP_DISTANCE1:
  1207.       case GL_CLIP_DISTANCE2:
  1208.       case GL_CLIP_DISTANCE3:
  1209.       case GL_CLIP_DISTANCE4:
  1210.       case GL_CLIP_DISTANCE5:
  1211.       case GL_CLIP_DISTANCE6:
  1212.       case GL_CLIP_DISTANCE7: {
  1213.          const GLuint p = cap - GL_CLIP_DISTANCE0;
  1214.  
  1215.          if (p >= ctx->Const.MaxClipPlanes)
  1216.             goto invalid_enum_error;
  1217.  
  1218.          return (ctx->Transform.ClipPlanesEnabled >> p) & 1;
  1219.       }
  1220.       case GL_COLOR_MATERIAL:
  1221.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1222.             goto invalid_enum_error;
  1223.          return ctx->Light.ColorMaterialEnabled;
  1224.       case GL_CULL_FACE:
  1225.          return ctx->Polygon.CullFlag;
  1226.       case GL_DEBUG_OUTPUT:
  1227.       case GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB:
  1228.          if (!_mesa_is_desktop_gl(ctx))
  1229.             goto invalid_enum_error;
  1230.          else
  1231.             return (GLboolean) _mesa_get_debug_state_int(ctx, cap);
  1232.       case GL_DEPTH_TEST:
  1233.          return ctx->Depth.Test;
  1234.       case GL_DITHER:
  1235.          return ctx->Color.DitherFlag;
  1236.       case GL_FOG:
  1237.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1238.             goto invalid_enum_error;
  1239.          return ctx->Fog.Enabled;
  1240.       case GL_LIGHTING:
  1241.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1242.             goto invalid_enum_error;
  1243.          return ctx->Light.Enabled;
  1244.       case GL_LIGHT0:
  1245.       case GL_LIGHT1:
  1246.       case GL_LIGHT2:
  1247.       case GL_LIGHT3:
  1248.       case GL_LIGHT4:
  1249.       case GL_LIGHT5:
  1250.       case GL_LIGHT6:
  1251.       case GL_LIGHT7:
  1252.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1253.             goto invalid_enum_error;
  1254.          return ctx->Light.Light[cap-GL_LIGHT0].Enabled;
  1255.       case GL_LINE_SMOOTH:
  1256.          if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
  1257.             goto invalid_enum_error;
  1258.          return ctx->Line.SmoothFlag;
  1259.       case GL_LINE_STIPPLE:
  1260.          if (ctx->API != API_OPENGL_COMPAT)
  1261.             goto invalid_enum_error;
  1262.          return ctx->Line.StippleFlag;
  1263.       case GL_INDEX_LOGIC_OP:
  1264.          if (ctx->API != API_OPENGL_COMPAT)
  1265.             goto invalid_enum_error;
  1266.          return ctx->Color.IndexLogicOpEnabled;
  1267.       case GL_COLOR_LOGIC_OP:
  1268.          if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
  1269.             goto invalid_enum_error;
  1270.          return ctx->Color.ColorLogicOpEnabled;
  1271.       case GL_MAP1_COLOR_4:
  1272.          if (ctx->API != API_OPENGL_COMPAT)
  1273.             goto invalid_enum_error;
  1274.          return ctx->Eval.Map1Color4;
  1275.       case GL_MAP1_INDEX:
  1276.          if (ctx->API != API_OPENGL_COMPAT)
  1277.             goto invalid_enum_error;
  1278.          return ctx->Eval.Map1Index;
  1279.       case GL_MAP1_NORMAL:
  1280.          if (ctx->API != API_OPENGL_COMPAT)
  1281.             goto invalid_enum_error;
  1282.          return ctx->Eval.Map1Normal;
  1283.       case GL_MAP1_TEXTURE_COORD_1:
  1284.          if (ctx->API != API_OPENGL_COMPAT)
  1285.             goto invalid_enum_error;
  1286.          return ctx->Eval.Map1TextureCoord1;
  1287.       case GL_MAP1_TEXTURE_COORD_2:
  1288.          if (ctx->API != API_OPENGL_COMPAT)
  1289.             goto invalid_enum_error;
  1290.          return ctx->Eval.Map1TextureCoord2;
  1291.       case GL_MAP1_TEXTURE_COORD_3:
  1292.          if (ctx->API != API_OPENGL_COMPAT)
  1293.             goto invalid_enum_error;
  1294.          return ctx->Eval.Map1TextureCoord3;
  1295.       case GL_MAP1_TEXTURE_COORD_4:
  1296.          if (ctx->API != API_OPENGL_COMPAT)
  1297.             goto invalid_enum_error;
  1298.          return ctx->Eval.Map1TextureCoord4;
  1299.       case GL_MAP1_VERTEX_3:
  1300.          if (ctx->API != API_OPENGL_COMPAT)
  1301.             goto invalid_enum_error;
  1302.          return ctx->Eval.Map1Vertex3;
  1303.       case GL_MAP1_VERTEX_4:
  1304.          if (ctx->API != API_OPENGL_COMPAT)
  1305.             goto invalid_enum_error;
  1306.          return ctx->Eval.Map1Vertex4;
  1307.       case GL_MAP2_COLOR_4:
  1308.          if (ctx->API != API_OPENGL_COMPAT)
  1309.             goto invalid_enum_error;
  1310.          return ctx->Eval.Map2Color4;
  1311.       case GL_MAP2_INDEX:
  1312.          if (ctx->API != API_OPENGL_COMPAT)
  1313.             goto invalid_enum_error;
  1314.          return ctx->Eval.Map2Index;
  1315.       case GL_MAP2_NORMAL:
  1316.          if (ctx->API != API_OPENGL_COMPAT)
  1317.             goto invalid_enum_error;
  1318.          return ctx->Eval.Map2Normal;
  1319.       case GL_MAP2_TEXTURE_COORD_1:
  1320.          if (ctx->API != API_OPENGL_COMPAT)
  1321.             goto invalid_enum_error;
  1322.          return ctx->Eval.Map2TextureCoord1;
  1323.       case GL_MAP2_TEXTURE_COORD_2:
  1324.          if (ctx->API != API_OPENGL_COMPAT)
  1325.             goto invalid_enum_error;
  1326.          return ctx->Eval.Map2TextureCoord2;
  1327.       case GL_MAP2_TEXTURE_COORD_3:
  1328.          if (ctx->API != API_OPENGL_COMPAT)
  1329.             goto invalid_enum_error;
  1330.          return ctx->Eval.Map2TextureCoord3;
  1331.       case GL_MAP2_TEXTURE_COORD_4:
  1332.          if (ctx->API != API_OPENGL_COMPAT)
  1333.             goto invalid_enum_error;
  1334.          return ctx->Eval.Map2TextureCoord4;
  1335.       case GL_MAP2_VERTEX_3:
  1336.          if (ctx->API != API_OPENGL_COMPAT)
  1337.             goto invalid_enum_error;
  1338.          return ctx->Eval.Map2Vertex3;
  1339.       case GL_MAP2_VERTEX_4:
  1340.          if (ctx->API != API_OPENGL_COMPAT)
  1341.             goto invalid_enum_error;
  1342.          return ctx->Eval.Map2Vertex4;
  1343.       case GL_NORMALIZE:
  1344.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1345.             goto invalid_enum_error;
  1346.          return ctx->Transform.Normalize;
  1347.       case GL_POINT_SMOOTH:
  1348.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1349.             goto invalid_enum_error;
  1350.          return ctx->Point.SmoothFlag;
  1351.       case GL_POLYGON_SMOOTH:
  1352.          if (!_mesa_is_desktop_gl(ctx))
  1353.             goto invalid_enum_error;
  1354.          return ctx->Polygon.SmoothFlag;
  1355.       case GL_POLYGON_STIPPLE:
  1356.          if (ctx->API != API_OPENGL_COMPAT)
  1357.             goto invalid_enum_error;
  1358.          return ctx->Polygon.StippleFlag;
  1359.       case GL_POLYGON_OFFSET_POINT:
  1360.          if (!_mesa_is_desktop_gl(ctx))
  1361.             goto invalid_enum_error;
  1362.          return ctx->Polygon.OffsetPoint;
  1363.       case GL_POLYGON_OFFSET_LINE:
  1364.          if (!_mesa_is_desktop_gl(ctx))
  1365.             goto invalid_enum_error;
  1366.          return ctx->Polygon.OffsetLine;
  1367.       case GL_POLYGON_OFFSET_FILL:
  1368.          return ctx->Polygon.OffsetFill;
  1369.       case GL_RESCALE_NORMAL_EXT:
  1370.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1371.             goto invalid_enum_error;
  1372.          return ctx->Transform.RescaleNormals;
  1373.       case GL_SCISSOR_TEST:
  1374.          return ctx->Scissor.EnableFlags & 1;  /* return state for index 0 */
  1375.       case GL_STENCIL_TEST:
  1376.          return ctx->Stencil.Enabled;
  1377.       case GL_TEXTURE_1D:
  1378.          if (ctx->API != API_OPENGL_COMPAT)
  1379.             goto invalid_enum_error;
  1380.          return is_texture_enabled(ctx, TEXTURE_1D_BIT);
  1381.       case GL_TEXTURE_2D:
  1382.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1383.             goto invalid_enum_error;
  1384.          return is_texture_enabled(ctx, TEXTURE_2D_BIT);
  1385.       case GL_TEXTURE_3D:
  1386.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1387.             goto invalid_enum_error;
  1388.          return is_texture_enabled(ctx, TEXTURE_3D_BIT);
  1389.       case GL_TEXTURE_GEN_S:
  1390.       case GL_TEXTURE_GEN_T:
  1391.       case GL_TEXTURE_GEN_R:
  1392.       case GL_TEXTURE_GEN_Q:
  1393.          {
  1394.             const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
  1395.  
  1396.             if (ctx->API != API_OPENGL_COMPAT)
  1397.                goto invalid_enum_error;
  1398.  
  1399.             if (texUnit) {
  1400.                GLbitfield coordBit = S_BIT << (cap - GL_TEXTURE_GEN_S);
  1401.                return (texUnit->TexGenEnabled & coordBit) ? GL_TRUE : GL_FALSE;
  1402.             }
  1403.          }
  1404.          return GL_FALSE;
  1405.       case GL_TEXTURE_GEN_STR_OES:
  1406.          {
  1407.             const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
  1408.  
  1409.             if (ctx->API != API_OPENGLES)
  1410.                goto invalid_enum_error;
  1411.  
  1412.             if (texUnit) {
  1413.                return (texUnit->TexGenEnabled & STR_BITS) == STR_BITS
  1414.                   ? GL_TRUE : GL_FALSE;
  1415.             }
  1416.          }
  1417.  
  1418.       /* client-side state */
  1419.       case GL_VERTEX_ARRAY:
  1420.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1421.             goto invalid_enum_error;
  1422.          return ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_POS].Enabled;
  1423.       case GL_NORMAL_ARRAY:
  1424.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1425.             goto invalid_enum_error;
  1426.          return ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled;
  1427.       case GL_COLOR_ARRAY:
  1428.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1429.             goto invalid_enum_error;
  1430.          return ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled;
  1431.       case GL_INDEX_ARRAY:
  1432.          if (ctx->API != API_OPENGL_COMPAT)
  1433.             goto invalid_enum_error;
  1434.          return ctx->Array.VAO->
  1435.             VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled;
  1436.       case GL_TEXTURE_COORD_ARRAY:
  1437.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1438.             goto invalid_enum_error;
  1439.          return ctx->Array.VAO->
  1440.             VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].Enabled;
  1441.       case GL_EDGE_FLAG_ARRAY:
  1442.          if (ctx->API != API_OPENGL_COMPAT)
  1443.             goto invalid_enum_error;
  1444.          return ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Enabled;
  1445.       case GL_FOG_COORDINATE_ARRAY_EXT:
  1446.          if (ctx->API != API_OPENGL_COMPAT)
  1447.             goto invalid_enum_error;
  1448.          return ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_FOG].Enabled;
  1449.       case GL_SECONDARY_COLOR_ARRAY_EXT:
  1450.          if (ctx->API != API_OPENGL_COMPAT)
  1451.             goto invalid_enum_error;
  1452.          return ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR1].Enabled;
  1453.       case GL_POINT_SIZE_ARRAY_OES:
  1454.          if (ctx->API != API_OPENGLES)
  1455.             goto invalid_enum_error;
  1456.          return ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_POINT_SIZE].Enabled;
  1457.  
  1458.       /* GL_ARB_texture_cube_map */
  1459.       case GL_TEXTURE_CUBE_MAP_ARB:
  1460.          CHECK_EXTENSION(ARB_texture_cube_map);
  1461.          return is_texture_enabled(ctx, TEXTURE_CUBE_BIT);
  1462.  
  1463.       /* GL_EXT_secondary_color */
  1464.       case GL_COLOR_SUM_EXT:
  1465.          if (ctx->API != API_OPENGL_COMPAT)
  1466.             goto invalid_enum_error;
  1467.          return ctx->Fog.ColorSumEnabled;
  1468.  
  1469.       /* GL_ARB_multisample */
  1470.       case GL_MULTISAMPLE_ARB:
  1471.          if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
  1472.             goto invalid_enum_error;
  1473.          return ctx->Multisample.Enabled;
  1474.       case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:
  1475.          return ctx->Multisample.SampleAlphaToCoverage;
  1476.       case GL_SAMPLE_ALPHA_TO_ONE_ARB:
  1477.          if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
  1478.             goto invalid_enum_error;
  1479.          return ctx->Multisample.SampleAlphaToOne;
  1480.       case GL_SAMPLE_COVERAGE_ARB:
  1481.          return ctx->Multisample.SampleCoverage;
  1482.       case GL_SAMPLE_COVERAGE_INVERT_ARB:
  1483.          if (!_mesa_is_desktop_gl(ctx))
  1484.             goto invalid_enum_error;
  1485.          return ctx->Multisample.SampleCoverageInvert;
  1486.  
  1487.       /* GL_IBM_rasterpos_clip */
  1488.       case GL_RASTER_POSITION_UNCLIPPED_IBM:
  1489.          if (ctx->API != API_OPENGL_COMPAT)
  1490.             goto invalid_enum_error;
  1491.          return ctx->Transform.RasterPositionUnclipped;
  1492.  
  1493.       /* GL_NV_point_sprite */
  1494.       case GL_POINT_SPRITE_NV:
  1495.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  1496.             goto invalid_enum_error;
  1497.          CHECK_EXTENSION2(NV_point_sprite, ARB_point_sprite)
  1498.          return ctx->Point.PointSprite;
  1499.  
  1500.       case GL_VERTEX_PROGRAM_ARB:
  1501.          if (ctx->API != API_OPENGL_COMPAT)
  1502.             goto invalid_enum_error;
  1503.          CHECK_EXTENSION(ARB_vertex_program);
  1504.          return ctx->VertexProgram.Enabled;
  1505.       case GL_VERTEX_PROGRAM_POINT_SIZE_ARB:
  1506.          /* This was added with ARB_vertex_program, but it is also used with
  1507.           * GLSL vertex shaders on desktop.
  1508.           */
  1509.          if (!_mesa_is_desktop_gl(ctx))
  1510.             goto invalid_enum_error;
  1511.          CHECK_EXTENSION(ARB_vertex_program);
  1512.          return ctx->VertexProgram.PointSizeEnabled;
  1513.       case GL_VERTEX_PROGRAM_TWO_SIDE_ARB:
  1514.          if (ctx->API != API_OPENGL_COMPAT)
  1515.             goto invalid_enum_error;
  1516.          CHECK_EXTENSION(ARB_vertex_program);
  1517.          return ctx->VertexProgram.TwoSideEnabled;
  1518.  
  1519.       /* GL_NV_texture_rectangle */
  1520.       case GL_TEXTURE_RECTANGLE_NV:
  1521.          if (ctx->API != API_OPENGL_COMPAT)
  1522.             goto invalid_enum_error;
  1523.          CHECK_EXTENSION(NV_texture_rectangle);
  1524.          return is_texture_enabled(ctx, TEXTURE_RECT_BIT);
  1525.  
  1526.       /* GL_EXT_stencil_two_side */
  1527.       case GL_STENCIL_TEST_TWO_SIDE_EXT:
  1528.          if (ctx->API != API_OPENGL_COMPAT)
  1529.             goto invalid_enum_error;
  1530.          CHECK_EXTENSION(EXT_stencil_two_side);
  1531.          return ctx->Stencil.TestTwoSide;
  1532.  
  1533.       case GL_FRAGMENT_PROGRAM_ARB:
  1534.          if (ctx->API != API_OPENGL_COMPAT)
  1535.             goto invalid_enum_error;
  1536.          return ctx->FragmentProgram.Enabled;
  1537.  
  1538.       /* GL_EXT_depth_bounds_test */
  1539.       case GL_DEPTH_BOUNDS_TEST_EXT:
  1540.          if (!_mesa_is_desktop_gl(ctx))
  1541.             goto invalid_enum_error;
  1542.          CHECK_EXTENSION(EXT_depth_bounds_test);
  1543.          return ctx->Depth.BoundsTest;
  1544.  
  1545.       /* GL_ARB_depth_clamp */
  1546.       case GL_DEPTH_CLAMP:
  1547.          if (!_mesa_is_desktop_gl(ctx))
  1548.             goto invalid_enum_error;
  1549.          CHECK_EXTENSION(ARB_depth_clamp);
  1550.          return ctx->Transform.DepthClamp;
  1551.  
  1552.       case GL_FRAGMENT_SHADER_ATI:
  1553.          if (ctx->API != API_OPENGL_COMPAT)
  1554.             goto invalid_enum_error;
  1555.          CHECK_EXTENSION(ATI_fragment_shader);
  1556.          return ctx->ATIFragmentShader.Enabled;
  1557.  
  1558.       case GL_TEXTURE_CUBE_MAP_SEAMLESS:
  1559.          if (!_mesa_is_desktop_gl(ctx))
  1560.             goto invalid_enum_error;
  1561.          CHECK_EXTENSION(ARB_seamless_cube_map);
  1562.          return ctx->Texture.CubeMapSeamless;
  1563.  
  1564.       case GL_RASTERIZER_DISCARD:
  1565.          if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))
  1566.             goto invalid_enum_error;
  1567.          CHECK_EXTENSION(EXT_transform_feedback);
  1568.          return ctx->RasterDiscard;
  1569.  
  1570.       /* GL_NV_primitive_restart */
  1571.       case GL_PRIMITIVE_RESTART_NV:
  1572.          if (ctx->API != API_OPENGL_COMPAT || !ctx->Extensions.NV_primitive_restart) {
  1573.             goto invalid_enum_error;
  1574.          }
  1575.          return ctx->Array.PrimitiveRestart;
  1576.  
  1577.       /* GL 3.1 primitive restart */
  1578.       case GL_PRIMITIVE_RESTART:
  1579.          if (!_mesa_is_desktop_gl(ctx) || ctx->Version < 31) {
  1580.             goto invalid_enum_error;
  1581.          }
  1582.          return ctx->Array.PrimitiveRestart;
  1583.  
  1584.       case GL_PRIMITIVE_RESTART_FIXED_INDEX:
  1585.          if (!_mesa_is_gles3(ctx) && !ctx->Extensions.ARB_ES3_compatibility) {
  1586.             goto invalid_enum_error;
  1587.          }
  1588.          return ctx->Array.PrimitiveRestartFixedIndex;
  1589.  
  1590.       /* GL3.0 - GL_framebuffer_sRGB */
  1591.       case GL_FRAMEBUFFER_SRGB_EXT:
  1592.          if (!_mesa_is_desktop_gl(ctx))
  1593.             goto invalid_enum_error;
  1594.          CHECK_EXTENSION(EXT_framebuffer_sRGB);
  1595.          return ctx->Color.sRGBEnabled;
  1596.  
  1597.       /* GL_OES_EGL_image_external */
  1598.       case GL_TEXTURE_EXTERNAL_OES:
  1599.          if (!_mesa_is_gles(ctx))
  1600.             goto invalid_enum_error;
  1601.          CHECK_EXTENSION(OES_EGL_image_external);
  1602.          return is_texture_enabled(ctx, TEXTURE_EXTERNAL_BIT);
  1603.  
  1604.       /* ARB_texture_multisample */
  1605.       case GL_SAMPLE_MASK:
  1606.          if (!_mesa_is_desktop_gl(ctx))
  1607.             goto invalid_enum_error;
  1608.          CHECK_EXTENSION(ARB_texture_multisample);
  1609.          return ctx->Multisample.SampleMask;
  1610.  
  1611.       /* ARB_sample_shading */
  1612.       case GL_SAMPLE_SHADING:
  1613.          if (!_mesa_is_desktop_gl(ctx))
  1614.             goto invalid_enum_error;
  1615.          CHECK_EXTENSION(ARB_sample_shading);
  1616.          return ctx->Multisample.SampleShading;
  1617.  
  1618.       default:
  1619.          goto invalid_enum_error;
  1620.    }
  1621.  
  1622.    return GL_FALSE;
  1623.  
  1624. invalid_enum_error:
  1625.    _mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabled(%s)",
  1626.                _mesa_lookup_enum_by_nr(cap));
  1627.    return GL_FALSE;
  1628. }
  1629.