mesa: remove GL_DEPTH_TEST + no depth buffer test
[platform/upstream/mesa.git] / src / mesa / main / enable.c
1 /**
2  * \file enable.c
3  * Enable/disable/query GL capabilities.
4  */
5
6 /*
7  * Mesa 3-D graphics library
8  * Version:  7.0.3
9  *
10  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
11  *
12  * Permission is hereby granted, free of charge, to any person obtaining a
13  * copy of this software and associated documentation files (the "Software"),
14  * to deal in the Software without restriction, including without limitation
15  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16  * and/or sell copies of the Software, and to permit persons to whom the
17  * Software is furnished to do so, subject to the following conditions:
18  *
19  * The above copyright notice and this permission notice shall be included
20  * in all copies or substantial portions of the Software.
21  *
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
25  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
27  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28  */
29
30
31 #include "glheader.h"
32 #include "context.h"
33 #include "enable.h"
34 #include "light.h"
35 #include "macros.h"
36 #include "simple_list.h"
37 #include "mtypes.h"
38 #include "enums.h"
39 #include "math/m_matrix.h"
40 #include "math/m_xform.h"
41 #include "api_arrayelt.h"
42
43
44
45 #define CHECK_EXTENSION(EXTNAME, CAP)                                   \
46    if (!ctx->Extensions.EXTNAME) {                                      \
47       _mesa_error(ctx, GL_INVALID_ENUM, "gl%sClientState(0x%x)",        \
48                   state ? "Enable" : "Disable", CAP);                   \
49       return;                                                           \
50    }
51
52
53 /**
54  * Helper to enable/disable client-side state.
55  */
56 static void
57 client_state(GLcontext *ctx, GLenum cap, GLboolean state)
58 {
59    GLuint flag;
60    GLboolean *var;
61
62    switch (cap) {
63       case GL_VERTEX_ARRAY:
64          var = &ctx->Array.ArrayObj->Vertex.Enabled;
65          flag = _NEW_ARRAY_VERTEX;
66          break;
67       case GL_NORMAL_ARRAY:
68          var = &ctx->Array.ArrayObj->Normal.Enabled;
69          flag = _NEW_ARRAY_NORMAL;
70          break;
71       case GL_COLOR_ARRAY:
72          var = &ctx->Array.ArrayObj->Color.Enabled;
73          flag = _NEW_ARRAY_COLOR0;
74          break;
75       case GL_INDEX_ARRAY:
76          var = &ctx->Array.ArrayObj->Index.Enabled;
77          flag = _NEW_ARRAY_INDEX;
78          break;
79       case GL_TEXTURE_COORD_ARRAY:
80          var = &ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled;
81          flag = _NEW_ARRAY_TEXCOORD(ctx->Array.ActiveTexture);
82          break;
83       case GL_EDGE_FLAG_ARRAY:
84          var = &ctx->Array.ArrayObj->EdgeFlag.Enabled;
85          flag = _NEW_ARRAY_EDGEFLAG;
86          break;
87       case GL_FOG_COORDINATE_ARRAY_EXT:
88          var = &ctx->Array.ArrayObj->FogCoord.Enabled;
89          flag = _NEW_ARRAY_FOGCOORD;
90          break;
91       case GL_SECONDARY_COLOR_ARRAY_EXT:
92          var = &ctx->Array.ArrayObj->SecondaryColor.Enabled;
93          flag = _NEW_ARRAY_COLOR1;
94          break;
95
96 #if FEATURE_point_size_array
97       case GL_POINT_SIZE_ARRAY_OES:
98          var = &ctx->Array.ArrayObj->PointSize.Enabled;
99          flag = _NEW_ARRAY_POINT_SIZE;
100          break;
101 #endif
102
103 #if FEATURE_NV_vertex_program
104       case GL_VERTEX_ATTRIB_ARRAY0_NV:
105       case GL_VERTEX_ATTRIB_ARRAY1_NV:
106       case GL_VERTEX_ATTRIB_ARRAY2_NV:
107       case GL_VERTEX_ATTRIB_ARRAY3_NV:
108       case GL_VERTEX_ATTRIB_ARRAY4_NV:
109       case GL_VERTEX_ATTRIB_ARRAY5_NV:
110       case GL_VERTEX_ATTRIB_ARRAY6_NV:
111       case GL_VERTEX_ATTRIB_ARRAY7_NV:
112       case GL_VERTEX_ATTRIB_ARRAY8_NV:
113       case GL_VERTEX_ATTRIB_ARRAY9_NV:
114       case GL_VERTEX_ATTRIB_ARRAY10_NV:
115       case GL_VERTEX_ATTRIB_ARRAY11_NV:
116       case GL_VERTEX_ATTRIB_ARRAY12_NV:
117       case GL_VERTEX_ATTRIB_ARRAY13_NV:
118       case GL_VERTEX_ATTRIB_ARRAY14_NV:
119       case GL_VERTEX_ATTRIB_ARRAY15_NV:
120          CHECK_EXTENSION(NV_vertex_program, cap);
121          {
122             GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV;
123             var = &ctx->Array.ArrayObj->VertexAttrib[n].Enabled;
124             flag = _NEW_ARRAY_ATTRIB(n);
125          }
126          break;
127 #endif /* FEATURE_NV_vertex_program */
128
129       default:
130          _mesa_error( ctx, GL_INVALID_ENUM,
131                       "glEnable/DisableClientState(0x%x)", cap);
132          return;
133    }
134
135    if (*var == state)
136       return;
137
138    FLUSH_VERTICES(ctx, _NEW_ARRAY);
139    ctx->Array.NewState |= flag;
140
141    _ae_invalidate_state(ctx, _NEW_ARRAY);
142
143    *var = state;
144
145    if (state)
146       ctx->Array.ArrayObj->_Enabled |= flag;
147    else
148       ctx->Array.ArrayObj->_Enabled &= ~flag;
149
150    if (ctx->Driver.Enable) {
151       ctx->Driver.Enable( ctx, cap, state );
152    }
153 }
154
155
156 /**
157  * Enable GL capability.
158  * \param cap  state to enable/disable.
159  *
160  * Get's the current context, assures that we're outside glBegin()/glEnd() and
161  * calls client_state().
162  */
163 void GLAPIENTRY
164 _mesa_EnableClientState( GLenum cap )
165 {
166    GET_CURRENT_CONTEXT(ctx);
167    ASSERT_OUTSIDE_BEGIN_END(ctx);
168    client_state( ctx, cap, GL_TRUE );
169 }
170
171
172 /**
173  * Disable GL capability.
174  * \param cap  state to enable/disable.
175  *
176  * Get's the current context, assures that we're outside glBegin()/glEnd() and
177  * calls client_state().
178  */
179 void GLAPIENTRY
180 _mesa_DisableClientState( GLenum cap )
181 {
182    GET_CURRENT_CONTEXT(ctx);
183    ASSERT_OUTSIDE_BEGIN_END(ctx);
184    client_state( ctx, cap, GL_FALSE );
185 }
186
187
188 #undef CHECK_EXTENSION
189 #define CHECK_EXTENSION(EXTNAME, CAP)                                   \
190    if (!ctx->Extensions.EXTNAME) {                                      \
191       _mesa_error(ctx, GL_INVALID_ENUM, "gl%s(0x%x)",                   \
192                   state ? "Enable" : "Disable", CAP);                   \
193       return;                                                           \
194    }
195
196 #define CHECK_EXTENSION2(EXT1, EXT2, CAP)                               \
197    if (!ctx->Extensions.EXT1 && !ctx->Extensions.EXT2) {                \
198       _mesa_error(ctx, GL_INVALID_ENUM, "gl%s(0x%x)",                   \
199                   state ? "Enable" : "Disable", CAP);                   \
200       return;                                                           \
201    }
202
203
204
205 /**
206  * Return pointer to current texture unit for setting/getting coordinate
207  * state.
208  * Note that we'll set GL_INVALID_OPERATION if the active texture unit is
209  * higher than the number of supported coordinate units.  And we'll return NULL.
210  */
211 static struct gl_texture_unit *
212 get_texcoord_unit(GLcontext *ctx)
213 {
214    if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
215       _mesa_error(ctx, GL_INVALID_OPERATION, "glEnable/Disable(texcoord unit)");
216       return NULL;
217    }
218    else {
219       return &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
220    }
221 }
222
223
224 /**
225  * Helper function to enable or disable a texture target.
226  */
227 static GLboolean
228 enable_texture(GLcontext *ctx, GLboolean state, GLbitfield bit)
229 {
230    const GLuint curr = ctx->Texture.CurrentUnit;
231    struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
232    const GLuint newenabled = (!state)
233        ? (texUnit->Enabled & ~bit) :  (texUnit->Enabled | bit);
234
235    if (!ctx->DrawBuffer->Visual.rgbMode || texUnit->Enabled == newenabled)
236        return GL_FALSE;
237
238    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
239    texUnit->Enabled = newenabled;
240    return GL_TRUE;
241 }
242
243
244 /**
245  * Helper function to enable or disable state.
246  *
247  * \param ctx GL context.
248  * \param cap  the state to enable/disable
249  * \param state whether to enable or disable the specified capability.
250  *
251  * Updates the current context and flushes the vertices as needed. For
252  * capabilities associated with extensions it verifies that those extensions
253  * are effectivly present before updating. Notifies the driver via
254  * dd_function_table::Enable.
255  */
256 void
257 _mesa_set_enable(GLcontext *ctx, GLenum cap, GLboolean state)
258 {
259    if (MESA_VERBOSE & VERBOSE_API)
260       _mesa_debug(ctx, "%s %s (newstate is %x)\n",
261                   state ? "glEnable" : "glDisable",
262                   _mesa_lookup_enum_by_nr(cap),
263                   ctx->NewState);
264
265    switch (cap) {
266       case GL_ALPHA_TEST:
267          if (ctx->Color.AlphaEnabled == state)
268             return;
269          FLUSH_VERTICES(ctx, _NEW_COLOR);
270          ctx->Color.AlphaEnabled = state;
271          break;
272       case GL_AUTO_NORMAL:
273          if (ctx->Eval.AutoNormal == state)
274             return;
275          FLUSH_VERTICES(ctx, _NEW_EVAL);
276          ctx->Eval.AutoNormal = state;
277          break;
278       case GL_BLEND:
279          if (ctx->Color.BlendEnabled == state)
280             return;
281          FLUSH_VERTICES(ctx, _NEW_COLOR);
282          ctx->Color.BlendEnabled = state;
283          break;
284 #if FEATURE_userclip
285       case GL_CLIP_PLANE0:
286       case GL_CLIP_PLANE1:
287       case GL_CLIP_PLANE2:
288       case GL_CLIP_PLANE3:
289       case GL_CLIP_PLANE4:
290       case GL_CLIP_PLANE5:
291          {
292             const GLuint p = cap - GL_CLIP_PLANE0;
293
294             if ((ctx->Transform.ClipPlanesEnabled & (1 << p)) == ((GLuint) state << p))
295                return;
296
297             FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
298
299             if (state) {
300                ctx->Transform.ClipPlanesEnabled |= (1 << p);
301
302                if (_math_matrix_is_dirty(ctx->ProjectionMatrixStack.Top))
303                   _math_matrix_analyse( ctx->ProjectionMatrixStack.Top );
304
305                /* This derived state also calculated in clip.c and
306                 * from _mesa_update_state() on changes to EyeUserPlane
307                 * and ctx->ProjectionMatrix respectively.
308                 */
309                _mesa_transform_vector( ctx->Transform._ClipUserPlane[p],
310                                     ctx->Transform.EyeUserPlane[p],
311                                     ctx->ProjectionMatrixStack.Top->inv );
312             }
313             else {
314                ctx->Transform.ClipPlanesEnabled &= ~(1 << p);
315             }               
316          }
317          break;
318 #endif
319       case GL_COLOR_MATERIAL:
320          if (ctx->Light.ColorMaterialEnabled == state)
321             return;
322          FLUSH_VERTICES(ctx, _NEW_LIGHT);
323          FLUSH_CURRENT(ctx, 0);
324          ctx->Light.ColorMaterialEnabled = state;
325          if (state) {
326             _mesa_update_color_material( ctx,
327                                   ctx->Current.Attrib[VERT_ATTRIB_COLOR0] );
328          }
329          break;
330       case GL_CULL_FACE:
331          if (ctx->Polygon.CullFlag == state)
332             return;
333          FLUSH_VERTICES(ctx, _NEW_POLYGON);
334          ctx->Polygon.CullFlag = state;
335          break;
336       case GL_CULL_VERTEX_EXT:
337          CHECK_EXTENSION(EXT_cull_vertex, cap);
338          if (ctx->Transform.CullVertexFlag == state)
339             return;
340          FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
341          ctx->Transform.CullVertexFlag = state;
342          break;
343       case GL_DEPTH_TEST:
344          if (ctx->Depth.Test == state)
345             return;
346          FLUSH_VERTICES(ctx, _NEW_DEPTH);
347          ctx->Depth.Test = state;
348          break;
349       case GL_DITHER:
350          if (ctx->NoDither) {
351             state = GL_FALSE; /* MESA_NO_DITHER env var */
352          }
353          if (ctx->Color.DitherFlag == state)
354             return;
355          FLUSH_VERTICES(ctx, _NEW_COLOR);
356          ctx->Color.DitherFlag = state;
357          break;
358       case GL_FOG:
359          if (ctx->Fog.Enabled == state)
360             return;
361          FLUSH_VERTICES(ctx, _NEW_FOG);
362          ctx->Fog.Enabled = state;
363          break;
364       case GL_HISTOGRAM:
365          CHECK_EXTENSION(EXT_histogram, cap);
366          if (ctx->Pixel.HistogramEnabled == state)
367             return;
368          FLUSH_VERTICES(ctx, _NEW_PIXEL);
369          ctx->Pixel.HistogramEnabled = state;
370          break;
371       case GL_LIGHT0:
372       case GL_LIGHT1:
373       case GL_LIGHT2:
374       case GL_LIGHT3:
375       case GL_LIGHT4:
376       case GL_LIGHT5:
377       case GL_LIGHT6:
378       case GL_LIGHT7:
379          if (ctx->Light.Light[cap-GL_LIGHT0].Enabled == state)
380             return;
381          FLUSH_VERTICES(ctx, _NEW_LIGHT);
382          ctx->Light.Light[cap-GL_LIGHT0].Enabled = state;
383          if (state) {
384             insert_at_tail(&ctx->Light.EnabledList,
385                            &ctx->Light.Light[cap-GL_LIGHT0]);
386          }
387          else {
388             remove_from_list(&ctx->Light.Light[cap-GL_LIGHT0]);
389          }
390          break;
391       case GL_LIGHTING:
392          if (ctx->Light.Enabled == state)
393             return;
394          FLUSH_VERTICES(ctx, _NEW_LIGHT);
395          ctx->Light.Enabled = state;
396          if (ctx->Light.Enabled && ctx->Light.Model.TwoSide)
397             ctx->_TriangleCaps |= DD_TRI_LIGHT_TWOSIDE;
398          else
399             ctx->_TriangleCaps &= ~DD_TRI_LIGHT_TWOSIDE;
400          break;
401       case GL_LINE_SMOOTH:
402          if (ctx->Line.SmoothFlag == state)
403             return;
404          FLUSH_VERTICES(ctx, _NEW_LINE);
405          ctx->Line.SmoothFlag = state;
406          ctx->_TriangleCaps ^= DD_LINE_SMOOTH;
407          break;
408       case GL_LINE_STIPPLE:
409          if (ctx->Line.StippleFlag == state)
410             return;
411          FLUSH_VERTICES(ctx, _NEW_LINE);
412          ctx->Line.StippleFlag = state;
413          ctx->_TriangleCaps ^= DD_LINE_STIPPLE;
414          break;
415       case GL_INDEX_LOGIC_OP:
416          if (ctx->Color.IndexLogicOpEnabled == state)
417             return;
418          FLUSH_VERTICES(ctx, _NEW_COLOR);
419          ctx->Color.IndexLogicOpEnabled = state;
420          break;
421       case GL_COLOR_LOGIC_OP:
422          if (ctx->Color.ColorLogicOpEnabled == state)
423             return;
424          FLUSH_VERTICES(ctx, _NEW_COLOR);
425          ctx->Color.ColorLogicOpEnabled = state;
426          break;
427       case GL_MAP1_COLOR_4:
428          if (ctx->Eval.Map1Color4 == state)
429             return;
430          FLUSH_VERTICES(ctx, _NEW_EVAL);
431          ctx->Eval.Map1Color4 = state;
432          break;
433       case GL_MAP1_INDEX:
434          if (ctx->Eval.Map1Index == state)
435             return;
436          FLUSH_VERTICES(ctx, _NEW_EVAL);
437          ctx->Eval.Map1Index = state;
438          break;
439       case GL_MAP1_NORMAL:
440          if (ctx->Eval.Map1Normal == state)
441             return;
442          FLUSH_VERTICES(ctx, _NEW_EVAL);
443          ctx->Eval.Map1Normal = state;
444          break;
445       case GL_MAP1_TEXTURE_COORD_1:
446          if (ctx->Eval.Map1TextureCoord1 == state)
447             return;
448          FLUSH_VERTICES(ctx, _NEW_EVAL);
449          ctx->Eval.Map1TextureCoord1 = state;
450          break;
451       case GL_MAP1_TEXTURE_COORD_2:
452          if (ctx->Eval.Map1TextureCoord2 == state)
453             return;
454          FLUSH_VERTICES(ctx, _NEW_EVAL);
455          ctx->Eval.Map1TextureCoord2 = state;
456          break;
457       case GL_MAP1_TEXTURE_COORD_3:
458          if (ctx->Eval.Map1TextureCoord3 == state)
459             return;
460          FLUSH_VERTICES(ctx, _NEW_EVAL);
461          ctx->Eval.Map1TextureCoord3 = state;
462          break;
463       case GL_MAP1_TEXTURE_COORD_4:
464          if (ctx->Eval.Map1TextureCoord4 == state)
465             return;
466          FLUSH_VERTICES(ctx, _NEW_EVAL);
467          ctx->Eval.Map1TextureCoord4 = state;
468          break;
469       case GL_MAP1_VERTEX_3:
470          if (ctx->Eval.Map1Vertex3 == state)
471             return;
472          FLUSH_VERTICES(ctx, _NEW_EVAL);
473          ctx->Eval.Map1Vertex3 = state;
474          break;
475       case GL_MAP1_VERTEX_4:
476          if (ctx->Eval.Map1Vertex4 == state)
477             return;
478          FLUSH_VERTICES(ctx, _NEW_EVAL);
479          ctx->Eval.Map1Vertex4 = state;
480          break;
481       case GL_MAP2_COLOR_4:
482          if (ctx->Eval.Map2Color4 == state)
483             return;
484          FLUSH_VERTICES(ctx, _NEW_EVAL);
485          ctx->Eval.Map2Color4 = state;
486          break;
487       case GL_MAP2_INDEX:
488          if (ctx->Eval.Map2Index == state)
489             return;
490          FLUSH_VERTICES(ctx, _NEW_EVAL);
491          ctx->Eval.Map2Index = state;
492          break;
493       case GL_MAP2_NORMAL:
494          if (ctx->Eval.Map2Normal == state)
495             return;
496          FLUSH_VERTICES(ctx, _NEW_EVAL);
497          ctx->Eval.Map2Normal = state;
498          break;
499       case GL_MAP2_TEXTURE_COORD_1:
500          if (ctx->Eval.Map2TextureCoord1 == state)
501             return;
502          FLUSH_VERTICES(ctx, _NEW_EVAL);
503          ctx->Eval.Map2TextureCoord1 = state;
504          break;
505       case GL_MAP2_TEXTURE_COORD_2:
506          if (ctx->Eval.Map2TextureCoord2 == state)
507             return;
508          FLUSH_VERTICES(ctx, _NEW_EVAL);
509          ctx->Eval.Map2TextureCoord2 = state;
510          break;
511       case GL_MAP2_TEXTURE_COORD_3:
512          if (ctx->Eval.Map2TextureCoord3 == state)
513             return;
514          FLUSH_VERTICES(ctx, _NEW_EVAL);
515          ctx->Eval.Map2TextureCoord3 = state;
516          break;
517       case GL_MAP2_TEXTURE_COORD_4:
518          if (ctx->Eval.Map2TextureCoord4 == state)
519             return;
520          FLUSH_VERTICES(ctx, _NEW_EVAL);
521          ctx->Eval.Map2TextureCoord4 = state;
522          break;
523       case GL_MAP2_VERTEX_3:
524          if (ctx->Eval.Map2Vertex3 == state)
525             return;
526          FLUSH_VERTICES(ctx, _NEW_EVAL);
527          ctx->Eval.Map2Vertex3 = state;
528          break;
529       case GL_MAP2_VERTEX_4:
530          if (ctx->Eval.Map2Vertex4 == state)
531             return;
532          FLUSH_VERTICES(ctx, _NEW_EVAL);
533          ctx->Eval.Map2Vertex4 = state;
534          break;
535       case GL_MINMAX:
536          if (ctx->Pixel.MinMaxEnabled == state)
537             return;
538          FLUSH_VERTICES(ctx, _NEW_PIXEL);
539          ctx->Pixel.MinMaxEnabled = state;
540          break;
541       case GL_NORMALIZE:
542          if (ctx->Transform.Normalize == state)
543             return;
544          FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
545          ctx->Transform.Normalize = state;
546          break;
547       case GL_POINT_SMOOTH:
548          if (ctx->Point.SmoothFlag == state)
549             return;
550          FLUSH_VERTICES(ctx, _NEW_POINT);
551          ctx->Point.SmoothFlag = state;
552          ctx->_TriangleCaps ^= DD_POINT_SMOOTH;
553          break;
554       case GL_POLYGON_SMOOTH:
555          if (ctx->Polygon.SmoothFlag == state)
556             return;
557          FLUSH_VERTICES(ctx, _NEW_POLYGON);
558          ctx->Polygon.SmoothFlag = state;
559          ctx->_TriangleCaps ^= DD_TRI_SMOOTH;
560          break;
561       case GL_POLYGON_STIPPLE:
562          if (ctx->Polygon.StippleFlag == state)
563             return;
564          FLUSH_VERTICES(ctx, _NEW_POLYGON);
565          ctx->Polygon.StippleFlag = state;
566          ctx->_TriangleCaps ^= DD_TRI_STIPPLE;
567          break;
568       case GL_POLYGON_OFFSET_POINT:
569          if (ctx->Polygon.OffsetPoint == state)
570             return;
571          FLUSH_VERTICES(ctx, _NEW_POLYGON);
572          ctx->Polygon.OffsetPoint = state;
573          break;
574       case GL_POLYGON_OFFSET_LINE:
575          if (ctx->Polygon.OffsetLine == state)
576             return;
577          FLUSH_VERTICES(ctx, _NEW_POLYGON);
578          ctx->Polygon.OffsetLine = state;
579          break;
580       case GL_POLYGON_OFFSET_FILL:
581          /*case GL_POLYGON_OFFSET_EXT:*/
582          if (ctx->Polygon.OffsetFill == state)
583             return;
584          FLUSH_VERTICES(ctx, _NEW_POLYGON);
585          ctx->Polygon.OffsetFill = state;
586          break;
587       case GL_RESCALE_NORMAL_EXT:
588          if (ctx->Transform.RescaleNormals == state)
589             return;
590          FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
591          ctx->Transform.RescaleNormals = state;
592          break;
593       case GL_SCISSOR_TEST:
594          if (ctx->Scissor.Enabled == state)
595             return;
596          FLUSH_VERTICES(ctx, _NEW_SCISSOR);
597          ctx->Scissor.Enabled = state;
598          break;
599       case GL_SHARED_TEXTURE_PALETTE_EXT:
600          if (ctx->Texture.SharedPalette == state)
601             return;
602          FLUSH_VERTICES(ctx, _NEW_TEXTURE);
603          ctx->Texture.SharedPalette = state;
604          break;
605       case GL_STENCIL_TEST:
606          if (state && ctx->DrawBuffer->Visual.stencilBits == 0) {
607             _mesa_warning(ctx,
608                           "glEnable(GL_STENCIL_TEST) but no stencil buffer");
609             return;
610          }
611          if (ctx->Stencil.Enabled == state)
612             return;
613          FLUSH_VERTICES(ctx, _NEW_STENCIL);
614          ctx->Stencil.Enabled = state;
615          break;
616       case GL_TEXTURE_1D:
617          if (!enable_texture(ctx, state, TEXTURE_1D_BIT)) {
618             return;
619          }
620          break;
621       case GL_TEXTURE_2D:
622          if (!enable_texture(ctx, state, TEXTURE_2D_BIT)) {
623             return;
624          }
625          break;
626       case GL_TEXTURE_3D:
627          if (!enable_texture(ctx, state, TEXTURE_3D_BIT)) {
628             return;
629          }
630          break;
631       case GL_TEXTURE_GEN_Q:
632          {
633             struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
634             if (texUnit) {
635                GLuint newenabled = texUnit->TexGenEnabled & ~Q_BIT;
636                if (state)
637                   newenabled |= Q_BIT;
638                if (texUnit->TexGenEnabled == newenabled)
639                   return;
640                FLUSH_VERTICES(ctx, _NEW_TEXTURE);
641                texUnit->TexGenEnabled = newenabled;
642             }
643          }
644          break;
645       case GL_TEXTURE_GEN_R:
646          {
647             struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
648             if (texUnit) {
649                GLuint newenabled = texUnit->TexGenEnabled & ~R_BIT;
650                if (state)
651                   newenabled |= R_BIT;
652                if (texUnit->TexGenEnabled == newenabled)
653                   return;
654                FLUSH_VERTICES(ctx, _NEW_TEXTURE);
655                texUnit->TexGenEnabled = newenabled;
656             }
657          }
658          break;
659       case GL_TEXTURE_GEN_S:
660          {
661             struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
662             if (texUnit) {
663                GLuint newenabled = texUnit->TexGenEnabled & ~S_BIT;
664                if (state)
665                   newenabled |= S_BIT;
666                if (texUnit->TexGenEnabled == newenabled)
667                   return;
668                FLUSH_VERTICES(ctx, _NEW_TEXTURE);
669                texUnit->TexGenEnabled = newenabled;
670             }
671          }
672          break;
673       case GL_TEXTURE_GEN_T:
674          {
675             struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
676             if (texUnit) {
677                GLuint newenabled = texUnit->TexGenEnabled & ~T_BIT;
678                if (state)
679                   newenabled |= T_BIT;
680                if (texUnit->TexGenEnabled == newenabled)
681                   return;
682                FLUSH_VERTICES(ctx, _NEW_TEXTURE);
683                texUnit->TexGenEnabled = newenabled;
684             }
685          }
686          break;
687
688       /*
689        * CLIENT STATE!!!
690        */
691       case GL_VERTEX_ARRAY:
692       case GL_NORMAL_ARRAY:
693       case GL_COLOR_ARRAY:
694       case GL_INDEX_ARRAY:
695       case GL_TEXTURE_COORD_ARRAY:
696       case GL_EDGE_FLAG_ARRAY:
697       case GL_FOG_COORDINATE_ARRAY_EXT:
698       case GL_SECONDARY_COLOR_ARRAY_EXT:
699       case GL_POINT_SIZE_ARRAY_OES:
700          client_state( ctx, cap, state );
701          return;
702
703       /* GL_SGI_color_table */
704       case GL_COLOR_TABLE_SGI:
705          CHECK_EXTENSION(SGI_color_table, cap);
706          if (ctx->Pixel.ColorTableEnabled[COLORTABLE_PRECONVOLUTION] == state)
707             return;
708          FLUSH_VERTICES(ctx, _NEW_PIXEL);
709          ctx->Pixel.ColorTableEnabled[COLORTABLE_PRECONVOLUTION] = state;
710          break;
711       case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
712          CHECK_EXTENSION(SGI_color_table, cap);
713          if (ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCONVOLUTION] == state)
714             return;
715          FLUSH_VERTICES(ctx, _NEW_PIXEL);
716          ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCONVOLUTION] = state;
717          break;
718       case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
719          CHECK_EXTENSION(SGI_color_table, cap);
720          if (ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCOLORMATRIX] == state)
721             return;
722          FLUSH_VERTICES(ctx, _NEW_PIXEL);
723          ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCOLORMATRIX] = state;
724          break;
725       case GL_TEXTURE_COLOR_TABLE_SGI:
726          CHECK_EXTENSION(SGI_texture_color_table, cap);
727          if (ctx->Texture.Unit[ctx->Texture.CurrentUnit].ColorTableEnabled == state)
728             return;
729          FLUSH_VERTICES(ctx, _NEW_TEXTURE);
730          ctx->Texture.Unit[ctx->Texture.CurrentUnit].ColorTableEnabled = state;
731          break;
732
733       /* GL_EXT_convolution */
734       case GL_CONVOLUTION_1D:
735          CHECK_EXTENSION(EXT_convolution, cap);
736          if (ctx->Pixel.Convolution1DEnabled == state)
737             return;
738          FLUSH_VERTICES(ctx, _NEW_PIXEL);
739          ctx->Pixel.Convolution1DEnabled = state;
740          break;
741       case GL_CONVOLUTION_2D:
742          CHECK_EXTENSION(EXT_convolution, cap);
743          if (ctx->Pixel.Convolution2DEnabled == state)
744             return;
745          FLUSH_VERTICES(ctx, _NEW_PIXEL);
746          ctx->Pixel.Convolution2DEnabled = state;
747          break;
748       case GL_SEPARABLE_2D:
749          CHECK_EXTENSION(EXT_convolution, cap);
750          if (ctx->Pixel.Separable2DEnabled == state)
751             return;
752          FLUSH_VERTICES(ctx, _NEW_PIXEL);
753          ctx->Pixel.Separable2DEnabled = state;
754          break;
755
756       /* GL_ARB_texture_cube_map */
757       case GL_TEXTURE_CUBE_MAP_ARB:
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          CHECK_EXTENSION2(EXT_secondary_color, ARB_vertex_program, cap);
767          if (ctx->Fog.ColorSumEnabled == state)
768             return;
769          FLUSH_VERTICES(ctx, _NEW_FOG);
770          ctx->Fog.ColorSumEnabled = state;
771          break;
772
773       /* GL_ARB_multisample */
774       case GL_MULTISAMPLE_ARB:
775          CHECK_EXTENSION(ARB_multisample, cap);
776          if (ctx->Multisample.Enabled == state)
777             return;
778          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
779          ctx->Multisample.Enabled = state;
780          break;
781       case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:
782          CHECK_EXTENSION(ARB_multisample, cap);
783          if (ctx->Multisample.SampleAlphaToCoverage == state)
784             return;
785          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
786          ctx->Multisample.SampleAlphaToCoverage = state;
787          break;
788       case GL_SAMPLE_ALPHA_TO_ONE_ARB:
789          CHECK_EXTENSION(ARB_multisample, cap);
790          if (ctx->Multisample.SampleAlphaToOne == state)
791             return;
792          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
793          ctx->Multisample.SampleAlphaToOne = state;
794          break;
795       case GL_SAMPLE_COVERAGE_ARB:
796          CHECK_EXTENSION(ARB_multisample, cap);
797          if (ctx->Multisample.SampleCoverage == state)
798             return;
799          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
800          ctx->Multisample.SampleCoverage = state;
801          break;
802       case GL_SAMPLE_COVERAGE_INVERT_ARB:
803          CHECK_EXTENSION(ARB_multisample, cap);
804          if (ctx->Multisample.SampleCoverageInvert == state)
805             return;
806          FLUSH_VERTICES(ctx, _NEW_MULTISAMPLE);
807          ctx->Multisample.SampleCoverageInvert = state;
808          break;
809
810       /* GL_IBM_rasterpos_clip */
811       case GL_RASTER_POSITION_UNCLIPPED_IBM:
812          CHECK_EXTENSION(IBM_rasterpos_clip, cap);
813          if (ctx->Transform.RasterPositionUnclipped == state)
814             return;
815          FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
816          ctx->Transform.RasterPositionUnclipped = state;
817          break;
818
819       /* GL_NV_point_sprite */
820       case GL_POINT_SPRITE_NV:
821          CHECK_EXTENSION2(NV_point_sprite, ARB_point_sprite, cap);
822          if (ctx->Point.PointSprite == state)
823             return;
824          FLUSH_VERTICES(ctx, _NEW_POINT);
825          ctx->Point.PointSprite = state;
826          break;
827
828 #if FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program
829       case GL_VERTEX_PROGRAM_ARB:
830          CHECK_EXTENSION2(ARB_vertex_program, NV_vertex_program, cap);
831          if (ctx->VertexProgram.Enabled == state)
832             return;
833          FLUSH_VERTICES(ctx, _NEW_PROGRAM); 
834          ctx->VertexProgram.Enabled = state;
835          break;
836       case GL_VERTEX_PROGRAM_POINT_SIZE_ARB:
837          CHECK_EXTENSION2(ARB_vertex_program, NV_vertex_program, cap);
838          if (ctx->VertexProgram.PointSizeEnabled == state)
839             return;
840          FLUSH_VERTICES(ctx, _NEW_PROGRAM);
841          ctx->VertexProgram.PointSizeEnabled = state;
842          break;
843       case GL_VERTEX_PROGRAM_TWO_SIDE_ARB:
844          CHECK_EXTENSION2(ARB_vertex_program, NV_vertex_program, cap);
845          if (ctx->VertexProgram.TwoSideEnabled == state)
846             return;
847          FLUSH_VERTICES(ctx, _NEW_PROGRAM); 
848          ctx->VertexProgram.TwoSideEnabled = state;
849          break;
850 #endif
851 #if FEATURE_NV_vertex_program
852       case GL_MAP1_VERTEX_ATTRIB0_4_NV:
853       case GL_MAP1_VERTEX_ATTRIB1_4_NV:
854       case GL_MAP1_VERTEX_ATTRIB2_4_NV:
855       case GL_MAP1_VERTEX_ATTRIB3_4_NV:
856       case GL_MAP1_VERTEX_ATTRIB4_4_NV:
857       case GL_MAP1_VERTEX_ATTRIB5_4_NV:
858       case GL_MAP1_VERTEX_ATTRIB6_4_NV:
859       case GL_MAP1_VERTEX_ATTRIB7_4_NV:
860       case GL_MAP1_VERTEX_ATTRIB8_4_NV:
861       case GL_MAP1_VERTEX_ATTRIB9_4_NV:
862       case GL_MAP1_VERTEX_ATTRIB10_4_NV:
863       case GL_MAP1_VERTEX_ATTRIB11_4_NV:
864       case GL_MAP1_VERTEX_ATTRIB12_4_NV:
865       case GL_MAP1_VERTEX_ATTRIB13_4_NV:
866       case GL_MAP1_VERTEX_ATTRIB14_4_NV:
867       case GL_MAP1_VERTEX_ATTRIB15_4_NV:
868          CHECK_EXTENSION(NV_vertex_program, cap);
869          {
870             const GLuint map = (GLuint) (cap - GL_MAP1_VERTEX_ATTRIB0_4_NV);
871             FLUSH_VERTICES(ctx, _NEW_EVAL);
872             ctx->Eval.Map1Attrib[map] = state;
873          }
874          break;
875       case GL_MAP2_VERTEX_ATTRIB0_4_NV:
876       case GL_MAP2_VERTEX_ATTRIB1_4_NV:
877       case GL_MAP2_VERTEX_ATTRIB2_4_NV:
878       case GL_MAP2_VERTEX_ATTRIB3_4_NV:
879       case GL_MAP2_VERTEX_ATTRIB4_4_NV:
880       case GL_MAP2_VERTEX_ATTRIB5_4_NV:
881       case GL_MAP2_VERTEX_ATTRIB6_4_NV:
882       case GL_MAP2_VERTEX_ATTRIB7_4_NV:
883       case GL_MAP2_VERTEX_ATTRIB8_4_NV:
884       case GL_MAP2_VERTEX_ATTRIB9_4_NV:
885       case GL_MAP2_VERTEX_ATTRIB10_4_NV:
886       case GL_MAP2_VERTEX_ATTRIB11_4_NV:
887       case GL_MAP2_VERTEX_ATTRIB12_4_NV:
888       case GL_MAP2_VERTEX_ATTRIB13_4_NV:
889       case GL_MAP2_VERTEX_ATTRIB14_4_NV:
890       case GL_MAP2_VERTEX_ATTRIB15_4_NV:
891          CHECK_EXTENSION(NV_vertex_program, cap);
892          {
893             const GLuint map = (GLuint) (cap - GL_MAP2_VERTEX_ATTRIB0_4_NV);
894             FLUSH_VERTICES(ctx, _NEW_EVAL);
895             ctx->Eval.Map2Attrib[map] = state;
896          }
897          break;
898 #endif /* FEATURE_NV_vertex_program */
899
900 #if FEATURE_NV_fragment_program
901       case GL_FRAGMENT_PROGRAM_NV:
902          CHECK_EXTENSION(NV_fragment_program, cap);
903          if (ctx->FragmentProgram.Enabled == state)
904             return;
905          FLUSH_VERTICES(ctx, _NEW_PROGRAM);
906          ctx->FragmentProgram.Enabled = state;
907          break;
908 #endif /* FEATURE_NV_fragment_program */
909
910       /* GL_NV_texture_rectangle */
911       case GL_TEXTURE_RECTANGLE_NV:
912          CHECK_EXTENSION(NV_texture_rectangle, cap);
913          if (!enable_texture(ctx, state, TEXTURE_RECT_BIT)) {
914             return;
915          }
916          break;
917
918       /* GL_EXT_stencil_two_side */
919       case GL_STENCIL_TEST_TWO_SIDE_EXT:
920          CHECK_EXTENSION(EXT_stencil_two_side, cap);
921          if (ctx->Stencil.TestTwoSide == state)
922             return;
923          FLUSH_VERTICES(ctx, _NEW_STENCIL);
924          ctx->Stencil.TestTwoSide = state;
925          if (state)
926             ctx->_TriangleCaps |= DD_TRI_TWOSTENCIL;
927          else
928             ctx->_TriangleCaps &= ~DD_TRI_TWOSTENCIL;
929          break;
930
931 #if FEATURE_ARB_fragment_program
932       case GL_FRAGMENT_PROGRAM_ARB:
933          CHECK_EXTENSION(ARB_fragment_program, cap);
934          if (ctx->FragmentProgram.Enabled == state)
935             return;
936          FLUSH_VERTICES(ctx, _NEW_PROGRAM);
937          ctx->FragmentProgram.Enabled = state;
938          break;
939 #endif /* FEATURE_ARB_fragment_program */
940
941       /* GL_EXT_depth_bounds_test */
942       case GL_DEPTH_BOUNDS_TEST_EXT:
943          CHECK_EXTENSION(EXT_depth_bounds_test, cap);
944          if (state && ctx->DrawBuffer->Visual.depthBits == 0) {
945             _mesa_warning(ctx,
946                    "glEnable(GL_DEPTH_BOUNDS_TEST_EXT) but no depth buffer");
947             return;
948          }
949          if (ctx->Depth.BoundsTest == state)
950             return;
951          FLUSH_VERTICES(ctx, _NEW_DEPTH);
952          ctx->Depth.BoundsTest = state;
953          break;
954
955       /* GL_MESA_program_debug */
956       case GL_FRAGMENT_PROGRAM_CALLBACK_MESA:
957          CHECK_EXTENSION(MESA_program_debug, cap);
958          ctx->FragmentProgram.CallbackEnabled = state;
959          break;
960       case GL_VERTEX_PROGRAM_CALLBACK_MESA:
961          CHECK_EXTENSION(MESA_program_debug, cap);
962          ctx->VertexProgram.CallbackEnabled = state;
963          break;
964
965 #if FEATURE_ATI_fragment_shader
966       case GL_FRAGMENT_SHADER_ATI:
967         CHECK_EXTENSION(ATI_fragment_shader, cap);
968         if (ctx->ATIFragmentShader.Enabled == state)
969           return;
970         FLUSH_VERTICES(ctx, _NEW_PROGRAM);
971         ctx->ATIFragmentShader.Enabled = state;
972         break;
973 #endif
974
975       /* GL_MESA_texture_array */
976       case GL_TEXTURE_1D_ARRAY_EXT:
977          CHECK_EXTENSION(MESA_texture_array, cap);
978          if (!enable_texture(ctx, state, TEXTURE_1D_ARRAY_BIT)) {
979             return;
980          }
981          break;
982
983       case GL_TEXTURE_2D_ARRAY_EXT:
984          CHECK_EXTENSION(MESA_texture_array, cap);
985          if (!enable_texture(ctx, state, TEXTURE_2D_ARRAY_BIT)) {
986             return;
987          }
988          break;
989
990       default:
991          _mesa_error(ctx, GL_INVALID_ENUM,
992                      "%s(0x%x)", state ? "glEnable" : "glDisable", cap);
993          return;
994    }
995
996    if (ctx->Driver.Enable) {
997       ctx->Driver.Enable( ctx, cap, state );
998    }
999 }
1000
1001
1002 /**
1003  * Enable GL capability.  Called by glEnable()
1004  * \param cap  state to enable.
1005  */
1006 void GLAPIENTRY
1007 _mesa_Enable( GLenum cap )
1008 {
1009    GET_CURRENT_CONTEXT(ctx);
1010    ASSERT_OUTSIDE_BEGIN_END(ctx);
1011
1012    _mesa_set_enable( ctx, cap, GL_TRUE );
1013 }
1014
1015
1016 /**
1017  * Disable GL capability.  Called by glDisable()
1018  * \param cap  state to disable.
1019  */
1020 void GLAPIENTRY
1021 _mesa_Disable( GLenum cap )
1022 {
1023    GET_CURRENT_CONTEXT(ctx);
1024    ASSERT_OUTSIDE_BEGIN_END(ctx);
1025
1026    _mesa_set_enable( ctx, cap, GL_FALSE );
1027 }
1028
1029
1030 #undef CHECK_EXTENSION
1031 #define CHECK_EXTENSION(EXTNAME)                        \
1032    if (!ctx->Extensions.EXTNAME) {                      \
1033       _mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabled"); \
1034       return GL_FALSE;                                  \
1035    }
1036
1037 #undef CHECK_EXTENSION2
1038 #define CHECK_EXTENSION2(EXT1, EXT2)                            \
1039    if (!ctx->Extensions.EXT1 && !ctx->Extensions.EXT2) {        \
1040       _mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabled");         \
1041       return GL_FALSE;                                          \
1042    }
1043
1044
1045 /**
1046  * Helper function to determine whether a texture target is enabled.
1047  */
1048 static GLboolean
1049 is_texture_enabled(GLcontext *ctx, GLbitfield bit)
1050 {
1051    const struct gl_texture_unit *const texUnit =
1052        &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
1053    return (texUnit->Enabled & bit) ? GL_TRUE : GL_FALSE;
1054 }
1055
1056
1057 /**
1058  * Return simple enable/disable state.
1059  *
1060  * \param cap  state variable to query.
1061  *
1062  * Returns the state of the specified capability from the current GL context.
1063  * For the capabilities associated with extensions verifies that those
1064  * extensions are effectively present before reporting.
1065  */
1066 GLboolean GLAPIENTRY
1067 _mesa_IsEnabled( GLenum cap )
1068 {
1069    GET_CURRENT_CONTEXT(ctx);
1070    switch (cap) {
1071       case GL_ALPHA_TEST:
1072          return ctx->Color.AlphaEnabled;
1073       case GL_AUTO_NORMAL:
1074          return ctx->Eval.AutoNormal;
1075       case GL_BLEND:
1076          return ctx->Color.BlendEnabled;
1077       case GL_CLIP_PLANE0:
1078       case GL_CLIP_PLANE1:
1079       case GL_CLIP_PLANE2:
1080       case GL_CLIP_PLANE3:
1081       case GL_CLIP_PLANE4:
1082       case GL_CLIP_PLANE5:
1083          return (ctx->Transform.ClipPlanesEnabled >> (cap - GL_CLIP_PLANE0)) & 1;
1084       case GL_COLOR_MATERIAL:
1085          return ctx->Light.ColorMaterialEnabled;
1086       case GL_CULL_FACE:
1087          return ctx->Polygon.CullFlag;
1088       case GL_DEPTH_TEST:
1089          return ctx->Depth.Test;
1090       case GL_DITHER:
1091          return ctx->Color.DitherFlag;
1092       case GL_FOG:
1093          return ctx->Fog.Enabled;
1094       case GL_LIGHTING:
1095          return ctx->Light.Enabled;
1096       case GL_LIGHT0:
1097       case GL_LIGHT1:
1098       case GL_LIGHT2:
1099       case GL_LIGHT3:
1100       case GL_LIGHT4:
1101       case GL_LIGHT5:
1102       case GL_LIGHT6:
1103       case GL_LIGHT7:
1104          return ctx->Light.Light[cap-GL_LIGHT0].Enabled;
1105       case GL_LINE_SMOOTH:
1106          return ctx->Line.SmoothFlag;
1107       case GL_LINE_STIPPLE:
1108          return ctx->Line.StippleFlag;
1109       case GL_INDEX_LOGIC_OP:
1110          return ctx->Color.IndexLogicOpEnabled;
1111       case GL_COLOR_LOGIC_OP:
1112          return ctx->Color.ColorLogicOpEnabled;
1113       case GL_MAP1_COLOR_4:
1114          return ctx->Eval.Map1Color4;
1115       case GL_MAP1_INDEX:
1116          return ctx->Eval.Map1Index;
1117       case GL_MAP1_NORMAL:
1118          return ctx->Eval.Map1Normal;
1119       case GL_MAP1_TEXTURE_COORD_1:
1120          return ctx->Eval.Map1TextureCoord1;
1121       case GL_MAP1_TEXTURE_COORD_2:
1122          return ctx->Eval.Map1TextureCoord2;
1123       case GL_MAP1_TEXTURE_COORD_3:
1124          return ctx->Eval.Map1TextureCoord3;
1125       case GL_MAP1_TEXTURE_COORD_4:
1126          return ctx->Eval.Map1TextureCoord4;
1127       case GL_MAP1_VERTEX_3:
1128          return ctx->Eval.Map1Vertex3;
1129       case GL_MAP1_VERTEX_4:
1130          return ctx->Eval.Map1Vertex4;
1131       case GL_MAP2_COLOR_4:
1132          return ctx->Eval.Map2Color4;
1133       case GL_MAP2_INDEX:
1134          return ctx->Eval.Map2Index;
1135       case GL_MAP2_NORMAL:
1136          return ctx->Eval.Map2Normal;
1137       case GL_MAP2_TEXTURE_COORD_1:
1138          return ctx->Eval.Map2TextureCoord1;
1139       case GL_MAP2_TEXTURE_COORD_2:
1140          return ctx->Eval.Map2TextureCoord2;
1141       case GL_MAP2_TEXTURE_COORD_3:
1142          return ctx->Eval.Map2TextureCoord3;
1143       case GL_MAP2_TEXTURE_COORD_4:
1144          return ctx->Eval.Map2TextureCoord4;
1145       case GL_MAP2_VERTEX_3:
1146          return ctx->Eval.Map2Vertex3;
1147       case GL_MAP2_VERTEX_4:
1148          return ctx->Eval.Map2Vertex4;
1149       case GL_NORMALIZE:
1150          return ctx->Transform.Normalize;
1151       case GL_POINT_SMOOTH:
1152          return ctx->Point.SmoothFlag;
1153       case GL_POLYGON_SMOOTH:
1154          return ctx->Polygon.SmoothFlag;
1155       case GL_POLYGON_STIPPLE:
1156          return ctx->Polygon.StippleFlag;
1157       case GL_POLYGON_OFFSET_POINT:
1158          return ctx->Polygon.OffsetPoint;
1159       case GL_POLYGON_OFFSET_LINE:
1160          return ctx->Polygon.OffsetLine;
1161       case GL_POLYGON_OFFSET_FILL:
1162       /*case GL_POLYGON_OFFSET_EXT:*/
1163          return ctx->Polygon.OffsetFill;
1164       case GL_RESCALE_NORMAL_EXT:
1165          return ctx->Transform.RescaleNormals;
1166       case GL_SCISSOR_TEST:
1167          return ctx->Scissor.Enabled;
1168       case GL_SHARED_TEXTURE_PALETTE_EXT:
1169          return ctx->Texture.SharedPalette;
1170       case GL_STENCIL_TEST:
1171          return ctx->Stencil.Enabled;
1172       case GL_TEXTURE_1D:
1173          return is_texture_enabled(ctx, TEXTURE_1D_BIT);
1174       case GL_TEXTURE_2D:
1175          return is_texture_enabled(ctx, TEXTURE_2D_BIT);
1176       case GL_TEXTURE_3D:
1177          return is_texture_enabled(ctx, TEXTURE_3D_BIT);
1178       case GL_TEXTURE_GEN_Q:
1179          {
1180             const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
1181             if (texUnit) {
1182                return (texUnit->TexGenEnabled & Q_BIT) ? GL_TRUE : GL_FALSE;
1183             }
1184          }
1185          return GL_FALSE;
1186       case GL_TEXTURE_GEN_R:
1187          {
1188             const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
1189             if (texUnit) {
1190                return (texUnit->TexGenEnabled & R_BIT) ? GL_TRUE : GL_FALSE;
1191             }
1192          }
1193          return GL_FALSE;
1194       case GL_TEXTURE_GEN_S:
1195          {
1196             const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
1197             if (texUnit) {
1198                return (texUnit->TexGenEnabled & S_BIT) ? GL_TRUE : GL_FALSE;
1199             }
1200          }
1201          return GL_FALSE;
1202       case GL_TEXTURE_GEN_T:
1203          {
1204             const struct gl_texture_unit *texUnit = get_texcoord_unit(ctx);
1205             if (texUnit) {
1206                return (texUnit->TexGenEnabled & T_BIT) ? GL_TRUE : GL_FALSE;
1207             }
1208          }
1209          return GL_FALSE;
1210
1211       /*
1212        * CLIENT STATE!!!
1213        */
1214       case GL_VERTEX_ARRAY:
1215          return (ctx->Array.ArrayObj->Vertex.Enabled != 0);
1216       case GL_NORMAL_ARRAY:
1217          return (ctx->Array.ArrayObj->Normal.Enabled != 0);
1218       case GL_COLOR_ARRAY:
1219          return (ctx->Array.ArrayObj->Color.Enabled != 0);
1220       case GL_INDEX_ARRAY:
1221          return (ctx->Array.ArrayObj->Index.Enabled != 0);
1222       case GL_TEXTURE_COORD_ARRAY:
1223          return (ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled != 0);
1224       case GL_EDGE_FLAG_ARRAY:
1225          return (ctx->Array.ArrayObj->EdgeFlag.Enabled != 0);
1226       case GL_FOG_COORDINATE_ARRAY_EXT:
1227          CHECK_EXTENSION(EXT_fog_coord);
1228          return (ctx->Array.ArrayObj->FogCoord.Enabled != 0);
1229       case GL_SECONDARY_COLOR_ARRAY_EXT:
1230          CHECK_EXTENSION(EXT_secondary_color);
1231          return (ctx->Array.ArrayObj->SecondaryColor.Enabled != 0);
1232 #if FEATURE_point_size_array
1233       case GL_POINT_SIZE_ARRAY_OES:
1234          return (ctx->Array.ArrayObj->PointSize.Enabled != 0);
1235 #endif
1236
1237       /* GL_EXT_histogram */
1238       case GL_HISTOGRAM:
1239          CHECK_EXTENSION(EXT_histogram);
1240          return ctx->Pixel.HistogramEnabled;
1241       case GL_MINMAX:
1242          CHECK_EXTENSION(EXT_histogram);
1243          return ctx->Pixel.MinMaxEnabled;
1244
1245       /* GL_SGI_color_table */
1246       case GL_COLOR_TABLE_SGI:
1247          CHECK_EXTENSION(SGI_color_table);
1248          return ctx->Pixel.ColorTableEnabled[COLORTABLE_PRECONVOLUTION];
1249       case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
1250          CHECK_EXTENSION(SGI_color_table);
1251          return ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCONVOLUTION];
1252       case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
1253          CHECK_EXTENSION(SGI_color_table);
1254          return ctx->Pixel.ColorTableEnabled[COLORTABLE_POSTCOLORMATRIX];
1255
1256       /* GL_SGI_texture_color_table */
1257       case GL_TEXTURE_COLOR_TABLE_SGI:
1258          CHECK_EXTENSION(SGI_texture_color_table);
1259          return ctx->Texture.Unit[ctx->Texture.CurrentUnit].ColorTableEnabled;
1260
1261       /* GL_EXT_convolution */
1262       case GL_CONVOLUTION_1D:
1263          CHECK_EXTENSION(EXT_convolution);
1264          return ctx->Pixel.Convolution1DEnabled;
1265       case GL_CONVOLUTION_2D:
1266          CHECK_EXTENSION(EXT_convolution);
1267          return ctx->Pixel.Convolution2DEnabled;
1268       case GL_SEPARABLE_2D:
1269          CHECK_EXTENSION(EXT_convolution);
1270          return ctx->Pixel.Separable2DEnabled;
1271
1272       /* GL_ARB_texture_cube_map */
1273       case GL_TEXTURE_CUBE_MAP_ARB:
1274          CHECK_EXTENSION(ARB_texture_cube_map);
1275          return is_texture_enabled(ctx, TEXTURE_CUBE_BIT);
1276
1277       /* GL_EXT_secondary_color */
1278       case GL_COLOR_SUM_EXT:
1279          CHECK_EXTENSION2(EXT_secondary_color, ARB_vertex_program);
1280          return ctx->Fog.ColorSumEnabled;
1281
1282       /* GL_ARB_multisample */
1283       case GL_MULTISAMPLE_ARB:
1284          CHECK_EXTENSION(ARB_multisample);
1285          return ctx->Multisample.Enabled;
1286       case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:
1287          CHECK_EXTENSION(ARB_multisample);
1288          return ctx->Multisample.SampleAlphaToCoverage;
1289       case GL_SAMPLE_ALPHA_TO_ONE_ARB:
1290          CHECK_EXTENSION(ARB_multisample);
1291          return ctx->Multisample.SampleAlphaToOne;
1292       case GL_SAMPLE_COVERAGE_ARB:
1293          CHECK_EXTENSION(ARB_multisample);
1294          return ctx->Multisample.SampleCoverage;
1295       case GL_SAMPLE_COVERAGE_INVERT_ARB:
1296          CHECK_EXTENSION(ARB_multisample);
1297          return ctx->Multisample.SampleCoverageInvert;
1298
1299       /* GL_IBM_rasterpos_clip */
1300       case GL_RASTER_POSITION_UNCLIPPED_IBM:
1301          CHECK_EXTENSION(IBM_rasterpos_clip);
1302          return ctx->Transform.RasterPositionUnclipped;
1303
1304       /* GL_NV_point_sprite */
1305       case GL_POINT_SPRITE_NV:
1306          CHECK_EXTENSION2(NV_point_sprite, ARB_point_sprite)
1307          return ctx->Point.PointSprite;
1308
1309 #if FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program
1310       case GL_VERTEX_PROGRAM_ARB:
1311          CHECK_EXTENSION2(ARB_vertex_program, NV_vertex_program);
1312          return ctx->VertexProgram.Enabled;
1313       case GL_VERTEX_PROGRAM_POINT_SIZE_ARB:
1314          CHECK_EXTENSION2(ARB_vertex_program, NV_vertex_program);
1315          return ctx->VertexProgram.PointSizeEnabled;
1316       case GL_VERTEX_PROGRAM_TWO_SIDE_ARB:
1317          CHECK_EXTENSION2(ARB_vertex_program, NV_vertex_program);
1318          return ctx->VertexProgram.TwoSideEnabled;
1319 #endif
1320 #if FEATURE_NV_vertex_program
1321       case GL_VERTEX_ATTRIB_ARRAY0_NV:
1322       case GL_VERTEX_ATTRIB_ARRAY1_NV:
1323       case GL_VERTEX_ATTRIB_ARRAY2_NV:
1324       case GL_VERTEX_ATTRIB_ARRAY3_NV:
1325       case GL_VERTEX_ATTRIB_ARRAY4_NV:
1326       case GL_VERTEX_ATTRIB_ARRAY5_NV:
1327       case GL_VERTEX_ATTRIB_ARRAY6_NV:
1328       case GL_VERTEX_ATTRIB_ARRAY7_NV:
1329       case GL_VERTEX_ATTRIB_ARRAY8_NV:
1330       case GL_VERTEX_ATTRIB_ARRAY9_NV:
1331       case GL_VERTEX_ATTRIB_ARRAY10_NV:
1332       case GL_VERTEX_ATTRIB_ARRAY11_NV:
1333       case GL_VERTEX_ATTRIB_ARRAY12_NV:
1334       case GL_VERTEX_ATTRIB_ARRAY13_NV:
1335       case GL_VERTEX_ATTRIB_ARRAY14_NV:
1336       case GL_VERTEX_ATTRIB_ARRAY15_NV:
1337          CHECK_EXTENSION(NV_vertex_program);
1338          {
1339             GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV;
1340             return (ctx->Array.ArrayObj->VertexAttrib[n].Enabled != 0);
1341          }
1342       case GL_MAP1_VERTEX_ATTRIB0_4_NV:
1343       case GL_MAP1_VERTEX_ATTRIB1_4_NV:
1344       case GL_MAP1_VERTEX_ATTRIB2_4_NV:
1345       case GL_MAP1_VERTEX_ATTRIB3_4_NV:
1346       case GL_MAP1_VERTEX_ATTRIB4_4_NV:
1347       case GL_MAP1_VERTEX_ATTRIB5_4_NV:
1348       case GL_MAP1_VERTEX_ATTRIB6_4_NV:
1349       case GL_MAP1_VERTEX_ATTRIB7_4_NV:
1350       case GL_MAP1_VERTEX_ATTRIB8_4_NV:
1351       case GL_MAP1_VERTEX_ATTRIB9_4_NV:
1352       case GL_MAP1_VERTEX_ATTRIB10_4_NV:
1353       case GL_MAP1_VERTEX_ATTRIB11_4_NV:
1354       case GL_MAP1_VERTEX_ATTRIB12_4_NV:
1355       case GL_MAP1_VERTEX_ATTRIB13_4_NV:
1356       case GL_MAP1_VERTEX_ATTRIB14_4_NV:
1357       case GL_MAP1_VERTEX_ATTRIB15_4_NV:
1358          CHECK_EXTENSION(NV_vertex_program);
1359          {
1360             const GLuint map = (GLuint) (cap - GL_MAP1_VERTEX_ATTRIB0_4_NV);
1361             return ctx->Eval.Map1Attrib[map];
1362          }
1363       case GL_MAP2_VERTEX_ATTRIB0_4_NV:
1364       case GL_MAP2_VERTEX_ATTRIB1_4_NV:
1365       case GL_MAP2_VERTEX_ATTRIB2_4_NV:
1366       case GL_MAP2_VERTEX_ATTRIB3_4_NV:
1367       case GL_MAP2_VERTEX_ATTRIB4_4_NV:
1368       case GL_MAP2_VERTEX_ATTRIB5_4_NV:
1369       case GL_MAP2_VERTEX_ATTRIB6_4_NV:
1370       case GL_MAP2_VERTEX_ATTRIB7_4_NV:
1371       case GL_MAP2_VERTEX_ATTRIB8_4_NV:
1372       case GL_MAP2_VERTEX_ATTRIB9_4_NV:
1373       case GL_MAP2_VERTEX_ATTRIB10_4_NV:
1374       case GL_MAP2_VERTEX_ATTRIB11_4_NV:
1375       case GL_MAP2_VERTEX_ATTRIB12_4_NV:
1376       case GL_MAP2_VERTEX_ATTRIB13_4_NV:
1377       case GL_MAP2_VERTEX_ATTRIB14_4_NV:
1378       case GL_MAP2_VERTEX_ATTRIB15_4_NV:
1379          CHECK_EXTENSION(NV_vertex_program);
1380          {
1381             const GLuint map = (GLuint) (cap - GL_MAP2_VERTEX_ATTRIB0_4_NV);
1382             return ctx->Eval.Map2Attrib[map];
1383          }
1384 #endif /* FEATURE_NV_vertex_program */
1385
1386 #if FEATURE_NV_fragment_program
1387       case GL_FRAGMENT_PROGRAM_NV:
1388          CHECK_EXTENSION(NV_fragment_program);
1389          return ctx->FragmentProgram.Enabled;
1390 #endif /* FEATURE_NV_fragment_program */
1391
1392       /* GL_NV_texture_rectangle */
1393       case GL_TEXTURE_RECTANGLE_NV:
1394          CHECK_EXTENSION(NV_texture_rectangle);
1395          return is_texture_enabled(ctx, TEXTURE_RECT_BIT);
1396
1397       /* GL_EXT_stencil_two_side */
1398       case GL_STENCIL_TEST_TWO_SIDE_EXT:
1399          CHECK_EXTENSION(EXT_stencil_two_side);
1400          return ctx->Stencil.TestTwoSide;
1401
1402 #if FEATURE_ARB_fragment_program
1403       case GL_FRAGMENT_PROGRAM_ARB:
1404          return ctx->FragmentProgram.Enabled;
1405 #endif /* FEATURE_ARB_fragment_program */
1406
1407       /* GL_EXT_depth_bounds_test */
1408       case GL_DEPTH_BOUNDS_TEST_EXT:
1409          CHECK_EXTENSION(EXT_depth_bounds_test);
1410          return ctx->Depth.BoundsTest;
1411
1412       /* GL_MESA_program_debug */
1413       case GL_FRAGMENT_PROGRAM_CALLBACK_MESA:
1414          CHECK_EXTENSION(MESA_program_debug);
1415          return ctx->FragmentProgram.CallbackEnabled;
1416       case GL_VERTEX_PROGRAM_CALLBACK_MESA:
1417          CHECK_EXTENSION(MESA_program_debug);
1418          return ctx->VertexProgram.CallbackEnabled;
1419 #if FEATURE_ATI_fragment_shader
1420       case GL_FRAGMENT_SHADER_ATI:
1421          CHECK_EXTENSION(ATI_fragment_shader);
1422          return ctx->ATIFragmentShader.Enabled;
1423 #endif /* FEATURE_ATI_fragment_shader */
1424       default:
1425          _mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabled(0x%x)", (int) cap);
1426          return GL_FALSE;
1427    }
1428 }