Subversion Repositories Kolibri OS

Rev

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

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