more work on GL_ARB_texture_compression
[mesa.git] / src / mesa / main / enable.c
1 /* $Id: enable.c,v 1.21 2000/05/23 15:17:12 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 (ctx->Extensions.HaveTextureCubeMap) {
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_CUBE;
519 ctx->Enabled |= flag;
520 }
521 else {
522 texUnit->Enabled &= ~TEXTURE0_CUBE;
523 ctx->Enabled &= ~flag;
524 }
525 }
526 }
527 else {
528 if (state)
529 gl_error(ctx, GL_INVALID_ENUM, "glEnable");
530 else
531 gl_error(ctx, GL_INVALID_ENUM, "glDisable");
532 return;
533 }
534 break;
535
536 default:
537 if (state) {
538 gl_error( ctx, GL_INVALID_ENUM, "glEnable" );
539 }
540 else {
541 gl_error( ctx, GL_INVALID_ENUM, "glDisable" );
542 }
543 return;
544 }
545
546 if (ctx->Driver.Enable) {
547 (*ctx->Driver.Enable)( ctx, cap, state );
548 }
549 }
550
551
552
553
554 void
555 _mesa_Enable( GLenum cap )
556 {
557 GET_CURRENT_CONTEXT(ctx);
558 _mesa_set_enable( ctx, cap, GL_TRUE );
559 }
560
561
562
563 void
564 _mesa_Disable( GLenum cap )
565 {
566 GET_CURRENT_CONTEXT(ctx);
567 _mesa_set_enable( ctx, cap, GL_FALSE );
568 }
569
570
571
572 GLboolean
573 _mesa_IsEnabled( GLenum cap )
574 {
575 GET_CURRENT_CONTEXT(ctx);
576 switch (cap) {
577 case GL_ALPHA_TEST:
578 return ctx->Color.AlphaEnabled;
579 case GL_AUTO_NORMAL:
580 return ctx->Eval.AutoNormal;
581 case GL_BLEND:
582 return ctx->Color.BlendEnabled;
583 case GL_CLIP_PLANE0:
584 case GL_CLIP_PLANE1:
585 case GL_CLIP_PLANE2:
586 case GL_CLIP_PLANE3:
587 case GL_CLIP_PLANE4:
588 case GL_CLIP_PLANE5:
589 return ctx->Transform.ClipEnabled[cap-GL_CLIP_PLANE0];
590 case GL_COLOR_MATERIAL:
591 return ctx->Light.ColorMaterialEnabled;
592 case GL_CULL_FACE:
593 return ctx->Polygon.CullFlag;
594 case GL_DEPTH_TEST:
595 return ctx->Depth.Test;
596 case GL_DITHER:
597 return ctx->Color.DitherFlag;
598 case GL_FOG:
599 return ctx->Fog.Enabled;
600 case GL_HISTOGRAM:
601 return ctx->Pixel.HistogramEnabled;
602 case GL_LIGHTING:
603 return ctx->Light.Enabled;
604 case GL_LIGHT0:
605 case GL_LIGHT1:
606 case GL_LIGHT2:
607 case GL_LIGHT3:
608 case GL_LIGHT4:
609 case GL_LIGHT5:
610 case GL_LIGHT6:
611 case GL_LIGHT7:
612 return ctx->Light.Light[cap-GL_LIGHT0].Enabled;
613 case GL_LINE_SMOOTH:
614 return ctx->Line.SmoothFlag;
615 case GL_LINE_STIPPLE:
616 return ctx->Line.StippleFlag;
617 case GL_INDEX_LOGIC_OP:
618 return ctx->Color.IndexLogicOpEnabled;
619 case GL_COLOR_LOGIC_OP:
620 return ctx->Color.ColorLogicOpEnabled;
621 case GL_MAP1_COLOR_4:
622 return ctx->Eval.Map1Color4;
623 case GL_MAP1_INDEX:
624 return ctx->Eval.Map1Index;
625 case GL_MAP1_NORMAL:
626 return ctx->Eval.Map1Normal;
627 case GL_MAP1_TEXTURE_COORD_1:
628 return ctx->Eval.Map1TextureCoord1;
629 case GL_MAP1_TEXTURE_COORD_2:
630 return ctx->Eval.Map1TextureCoord2;
631 case GL_MAP1_TEXTURE_COORD_3:
632 return ctx->Eval.Map1TextureCoord3;
633 case GL_MAP1_TEXTURE_COORD_4:
634 return ctx->Eval.Map1TextureCoord4;
635 case GL_MAP1_VERTEX_3:
636 return ctx->Eval.Map1Vertex3;
637 case GL_MAP1_VERTEX_4:
638 return ctx->Eval.Map1Vertex4;
639 case GL_MAP2_COLOR_4:
640 return ctx->Eval.Map2Color4;
641 case GL_MAP2_INDEX:
642 return ctx->Eval.Map2Index;
643 case GL_MAP2_NORMAL:
644 return ctx->Eval.Map2Normal;
645 case GL_MAP2_TEXTURE_COORD_1:
646 return ctx->Eval.Map2TextureCoord1;
647 case GL_MAP2_TEXTURE_COORD_2:
648 return ctx->Eval.Map2TextureCoord2;
649 case GL_MAP2_TEXTURE_COORD_3:
650 return ctx->Eval.Map2TextureCoord3;
651 case GL_MAP2_TEXTURE_COORD_4:
652 return ctx->Eval.Map2TextureCoord4;
653 case GL_MAP2_VERTEX_3:
654 return ctx->Eval.Map2Vertex3;
655 case GL_MAP2_VERTEX_4:
656 return ctx->Eval.Map2Vertex4;
657 case GL_MINMAX:
658 return ctx->Pixel.MinMaxEnabled;
659 case GL_NORMALIZE:
660 return ctx->Transform.Normalize;
661 case GL_POINT_SMOOTH:
662 return ctx->Point.SmoothFlag;
663 case GL_POLYGON_SMOOTH:
664 return ctx->Polygon.SmoothFlag;
665 case GL_POLYGON_STIPPLE:
666 return ctx->Polygon.StippleFlag;
667 case GL_POLYGON_OFFSET_POINT:
668 return ctx->Polygon.OffsetPoint;
669 case GL_POLYGON_OFFSET_LINE:
670 return ctx->Polygon.OffsetLine;
671 case GL_POLYGON_OFFSET_FILL:
672 /*case GL_POLYGON_OFFSET_EXT:*/
673 return ctx->Polygon.OffsetFill;
674 case GL_RESCALE_NORMAL_EXT:
675 return ctx->Transform.RescaleNormals;
676 case GL_SCISSOR_TEST:
677 return ctx->Scissor.Enabled;
678 case GL_SHARED_TEXTURE_PALETTE_EXT:
679 return ctx->Texture.SharedPalette;
680 case GL_STENCIL_TEST:
681 return ctx->Stencil.Enabled;
682 case GL_TEXTURE_1D:
683 {
684 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
685 return (texUnit->Enabled & TEXTURE0_1D) ? GL_TRUE : GL_FALSE;
686 }
687 case GL_TEXTURE_2D:
688 {
689 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
690 return (texUnit->Enabled & TEXTURE0_2D) ? GL_TRUE : GL_FALSE;
691 }
692 case GL_TEXTURE_3D:
693 {
694 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
695 return (texUnit->Enabled & TEXTURE0_3D) ? GL_TRUE : GL_FALSE;
696 }
697 case GL_TEXTURE_GEN_Q:
698 {
699 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
700 return (texUnit->TexGenEnabled & Q_BIT) ? GL_TRUE : GL_FALSE;
701 }
702 case GL_TEXTURE_GEN_R:
703 {
704 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
705 return (texUnit->TexGenEnabled & R_BIT) ? GL_TRUE : GL_FALSE;
706 }
707 case GL_TEXTURE_GEN_S:
708 {
709 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
710 return (texUnit->TexGenEnabled & S_BIT) ? GL_TRUE : GL_FALSE;
711 }
712 case GL_TEXTURE_GEN_T:
713 {
714 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
715 return (texUnit->TexGenEnabled & T_BIT) ? GL_TRUE : GL_FALSE;
716 }
717
718 /*
719 * CLIENT STATE!!!
720 */
721 case GL_VERTEX_ARRAY:
722 return ctx->Array.Vertex.Enabled;
723 case GL_NORMAL_ARRAY:
724 return ctx->Array.Normal.Enabled;
725 case GL_COLOR_ARRAY:
726 return ctx->Array.Color.Enabled;
727 case GL_INDEX_ARRAY:
728 return ctx->Array.Index.Enabled;
729 case GL_TEXTURE_COORD_ARRAY:
730 return ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled;
731 case GL_EDGE_FLAG_ARRAY:
732 return ctx->Array.EdgeFlag.Enabled;
733
734 /* GL_HP_occlusion_test */
735 case GL_OCCLUSION_TEST_HP:
736 if (ctx->Extensions.HaveHpOcclusionTest) {
737 return ctx->Depth.OcclusionTest;
738 }
739 else {
740 gl_error( ctx, GL_INVALID_ENUM, "glIsEnabled" );
741 return GL_FALSE;
742 }
743
744 /* GL_SGIS_pixel_texture */
745 case GL_PIXEL_TEXTURE_SGIS:
746 return ctx->Pixel.PixelTextureEnabled;
747
748 /* GL_SGIX_pixel_texture */
749 case GL_PIXEL_TEX_GEN_SGIX:
750 return ctx->Pixel.PixelTextureEnabled;
751
752 /* GL_SGI_color_table */
753 case GL_COLOR_TABLE_SGI:
754 return ctx->Pixel.ColorTableEnabled;
755 case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
756 return ctx->Pixel.PostConvolutionColorTableEnabled;
757 case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
758 return ctx->Pixel.PostColorMatrixColorTableEnabled;
759
760 /* GL_EXT_convolution */
761 case GL_CONVOLUTION_1D:
762 return ctx->Pixel.Convolution1DEnabled;
763 case GL_CONVOLUTION_2D:
764 return ctx->Pixel.Convolution2DEnabled;
765 case GL_SEPARABLE_2D:
766 return ctx->Pixel.Separable2DEnabled;
767
768 /* GL_ARB_texture_cube_map */
769 case GL_TEXTURE_CUBE_MAP_ARB:
770 if (ctx->Extensions.HaveTextureCubeMap) {
771 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
772 return (texUnit->Enabled & TEXTURE0_CUBE) ? GL_TRUE : GL_FALSE;
773 }
774 else {
775 gl_error(ctx, GL_INVALID_ENUM, "glIsEnabled");
776 return GL_FALSE;
777 }
778
779 default:
780 gl_error( ctx, GL_INVALID_ENUM, "glIsEnabled" );
781 return GL_FALSE;
782 }
783 }
784
785
786
787
788 static void
789 client_state( GLcontext *ctx, GLenum cap, GLboolean state )
790 {
791 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx,
792 (state
793 ? "glEnableClientState"
794 : "glDisableClientState") );
795
796 switch (cap) {
797 case GL_VERTEX_ARRAY:
798 ctx->Array.Vertex.Enabled = state;
799 break;
800 case GL_NORMAL_ARRAY:
801 ctx->Array.Normal.Enabled = state;
802 break;
803 case GL_COLOR_ARRAY:
804 ctx->Array.Color.Enabled = state;
805 break;
806 case GL_INDEX_ARRAY:
807 ctx->Array.Index.Enabled = state;
808 break;
809 case GL_TEXTURE_COORD_ARRAY:
810 ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled = state;
811 break;
812 case GL_EDGE_FLAG_ARRAY:
813 ctx->Array.EdgeFlag.Enabled = state;
814 break;
815 default:
816 gl_error( ctx, GL_INVALID_ENUM, "glEnable/DisableClientState" );
817 }
818
819 ctx->NewState |= NEW_CLIENT_STATE;
820 }
821
822
823
824 void
825 _mesa_EnableClientState( GLenum cap )
826 {
827 GET_CURRENT_CONTEXT(ctx);
828 client_state( ctx, cap, GL_TRUE );
829 }
830
831
832
833 void
834 _mesa_DisableClientState( GLenum cap )
835 {
836 GET_CURRENT_CONTEXT(ctx);
837 client_state( ctx, cap, GL_FALSE );
838 }
839