b4df44de34fd3a273145ac2f2b8713635303e68f
[mesa.git] / src / mesa / main / enable.c
1 /* $Id: enable.c,v 1.20 2000/05/22 16:33:21 brianp Exp $ */
2
3 /*
4 * Mesa 3-D graphics library
5 * Version: 3.3
6 *
7 * Copyright (C) 1999 Brian Paul All Rights Reserved.
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
28 #ifdef PC_HEADER
29 #include "all.h"
30 #else
31 #include "glheader.h"
32 #include "context.h"
33 #include "enable.h"
34 #include "light.h"
35 #include "macros.h"
36 #include "matrix.h"
37 #include "mmath.h"
38 #include "simple_list.h"
39 #include "types.h"
40 #include "vbfill.h"
41 #include "xform.h"
42 #include "enums.h"
43 #endif
44
45
46
47 /*
48 * Perform glEnable and glDisable calls.
49 */
50 void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state )
51 {
52 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx, "gl_enable/disable" );
53
54 if (MESA_VERBOSE & VERBOSE_API)
55 fprintf(stderr, "%s %s (newstate is %x)\n",
56 state ? "glEnable" : "glDisable",
57 gl_lookup_enum_by_nr(cap),
58 ctx->NewState);
59
60 switch (cap) {
61 case GL_ALPHA_TEST:
62 if (ctx->Color.AlphaEnabled!=state) {
63 ctx->Color.AlphaEnabled = state;
64 ctx->NewState |= NEW_RASTER_OPS;
65 }
66 break;
67 case GL_AUTO_NORMAL:
68 ctx->Eval.AutoNormal = state;
69 break;
70 case GL_BLEND:
71 if (ctx->Color.BlendEnabled!=state) {
72 ctx->Color.BlendEnabled = state;
73 /* The following needed to accomodate 1.0 RGB logic op blending */
74 if (ctx->Color.BlendEquation==GL_LOGIC_OP && state) {
75 ctx->Color.ColorLogicOpEnabled = GL_TRUE;
76 }
77 else {
78 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
79 }
80 ctx->NewState |= NEW_RASTER_OPS;
81 }
82 break;
83 case GL_CLIP_PLANE0:
84 case GL_CLIP_PLANE1:
85 case GL_CLIP_PLANE2:
86 case GL_CLIP_PLANE3:
87 case GL_CLIP_PLANE4:
88 case GL_CLIP_PLANE5:
89 if (cap >= GL_CLIP_PLANE0 &&
90 cap <= GL_CLIP_PLANE5 &&
91 ctx->Transform.ClipEnabled[cap-GL_CLIP_PLANE0] != state)
92 {
93 GLuint p = cap-GL_CLIP_PLANE0;
94
95 ctx->Transform.ClipEnabled[p] = state;
96 ctx->NewState |= NEW_USER_CLIP;
97
98 if (state) {
99 ctx->Enabled |= ENABLE_USERCLIP;
100 ctx->Transform.AnyClip++;
101
102 if (ctx->ProjectionMatrix.flags & MAT_DIRTY_ALL_OVER) {
103 gl_matrix_analyze( &ctx->ProjectionMatrix );
104 }
105
106 gl_transform_vector( ctx->Transform.ClipUserPlane[p],
107 ctx->Transform.EyeUserPlane[p],
108 ctx->ProjectionMatrix.inv );
109 } else {
110 if (--ctx->Transform.AnyClip == 0)
111 ctx->Enabled &= ~ENABLE_USERCLIP;
112 }
113 }
114 break;
115 case GL_COLOR_MATERIAL:
116 if (ctx->Light.ColorMaterialEnabled!=state) {
117 ctx->Light.ColorMaterialEnabled = state;
118 ctx->NewState |= NEW_LIGHTING;
119 if (state)
120 gl_update_color_material( ctx, ctx->Current.ByteColor );
121 }
122 break;
123 case GL_CULL_FACE:
124 if (ctx->Polygon.CullFlag!=state) {
125 ctx->Polygon.CullFlag = state;
126 ctx->TriangleCaps ^= DD_TRI_CULL;
127 ctx->NewState |= NEW_POLYGON;
128 }
129 break;
130 case GL_DEPTH_TEST:
131 if (state && ctx->Visual->DepthBits==0) {
132 gl_warning(ctx,"glEnable(GL_DEPTH_TEST) but no depth buffer");
133 return;
134 }
135 if (ctx->Depth.Test!=state) {
136 ctx->Depth.Test = state;
137 ctx->NewState |= NEW_RASTER_OPS;
138 }
139 break;
140 case GL_DITHER:
141 if (ctx->NoDither) {
142 /* MESA_NO_DITHER env var */
143 state = GL_FALSE;
144 }
145 if (ctx->Color.DitherFlag!=state) {
146 ctx->Color.DitherFlag = state;
147 ctx->NewState |= NEW_RASTER_OPS;
148 }
149 break;
150 case GL_FOG:
151 if (ctx->Fog.Enabled!=state) {
152 ctx->Fog.Enabled = state;
153 ctx->Enabled ^= ENABLE_FOG;
154 ctx->NewState |= NEW_FOG|NEW_RASTER_OPS;
155 }
156 break;
157 case GL_HISTOGRAM:
158 ctx->Pixel.HistogramEnabled = state;
159 break;
160 case GL_LIGHT0:
161 case GL_LIGHT1:
162 case GL_LIGHT2:
163 case GL_LIGHT3:
164 case GL_LIGHT4:
165 case GL_LIGHT5:
166 case GL_LIGHT6:
167 case GL_LIGHT7:
168 if (ctx->Light.Light[cap-GL_LIGHT0].Enabled != state)
169 {
170 ctx->Light.Light[cap-GL_LIGHT0].Enabled = state;
171
172 if (state) {
173 insert_at_tail(&ctx->Light.EnabledList,
174 &ctx->Light.Light[cap-GL_LIGHT0]);
175 if (ctx->Light.Enabled)
176 ctx->Enabled |= ENABLE_LIGHT;
177 } else {
178 remove_from_list(&ctx->Light.Light[cap-GL_LIGHT0]);
179 if (is_empty_list(&ctx->Light.EnabledList))
180 ctx->Enabled &= ~ENABLE_LIGHT;
181 }
182
183 ctx->NewState |= NEW_LIGHTING;
184 }
185 break;
186 case GL_LIGHTING:
187 if (ctx->Light.Enabled!=state) {
188 ctx->Light.Enabled = state;
189 ctx->Enabled &= ~ENABLE_LIGHT;
190 if (state)
191 ctx->Enabled |= ENABLE_LIGHT;
192 ctx->NewState |= NEW_LIGHTING;
193 }
194 break;
195 case GL_LINE_SMOOTH:
196 if (ctx->Line.SmoothFlag!=state) {
197 ctx->Line.SmoothFlag = state;
198 ctx->TriangleCaps ^= DD_LINE_SMOOTH;
199 ctx->NewState |= NEW_RASTER_OPS;
200 }
201 break;
202 case GL_LINE_STIPPLE:
203 if (ctx->Line.StippleFlag!=state) {
204 ctx->Line.StippleFlag = state;
205 ctx->TriangleCaps ^= DD_LINE_STIPPLE;
206 ctx->NewState |= NEW_RASTER_OPS;
207 }
208 break;
209 case GL_INDEX_LOGIC_OP:
210 if (ctx->Color.IndexLogicOpEnabled!=state) {
211 ctx->Color.IndexLogicOpEnabled = state;
212 ctx->NewState |= NEW_RASTER_OPS;
213 }
214 break;
215 case GL_COLOR_LOGIC_OP:
216 if (ctx->Color.ColorLogicOpEnabled!=state) {
217 ctx->Color.ColorLogicOpEnabled = state;
218 ctx->NewState |= NEW_RASTER_OPS;
219 }
220 break;
221 case GL_MAP1_COLOR_4:
222 ctx->Eval.Map1Color4 = state;
223 break;
224 case GL_MAP1_INDEX:
225 ctx->Eval.Map1Index = state;
226 break;
227 case GL_MAP1_NORMAL:
228 ctx->Eval.Map1Normal = state;
229 break;
230 case GL_MAP1_TEXTURE_COORD_1:
231 ctx->Eval.Map1TextureCoord1 = state;
232 break;
233 case GL_MAP1_TEXTURE_COORD_2:
234 ctx->Eval.Map1TextureCoord2 = state;
235 break;
236 case GL_MAP1_TEXTURE_COORD_3:
237 ctx->Eval.Map1TextureCoord3 = state;
238 break;
239 case GL_MAP1_TEXTURE_COORD_4:
240 ctx->Eval.Map1TextureCoord4 = state;
241 break;
242 case GL_MAP1_VERTEX_3:
243 ctx->Eval.Map1Vertex3 = state;
244 break;
245 case GL_MAP1_VERTEX_4:
246 ctx->Eval.Map1Vertex4 = state;
247 break;
248 case GL_MAP2_COLOR_4:
249 ctx->Eval.Map2Color4 = state;
250 break;
251 case GL_MAP2_INDEX:
252 ctx->Eval.Map2Index = state;
253 break;
254 case GL_MAP2_NORMAL:
255 ctx->Eval.Map2Normal = state;
256 break;
257 case GL_MAP2_TEXTURE_COORD_1:
258 ctx->Eval.Map2TextureCoord1 = state;
259 break;
260 case GL_MAP2_TEXTURE_COORD_2:
261 ctx->Eval.Map2TextureCoord2 = state;
262 break;
263 case GL_MAP2_TEXTURE_COORD_3:
264 ctx->Eval.Map2TextureCoord3 = state;
265 break;
266 case GL_MAP2_TEXTURE_COORD_4:
267 ctx->Eval.Map2TextureCoord4 = state;
268 break;
269 case GL_MAP2_VERTEX_3:
270 ctx->Eval.Map2Vertex3 = state;
271 break;
272 case GL_MAP2_VERTEX_4:
273 ctx->Eval.Map2Vertex4 = state;
274 break;
275 case GL_MINMAX:
276 ctx->Pixel.MinMaxEnabled = state;
277 break;
278 case GL_NORMALIZE:
279 if (ctx->Transform.Normalize != state) {
280 ctx->Transform.Normalize = state;
281 ctx->NewState |= NEW_NORMAL_TRANSFORM|NEW_LIGHTING;
282 ctx->Enabled ^= ENABLE_NORMALIZE;
283 }
284 break;
285 case GL_POINT_SMOOTH:
286 if (ctx->Point.SmoothFlag!=state) {
287 ctx->Point.SmoothFlag = state;
288 ctx->NewState |= NEW_RASTER_OPS;
289 }
290 break;
291 case GL_POLYGON_SMOOTH:
292 if (ctx->Polygon.SmoothFlag!=state) {
293 ctx->Polygon.SmoothFlag = state;
294 ctx->NewState |= NEW_RASTER_OPS;
295 }
296 break;
297 case GL_POLYGON_STIPPLE:
298 if (ctx->Polygon.StippleFlag!=state) {
299 ctx->Polygon.StippleFlag = state;
300 ctx->TriangleCaps ^= DD_TRI_STIPPLE;
301 ctx->NewState |= NEW_RASTER_OPS;
302 }
303 break;
304 case GL_POLYGON_OFFSET_POINT:
305 if (ctx->Polygon.OffsetPoint!=state) {
306 ctx->Polygon.OffsetPoint = state;
307 ctx->NewState |= NEW_POLYGON;
308 }
309 break;
310 case GL_POLYGON_OFFSET_LINE:
311 if (ctx->Polygon.OffsetLine!=state) {
312 ctx->Polygon.OffsetLine = state;
313 ctx->NewState |= NEW_POLYGON;
314 }
315 break;
316 case GL_POLYGON_OFFSET_FILL:
317 /*case GL_POLYGON_OFFSET_EXT:*/
318 if (ctx->Polygon.OffsetFill!=state) {
319 ctx->Polygon.OffsetFill = state;
320 ctx->NewState |= NEW_POLYGON;
321 }
322 break;
323 case GL_RESCALE_NORMAL_EXT:
324 if (ctx->Transform.RescaleNormals != state) {
325 ctx->Transform.RescaleNormals = state;
326 ctx->NewState |= NEW_NORMAL_TRANSFORM|NEW_LIGHTING;
327 ctx->Enabled ^= ENABLE_RESCALE;
328 }
329 break;
330 case GL_SCISSOR_TEST:
331 if (ctx->Scissor.Enabled!=state) {
332 ctx->Scissor.Enabled = state;
333 ctx->NewState |= NEW_RASTER_OPS;
334 }
335 break;
336 case GL_SHARED_TEXTURE_PALETTE_EXT:
337 ctx->Texture.SharedPalette = state;
338 break;
339 case GL_STENCIL_TEST:
340 if (state && ctx->Visual->StencilBits==0) {
341 gl_warning(ctx, "glEnable(GL_STENCIL_TEST) but no stencil buffer");
342 return;
343 }
344 if (ctx->Stencil.Enabled!=state) {
345 ctx->Stencil.Enabled = state;
346 ctx->NewState |= NEW_RASTER_OPS;
347 ctx->TriangleCaps ^= DD_STENCIL;
348 }
349 break;
350 case GL_TEXTURE_1D:
351 if (ctx->Visual->RGBAflag) {
352 const GLuint curr = ctx->Texture.CurrentUnit;
353 const GLuint flag = TEXTURE0_1D << (curr * 4);
354 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
355 ctx->NewState |= NEW_TEXTURE_ENABLE;
356 if (state) {
357 texUnit->Enabled |= TEXTURE0_1D;
358 ctx->Enabled |= flag;
359 }
360 else {
361 texUnit->Enabled &= ~TEXTURE0_1D;
362 ctx->Enabled &= ~flag;
363 }
364 }
365 break;
366 case GL_TEXTURE_2D:
367 if (ctx->Visual->RGBAflag) {
368 const GLuint curr = ctx->Texture.CurrentUnit;
369 const GLuint flag = TEXTURE0_2D << (curr * 4);
370 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
371 ctx->NewState |= NEW_TEXTURE_ENABLE;
372 if (state) {
373 texUnit->Enabled |= TEXTURE0_2D;
374 ctx->Enabled |= flag;
375 }
376 else {
377 texUnit->Enabled &= ~TEXTURE0_2D;
378 ctx->Enabled &= ~flag;
379 }
380 }
381 break;
382 case GL_TEXTURE_3D:
383 if (ctx->Visual->RGBAflag) {
384 const GLuint curr = ctx->Texture.CurrentUnit;
385 const GLuint flag = TEXTURE0_3D << (curr * 4);
386 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
387 ctx->NewState |= NEW_TEXTURE_ENABLE;
388 if (state) {
389 texUnit->Enabled |= TEXTURE0_3D;
390 ctx->Enabled |= flag;
391 }
392 else {
393 texUnit->Enabled &= ~TEXTURE0_3D;
394 ctx->Enabled &= ~flag;
395 }
396 }
397 break;
398 case GL_TEXTURE_GEN_Q:
399 {
400 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
401 if (state)
402 texUnit->TexGenEnabled |= Q_BIT;
403 else
404 texUnit->TexGenEnabled &= ~Q_BIT;
405 ctx->NewState |= NEW_TEXTURING;
406 }
407 break;
408 case GL_TEXTURE_GEN_R:
409 {
410 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
411 if (state)
412 texUnit->TexGenEnabled |= R_BIT;
413 else
414 texUnit->TexGenEnabled &= ~R_BIT;
415 ctx->NewState |= NEW_TEXTURING;
416 }
417 break;
418 case GL_TEXTURE_GEN_S:
419 {
420 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
421 if (state)
422 texUnit->TexGenEnabled |= S_BIT;
423 else
424 texUnit->TexGenEnabled &= ~S_BIT;
425 ctx->NewState |= NEW_TEXTURING;
426 }
427 break;
428 case GL_TEXTURE_GEN_T:
429 {
430 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
431 if (state)
432 texUnit->TexGenEnabled |= T_BIT;
433 else
434 texUnit->TexGenEnabled &= ~T_BIT;
435 ctx->NewState |= NEW_TEXTURING;
436 }
437 break;
438
439 /*
440 * CLIENT STATE!!!
441 */
442 case GL_VERTEX_ARRAY:
443 ctx->Array.Vertex.Enabled = state;
444 break;
445 case GL_NORMAL_ARRAY:
446 ctx->Array.Normal.Enabled = state;
447 break;
448 case GL_COLOR_ARRAY:
449 ctx->Array.Color.Enabled = state;
450 break;
451 case GL_INDEX_ARRAY:
452 ctx->Array.Index.Enabled = state;
453 break;
454 case GL_TEXTURE_COORD_ARRAY:
455 ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled = state;
456 break;
457 case GL_EDGE_FLAG_ARRAY:
458 ctx->Array.EdgeFlag.Enabled = state;
459 break;
460
461 /* GL_HP_occlusion_test */
462 case GL_OCCLUSION_TEST_HP:
463 if (ctx->Extensions.HaveHpOcclusionTest) {
464 ctx->Depth.OcclusionTest = state;
465 if (state)
466 ctx->OcclusionResult = ctx->OcclusionResultSaved;
467 else
468 ctx->OcclusionResultSaved = ctx->OcclusionResult;
469 ctx->NewState |= NEW_RASTER_OPS;
470 }
471 else {
472 gl_error( ctx, GL_INVALID_ENUM, state ? "glEnable": "glDisable" );
473 return;
474 }
475 break;
476
477 /* GL_SGIS_pixel_texture */
478 case GL_PIXEL_TEXTURE_SGIS:
479 ctx->Pixel.PixelTextureEnabled = state;
480 break;
481
482 /* GL_SGIX_pixel_texture */
483 case GL_PIXEL_TEX_GEN_SGIX:
484 ctx->Pixel.PixelTextureEnabled = state;
485 break;
486
487 /* GL_SGI_color_table */
488 case GL_COLOR_TABLE_SGI:
489 ctx->Pixel.ColorTableEnabled = state;
490 break;
491 case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
492 ctx->Pixel.PostConvolutionColorTableEnabled = state;
493 break;
494 case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
495 ctx->Pixel.PostColorMatrixColorTableEnabled = state;
496 break;
497
498 /* GL_EXT_convolution */
499 case GL_CONVOLUTION_1D:
500 ctx->Pixel.Convolution1DEnabled = state;
501 break;
502 case GL_CONVOLUTION_2D:
503 ctx->Pixel.Convolution2DEnabled = state;
504 break;
505 case GL_SEPARABLE_2D:
506 ctx->Pixel.Separable2DEnabled = state;
507 break;
508
509 /* GL_ARB_texture_cube_map */
510 case GL_TEXTURE_CUBE_MAP_ARB:
511 #if 0
512 if (ctx->Visual->RGBAflag) {
513 const GLuint curr = ctx->Texture.CurrentUnit;
514 const GLuint flag = TEXTURE0_CUBE << (curr * 4);
515 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
516 ctx->NewState |= NEW_TEXTURE_ENABLE;
517 if (state) {
518 texUnit->Enabled |= TEXTURE0_2D;
519 ctx->Enabled |= flag;
520 }
521 else {
522 texUnit->Enabled &= ~TEXTURE0_2D;
523 ctx->Enabled &= ~flag;
524 }
525 }
526 break;
527 #endif
528
529 default:
530 if (state) {
531 gl_error( ctx, GL_INVALID_ENUM, "glEnable" );
532 }
533 else {
534 gl_error( ctx, GL_INVALID_ENUM, "glDisable" );
535 }
536 return;
537 }
538
539 if (ctx->Driver.Enable) {
540 (*ctx->Driver.Enable)( ctx, cap, state );
541 }
542 }
543
544
545
546
547 void
548 _mesa_Enable( GLenum cap )
549 {
550 GET_CURRENT_CONTEXT(ctx);
551 _mesa_set_enable( ctx, cap, GL_TRUE );
552 }
553
554
555
556 void
557 _mesa_Disable( GLenum cap )
558 {
559 GET_CURRENT_CONTEXT(ctx);
560 _mesa_set_enable( ctx, cap, GL_FALSE );
561 }
562
563
564
565 GLboolean
566 _mesa_IsEnabled( GLenum cap )
567 {
568 GET_CURRENT_CONTEXT(ctx);
569 switch (cap) {
570 case GL_ALPHA_TEST:
571 return ctx->Color.AlphaEnabled;
572 case GL_AUTO_NORMAL:
573 return ctx->Eval.AutoNormal;
574 case GL_BLEND:
575 return ctx->Color.BlendEnabled;
576 case GL_CLIP_PLANE0:
577 case GL_CLIP_PLANE1:
578 case GL_CLIP_PLANE2:
579 case GL_CLIP_PLANE3:
580 case GL_CLIP_PLANE4:
581 case GL_CLIP_PLANE5:
582 return ctx->Transform.ClipEnabled[cap-GL_CLIP_PLANE0];
583 case GL_COLOR_MATERIAL:
584 return ctx->Light.ColorMaterialEnabled;
585 case GL_CULL_FACE:
586 return ctx->Polygon.CullFlag;
587 case GL_DEPTH_TEST:
588 return ctx->Depth.Test;
589 case GL_DITHER:
590 return ctx->Color.DitherFlag;
591 case GL_FOG:
592 return ctx->Fog.Enabled;
593 case GL_HISTOGRAM:
594 return ctx->Pixel.HistogramEnabled;
595 case GL_LIGHTING:
596 return ctx->Light.Enabled;
597 case GL_LIGHT0:
598 case GL_LIGHT1:
599 case GL_LIGHT2:
600 case GL_LIGHT3:
601 case GL_LIGHT4:
602 case GL_LIGHT5:
603 case GL_LIGHT6:
604 case GL_LIGHT7:
605 return ctx->Light.Light[cap-GL_LIGHT0].Enabled;
606 case GL_LINE_SMOOTH:
607 return ctx->Line.SmoothFlag;
608 case GL_LINE_STIPPLE:
609 return ctx->Line.StippleFlag;
610 case GL_INDEX_LOGIC_OP:
611 return ctx->Color.IndexLogicOpEnabled;
612 case GL_COLOR_LOGIC_OP:
613 return ctx->Color.ColorLogicOpEnabled;
614 case GL_MAP1_COLOR_4:
615 return ctx->Eval.Map1Color4;
616 case GL_MAP1_INDEX:
617 return ctx->Eval.Map1Index;
618 case GL_MAP1_NORMAL:
619 return ctx->Eval.Map1Normal;
620 case GL_MAP1_TEXTURE_COORD_1:
621 return ctx->Eval.Map1TextureCoord1;
622 case GL_MAP1_TEXTURE_COORD_2:
623 return ctx->Eval.Map1TextureCoord2;
624 case GL_MAP1_TEXTURE_COORD_3:
625 return ctx->Eval.Map1TextureCoord3;
626 case GL_MAP1_TEXTURE_COORD_4:
627 return ctx->Eval.Map1TextureCoord4;
628 case GL_MAP1_VERTEX_3:
629 return ctx->Eval.Map1Vertex3;
630 case GL_MAP1_VERTEX_4:
631 return ctx->Eval.Map1Vertex4;
632 case GL_MAP2_COLOR_4:
633 return ctx->Eval.Map2Color4;
634 case GL_MAP2_INDEX:
635 return ctx->Eval.Map2Index;
636 case GL_MAP2_NORMAL:
637 return ctx->Eval.Map2Normal;
638 case GL_MAP2_TEXTURE_COORD_1:
639 return ctx->Eval.Map2TextureCoord1;
640 case GL_MAP2_TEXTURE_COORD_2:
641 return ctx->Eval.Map2TextureCoord2;
642 case GL_MAP2_TEXTURE_COORD_3:
643 return ctx->Eval.Map2TextureCoord3;
644 case GL_MAP2_TEXTURE_COORD_4:
645 return ctx->Eval.Map2TextureCoord4;
646 case GL_MAP2_VERTEX_3:
647 return ctx->Eval.Map2Vertex3;
648 case GL_MAP2_VERTEX_4:
649 return ctx->Eval.Map2Vertex4;
650 case GL_MINMAX:
651 return ctx->Pixel.MinMaxEnabled;
652 case GL_NORMALIZE:
653 return ctx->Transform.Normalize;
654 case GL_POINT_SMOOTH:
655 return ctx->Point.SmoothFlag;
656 case GL_POLYGON_SMOOTH:
657 return ctx->Polygon.SmoothFlag;
658 case GL_POLYGON_STIPPLE:
659 return ctx->Polygon.StippleFlag;
660 case GL_POLYGON_OFFSET_POINT:
661 return ctx->Polygon.OffsetPoint;
662 case GL_POLYGON_OFFSET_LINE:
663 return ctx->Polygon.OffsetLine;
664 case GL_POLYGON_OFFSET_FILL:
665 /*case GL_POLYGON_OFFSET_EXT:*/
666 return ctx->Polygon.OffsetFill;
667 case GL_RESCALE_NORMAL_EXT:
668 return ctx->Transform.RescaleNormals;
669 case GL_SCISSOR_TEST:
670 return ctx->Scissor.Enabled;
671 case GL_SHARED_TEXTURE_PALETTE_EXT:
672 return ctx->Texture.SharedPalette;
673 case GL_STENCIL_TEST:
674 return ctx->Stencil.Enabled;
675 case GL_TEXTURE_1D:
676 {
677 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
678 return (texUnit->Enabled & TEXTURE0_1D) ? GL_TRUE : GL_FALSE;
679 }
680 case GL_TEXTURE_2D:
681 {
682 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
683 return (texUnit->Enabled & TEXTURE0_2D) ? GL_TRUE : GL_FALSE;
684 }
685 case GL_TEXTURE_3D:
686 {
687 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
688 return (texUnit->Enabled & TEXTURE0_3D) ? GL_TRUE : GL_FALSE;
689 }
690 case GL_TEXTURE_GEN_Q:
691 {
692 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
693 return (texUnit->TexGenEnabled & Q_BIT) ? GL_TRUE : GL_FALSE;
694 }
695 case GL_TEXTURE_GEN_R:
696 {
697 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
698 return (texUnit->TexGenEnabled & R_BIT) ? GL_TRUE : GL_FALSE;
699 }
700 case GL_TEXTURE_GEN_S:
701 {
702 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
703 return (texUnit->TexGenEnabled & S_BIT) ? GL_TRUE : GL_FALSE;
704 }
705 case GL_TEXTURE_GEN_T:
706 {
707 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
708 return (texUnit->TexGenEnabled & T_BIT) ? GL_TRUE : GL_FALSE;
709 }
710
711 /*
712 * CLIENT STATE!!!
713 */
714 case GL_VERTEX_ARRAY:
715 return ctx->Array.Vertex.Enabled;
716 case GL_NORMAL_ARRAY:
717 return ctx->Array.Normal.Enabled;
718 case GL_COLOR_ARRAY:
719 return ctx->Array.Color.Enabled;
720 case GL_INDEX_ARRAY:
721 return ctx->Array.Index.Enabled;
722 case GL_TEXTURE_COORD_ARRAY:
723 return ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled;
724 case GL_EDGE_FLAG_ARRAY:
725 return ctx->Array.EdgeFlag.Enabled;
726
727 /* GL_HP_occlusion_test */
728 case GL_OCCLUSION_TEST_HP:
729 if (ctx->Extensions.HaveHpOcclusionTest) {
730 return ctx->Depth.OcclusionTest;
731 }
732 else {
733 gl_error( ctx, GL_INVALID_ENUM, "glIsEnabled" );
734 return GL_FALSE;
735 }
736
737 /* GL_SGIS_pixel_texture */
738 case GL_PIXEL_TEXTURE_SGIS:
739 return ctx->Pixel.PixelTextureEnabled;
740
741 /* GL_SGIX_pixel_texture */
742 case GL_PIXEL_TEX_GEN_SGIX:
743 return ctx->Pixel.PixelTextureEnabled;
744
745 /* GL_SGI_color_table */
746 case GL_COLOR_TABLE_SGI:
747 return ctx->Pixel.ColorTableEnabled;
748 case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
749 return ctx->Pixel.PostConvolutionColorTableEnabled;
750 case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
751 return ctx->Pixel.PostColorMatrixColorTableEnabled;
752
753 /* GL_EXT_convolution */
754 case GL_CONVOLUTION_1D:
755 return ctx->Pixel.Convolution1DEnabled;
756 case GL_CONVOLUTION_2D:
757 return ctx->Pixel.Convolution2DEnabled;
758 case GL_SEPARABLE_2D:
759 return ctx->Pixel.Separable2DEnabled;
760
761 /* GL_ARB_texture_cube_map */
762 case GL_TEXTURE_CUBE_MAP_ARB:
763 #if 0
764 if (ctx->Visual->RGBAflag) {
765 const GLuint curr = ctx->Texture.CurrentUnit;
766 const GLuint flag = TEXTURE0_CUBE << (curr * 4);
767 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
768 ctx->NewState |= NEW_TEXTURE_ENABLE;
769 if (state) {
770 texUnit->Enabled |= TEXTURE0_2D;
771 ctx->Enabled |= flag;
772 }
773 else {
774 texUnit->Enabled &= ~TEXTURE0_2D;
775 ctx->Enabled &= ~flag;
776 }
777 }
778 break;
779 #endif
780
781 default:
782 gl_error( ctx, GL_INVALID_ENUM, "glIsEnabled" );
783 return GL_FALSE;
784 }
785 }
786
787
788
789
790 static void
791 client_state( GLcontext *ctx, GLenum cap, GLboolean state )
792 {
793 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx,
794 (state
795 ? "glEnableClientState"
796 : "glDisableClientState") );
797
798 switch (cap) {
799 case GL_VERTEX_ARRAY:
800 ctx->Array.Vertex.Enabled = state;
801 break;
802 case GL_NORMAL_ARRAY:
803 ctx->Array.Normal.Enabled = state;
804 break;
805 case GL_COLOR_ARRAY:
806 ctx->Array.Color.Enabled = state;
807 break;
808 case GL_INDEX_ARRAY:
809 ctx->Array.Index.Enabled = state;
810 break;
811 case GL_TEXTURE_COORD_ARRAY:
812 ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled = state;
813 break;
814 case GL_EDGE_FLAG_ARRAY:
815 ctx->Array.EdgeFlag.Enabled = state;
816 break;
817 default:
818 gl_error( ctx, GL_INVALID_ENUM, "glEnable/DisableClientState" );
819 }
820
821 ctx->NewState |= NEW_CLIENT_STATE;
822 }
823
824
825
826 void
827 _mesa_EnableClientState( GLenum cap )
828 {
829 GET_CURRENT_CONTEXT(ctx);
830 client_state( ctx, cap, GL_TRUE );
831 }
832
833
834
835 void
836 _mesa_DisableClientState( GLenum cap )
837 {
838 GET_CURRENT_CONTEXT(ctx);
839 client_state( ctx, cap, GL_FALSE );
840 }
841