blob: ac916d6a41b0ef7de73763a4f6ad6eb6722357e6 [file] [log] [blame]
Keith Whitwell1bf9dfa1999-09-18 20:41:22 +00001/* $Id: enable.c,v 1.5 1999/09/18 20:41:23 keithw Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
5 * Version: 3.1
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 <string.h>
32#include <stdio.h>
33#include "context.h"
34#include "enable.h"
35#include "light.h"
36#include "macros.h"
37#include "matrix.h"
38#include "mmath.h"
39#include "simple_list.h"
40#include "types.h"
41#include "vbfill.h"
42#include "xform.h"
43#include "enums.h"
44#ifdef XFree86Server
45#include "GL/xf86glx.h"
46#endif
47#endif
48
49
50
51/*
52 * Perform glEnable and glDisable calls.
53 */
54void gl_set_enable( GLcontext *ctx, GLenum cap, GLboolean state )
55{
56 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx, "gl_enable/disable" );
57
58 if (MESA_VERBOSE & VERBOSE_API)
Keith Whitwell2be79c11999-08-26 14:50:49 +000059 fprintf(stderr, "%s %s (newstate is %x)\n",
jtgafb833d1999-08-19 00:55:39 +000060 state ? "glEnable" : "glDisable",
61 gl_lookup_enum_by_nr(cap),
62 ctx->NewState);
63
64 switch (cap) {
65 case GL_ALPHA_TEST:
66 if (ctx->Color.AlphaEnabled!=state) {
67 ctx->Color.AlphaEnabled = state;
68 ctx->NewState |= NEW_RASTER_OPS;
69 }
70 break;
71 case GL_AUTO_NORMAL:
72 ctx->Eval.AutoNormal = state;
73 break;
74 case GL_BLEND:
75 if (ctx->Color.BlendEnabled!=state) {
76 ctx->Color.BlendEnabled = state;
77 /* The following needed to accomodate 1.0 RGB logic op blending */
78 if (ctx->Color.BlendEquation==GL_LOGIC_OP && state) {
79 ctx->Color.ColorLogicOpEnabled = GL_TRUE;
80 }
81 else {
82 ctx->Color.ColorLogicOpEnabled = GL_FALSE;
83 }
84 ctx->NewState |= NEW_RASTER_OPS;
85 }
86 break;
87 case GL_CLIP_PLANE0:
88 case GL_CLIP_PLANE1:
89 case GL_CLIP_PLANE2:
90 case GL_CLIP_PLANE3:
91 case GL_CLIP_PLANE4:
92 case GL_CLIP_PLANE5:
93 if (cap >= GL_CLIP_PLANE0 &&
94 cap <= GL_CLIP_PLANE5 &&
95 ctx->Transform.ClipEnabled[cap-GL_CLIP_PLANE0] != state)
96 {
97 GLuint p = cap-GL_CLIP_PLANE0;
98
99 ctx->Transform.ClipEnabled[p] = state;
100 ctx->NewState |= NEW_USER_CLIP;
101
102 if (state) {
103 ctx->Enabled |= ENABLE_USERCLIP;
104 ctx->Transform.AnyClip++;
105
106 if (ctx->ProjectionMatrix.flags & MAT_DIRTY_ALL_OVER) {
107 gl_matrix_analyze( &ctx->ProjectionMatrix );
108 }
109
110 gl_transform_vector( ctx->Transform.ClipUserPlane[p],
111 ctx->Transform.EyeUserPlane[p],
112 ctx->ProjectionMatrix.inv );
113 } else {
114 if (--ctx->Transform.AnyClip == 0)
115 ctx->Enabled &= ~ENABLE_USERCLIP;
116 }
117 }
118 break;
119 case GL_COLOR_MATERIAL:
120 if (ctx->Light.ColorMaterialEnabled!=state) {
121 ctx->Light.ColorMaterialEnabled = state;
122 ctx->NewState |= NEW_LIGHTING;
123 }
124 break;
125 case GL_CULL_FACE:
126 if (ctx->Polygon.CullFlag!=state) {
127 ctx->Polygon.CullFlag = state;
128 ctx->TriangleCaps ^= DD_TRI_CULL;
129 ctx->NewState |= NEW_POLYGON;
130 }
131 break;
132 case GL_DEPTH_TEST:
133 if (state && ctx->Visual->DepthBits==0) {
134 gl_warning(ctx,"glEnable(GL_DEPTH_TEST) but no depth buffer");
135 return;
136 }
137 if (ctx->Depth.Test!=state) {
138 ctx->Depth.Test = state;
139 ctx->NewState |= NEW_RASTER_OPS;
140 }
141 break;
142 case GL_DITHER:
143 if (ctx->NoDither) {
144 /* MESA_NO_DITHER env var */
145 state = GL_FALSE;
146 }
147 if (ctx->Color.DitherFlag!=state) {
148 ctx->Color.DitherFlag = state;
149 ctx->NewState |= NEW_RASTER_OPS;
150 }
151 break;
152 case GL_FOG:
153 if (ctx->Fog.Enabled!=state) {
154 ctx->Fog.Enabled = state;
155 ctx->Enabled ^= ENABLE_FOG;
Keith Whitwell2be79c11999-08-26 14:50:49 +0000156 ctx->NewState |= NEW_FOG|NEW_RASTER_OPS;
jtgafb833d1999-08-19 00:55:39 +0000157 }
158 break;
159 case GL_LIGHT0:
160 case GL_LIGHT1:
161 case GL_LIGHT2:
162 case GL_LIGHT3:
163 case GL_LIGHT4:
164 case GL_LIGHT5:
165 case GL_LIGHT6:
166 case GL_LIGHT7:
167 if (ctx->Light.Light[cap-GL_LIGHT0].Enabled != state)
168 {
169 ctx->Light.Light[cap-GL_LIGHT0].Enabled = state;
170
171 if (state) {
172 insert_at_tail(&ctx->Light.EnabledList,
173 &ctx->Light.Light[cap-GL_LIGHT0]);
174 if (ctx->Light.Enabled)
175 ctx->Enabled |= ENABLE_LIGHT;
176 } else {
177 remove_from_list(&ctx->Light.Light[cap-GL_LIGHT0]);
178 if (is_empty_list(&ctx->Light.EnabledList))
179 ctx->Enabled &= ~ENABLE_LIGHT;
180 }
181
182 ctx->NewState |= NEW_LIGHTING;
183 }
184 break;
185 case GL_LIGHTING:
186 if (ctx->Light.Enabled!=state) {
187 ctx->Light.Enabled = state;
188 ctx->Enabled &= ~ENABLE_LIGHT;
189 if (state && !is_empty_list(&ctx->Light.EnabledList))
190 ctx->Enabled |= ENABLE_LIGHT;
191 ctx->NewState |= NEW_LIGHTING;
192 }
193 break;
194 case GL_LINE_SMOOTH:
195 if (ctx->Line.SmoothFlag!=state) {
196 ctx->Line.SmoothFlag = state;
197 ctx->NewState |= NEW_RASTER_OPS;
198 }
199 break;
200 case GL_LINE_STIPPLE:
201 if (ctx->Line.StippleFlag!=state) {
202 ctx->Line.StippleFlag = state;
203 ctx->TriangleCaps ^= DD_LINE_STIPPLE;
204 ctx->NewState |= NEW_RASTER_OPS;
205 }
206 break;
207 case GL_INDEX_LOGIC_OP:
208 if (ctx->Color.IndexLogicOpEnabled!=state) {
209 ctx->Color.IndexLogicOpEnabled = state;
210 ctx->NewState |= NEW_RASTER_OPS;
211 }
212 break;
213 case GL_COLOR_LOGIC_OP:
214 if (ctx->Color.ColorLogicOpEnabled!=state) {
215 ctx->Color.ColorLogicOpEnabled = state;
216 ctx->NewState |= NEW_RASTER_OPS;
217 }
218 break;
219 case GL_MAP1_COLOR_4:
220 ctx->Eval.Map1Color4 = state;
221 break;
222 case GL_MAP1_INDEX:
223 ctx->Eval.Map1Index = state;
224 break;
225 case GL_MAP1_NORMAL:
226 ctx->Eval.Map1Normal = state;
227 break;
228 case GL_MAP1_TEXTURE_COORD_1:
229 ctx->Eval.Map1TextureCoord1 = state;
230 break;
231 case GL_MAP1_TEXTURE_COORD_2:
232 ctx->Eval.Map1TextureCoord2 = state;
233 break;
234 case GL_MAP1_TEXTURE_COORD_3:
235 ctx->Eval.Map1TextureCoord3 = state;
236 break;
237 case GL_MAP1_TEXTURE_COORD_4:
238 ctx->Eval.Map1TextureCoord4 = state;
239 break;
240 case GL_MAP1_VERTEX_3:
241 ctx->Eval.Map1Vertex3 = state;
242 break;
243 case GL_MAP1_VERTEX_4:
244 ctx->Eval.Map1Vertex4 = state;
245 break;
246 case GL_MAP2_COLOR_4:
247 ctx->Eval.Map2Color4 = state;
248 break;
249 case GL_MAP2_INDEX:
250 ctx->Eval.Map2Index = state;
251 break;
252 case GL_MAP2_NORMAL:
253 ctx->Eval.Map2Normal = state;
254 break;
255 case GL_MAP2_TEXTURE_COORD_1:
256 ctx->Eval.Map2TextureCoord1 = state;
257 break;
258 case GL_MAP2_TEXTURE_COORD_2:
259 ctx->Eval.Map2TextureCoord2 = state;
260 break;
261 case GL_MAP2_TEXTURE_COORD_3:
262 ctx->Eval.Map2TextureCoord3 = state;
263 break;
264 case GL_MAP2_TEXTURE_COORD_4:
265 ctx->Eval.Map2TextureCoord4 = state;
266 break;
267 case GL_MAP2_VERTEX_3:
268 ctx->Eval.Map2Vertex3 = state;
269 break;
270 case GL_MAP2_VERTEX_4:
271 ctx->Eval.Map2Vertex4 = state;
272 break;
273 case GL_NORMALIZE:
274 if (ctx->Transform.Normalize != state) {
275 ctx->Transform.Normalize = state;
276 ctx->NewState |= NEW_NORMAL_TRANSFORM|NEW_LIGHTING;
277 ctx->Enabled ^= ENABLE_NORMALIZE;
278 }
279 break;
280 case GL_POINT_SMOOTH:
281 if (ctx->Point.SmoothFlag!=state) {
282 ctx->Point.SmoothFlag = state;
283 ctx->NewState |= NEW_RASTER_OPS;
284 }
285 break;
286 case GL_POLYGON_SMOOTH:
287 if (ctx->Polygon.SmoothFlag!=state) {
288 ctx->Polygon.SmoothFlag = state;
289 ctx->NewState |= NEW_RASTER_OPS;
290 }
291 break;
292 case GL_POLYGON_STIPPLE:
293 if (ctx->Polygon.StippleFlag!=state) {
294 ctx->Polygon.StippleFlag = state;
295 ctx->TriangleCaps ^= DD_TRI_STIPPLE;
296 ctx->NewState |= NEW_RASTER_OPS;
297 }
298 break;
299 case GL_POLYGON_OFFSET_POINT:
300 if (ctx->Polygon.OffsetPoint!=state) {
301 ctx->Polygon.OffsetPoint = state;
302 ctx->NewState |= NEW_POLYGON;
303 }
304 break;
305 case GL_POLYGON_OFFSET_LINE:
306 if (ctx->Polygon.OffsetLine!=state) {
307 ctx->Polygon.OffsetLine = state;
308 ctx->NewState |= NEW_POLYGON;
309 }
310 break;
311 case GL_POLYGON_OFFSET_FILL:
312 /*case GL_POLYGON_OFFSET_EXT:*/
313 if (ctx->Polygon.OffsetFill!=state) {
314 ctx->Polygon.OffsetFill = state;
315 ctx->NewState |= NEW_POLYGON;
316 }
317 break;
318 case GL_RESCALE_NORMAL_EXT:
319 if (ctx->Transform.RescaleNormals != state) {
320 ctx->Transform.RescaleNormals = state;
321 ctx->NewState |= NEW_NORMAL_TRANSFORM|NEW_LIGHTING;
322 ctx->Enabled ^= ENABLE_RESCALE;
323 }
324 break;
325 case GL_SCISSOR_TEST:
326 if (ctx->Scissor.Enabled!=state) {
327 ctx->Scissor.Enabled = state;
328 ctx->NewState |= NEW_RASTER_OPS;
329 }
330 break;
331 case GL_SHARED_TEXTURE_PALETTE_EXT:
332 ctx->Texture.SharedPalette = state;
333 if (ctx->Driver.UseGlobalTexturePalette)
334 (*ctx->Driver.UseGlobalTexturePalette)( ctx, state );
335 break;
336 case GL_STENCIL_TEST:
337 if (state && ctx->Visual->StencilBits==0) {
338 gl_warning(ctx, "glEnable(GL_STENCIL_TEST) but no stencil buffer");
339 return;
340 }
341 if (ctx->Stencil.Enabled!=state) {
342 ctx->Stencil.Enabled = state;
343 ctx->NewState |= NEW_RASTER_OPS;
Keith Whitwell1bf9dfa1999-09-18 20:41:22 +0000344 ctx->TriangleCaps ^= DD_STENCIL;
jtgafb833d1999-08-19 00:55:39 +0000345 }
346 break;
347 case GL_TEXTURE_1D:
348 if (ctx->Visual->RGBAflag) {
349 const GLuint curr = ctx->Texture.CurrentUnit;
350 const GLuint flag = TEXTURE0_1D << (curr * 4);
351 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
352 ctx->NewState |= NEW_TEXTURE_ENABLE;
353 if (state) {
354 texUnit->Enabled |= TEXTURE0_1D;
355 ctx->Enabled |= flag;
356 }
357 else {
358 texUnit->Enabled &= ~TEXTURE0_1D;
359 ctx->Enabled &= ~flag;
360 }
361 }
362 break;
363 case GL_TEXTURE_2D:
364 if (ctx->Visual->RGBAflag) {
365 const GLuint curr = ctx->Texture.CurrentUnit;
366 const GLuint flag = TEXTURE0_2D << (curr * 4);
367 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
368 ctx->NewState |= NEW_TEXTURE_ENABLE;
369 if (state) {
370 texUnit->Enabled |= TEXTURE0_2D;
371 ctx->Enabled |= flag;
372 }
373 else {
374 texUnit->Enabled &= ~TEXTURE0_2D;
375 ctx->Enabled &= ~flag;
376 }
377 }
378 break;
379 case GL_TEXTURE_3D:
380 if (ctx->Visual->RGBAflag) {
381 const GLuint curr = ctx->Texture.CurrentUnit;
382 const GLuint flag = TEXTURE0_3D << (curr * 4);
383 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
384 ctx->NewState |= NEW_TEXTURE_ENABLE;
385 if (state) {
386 texUnit->Enabled |= TEXTURE0_3D;
387 ctx->Enabled |= flag;
388 }
389 else {
390 texUnit->Enabled &= ~TEXTURE0_3D;
391 ctx->Enabled &= ~flag;
392 }
393 }
394 break;
395 case GL_TEXTURE_GEN_Q:
396 {
397 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
398 if (state)
399 texUnit->TexGenEnabled |= Q_BIT;
400 else
401 texUnit->TexGenEnabled &= ~Q_BIT;
402 ctx->NewState |= NEW_TEXTURING;
403 }
404 break;
405 case GL_TEXTURE_GEN_R:
406 {
407 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
408 if (state)
409 texUnit->TexGenEnabled |= R_BIT;
410 else
411 texUnit->TexGenEnabled &= ~R_BIT;
412 ctx->NewState |= NEW_TEXTURING;
413 }
414 break;
415 case GL_TEXTURE_GEN_S:
416 {
417 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
418 if (state)
419 texUnit->TexGenEnabled |= S_BIT;
420 else
421 texUnit->TexGenEnabled &= ~S_BIT;
422 ctx->NewState |= NEW_TEXTURING;
423 }
424 break;
425 case GL_TEXTURE_GEN_T:
426 {
427 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
428 if (state)
429 texUnit->TexGenEnabled |= T_BIT;
430 else
431 texUnit->TexGenEnabled &= ~T_BIT;
432 ctx->NewState |= NEW_TEXTURING;
433 }
434 break;
435
436 /*
437 * CLIENT STATE!!!
438 */
439 case GL_VERTEX_ARRAY:
440 ctx->Array.Vertex.Enabled = state;
441 break;
442 case GL_NORMAL_ARRAY:
443 ctx->Array.Normal.Enabled = state;
444 break;
445 case GL_COLOR_ARRAY:
446 ctx->Array.Color.Enabled = state;
447 break;
448 case GL_INDEX_ARRAY:
449 ctx->Array.Index.Enabled = state;
450 break;
451 case GL_TEXTURE_COORD_ARRAY:
Brian Paul45224fa1999-09-07 22:31:30 +0000452 ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled = state;
jtgafb833d1999-08-19 00:55:39 +0000453 break;
454 case GL_EDGE_FLAG_ARRAY:
455 ctx->Array.EdgeFlag.Enabled = state;
456 break;
457
458 default:
459 if (state) {
460 gl_error( ctx, GL_INVALID_ENUM, "glEnable" );
461 }
462 else {
463 gl_error( ctx, GL_INVALID_ENUM, "glDisable" );
464 }
465 return;
466 }
467
468 if (ctx->Driver.Enable) {
469 (*ctx->Driver.Enable)( ctx, cap, state );
470 }
471}
472
473
474
475
476void gl_Enable( GLcontext* ctx, GLenum cap )
477{
478 gl_set_enable( ctx, cap, GL_TRUE );
479}
480
481
482
483void gl_Disable( GLcontext* ctx, GLenum cap )
484{
485 gl_set_enable( ctx, cap, GL_FALSE );
486}
487
488
489
490GLboolean gl_IsEnabled( GLcontext* ctx, GLenum cap )
491{
492 switch (cap) {
493 case GL_ALPHA_TEST:
494 return ctx->Color.AlphaEnabled;
495 case GL_AUTO_NORMAL:
496 return ctx->Eval.AutoNormal;
497 case GL_BLEND:
498 return ctx->Color.BlendEnabled;
499 case GL_CLIP_PLANE0:
500 case GL_CLIP_PLANE1:
501 case GL_CLIP_PLANE2:
502 case GL_CLIP_PLANE3:
503 case GL_CLIP_PLANE4:
504 case GL_CLIP_PLANE5:
505 return ctx->Transform.ClipEnabled[cap-GL_CLIP_PLANE0];
506 case GL_COLOR_MATERIAL:
507 return ctx->Light.ColorMaterialEnabled;
508 case GL_CULL_FACE:
509 return ctx->Polygon.CullFlag;
510 case GL_DEPTH_TEST:
511 return ctx->Depth.Test;
512 case GL_DITHER:
513 return ctx->Color.DitherFlag;
514 case GL_FOG:
515 return ctx->Fog.Enabled;
516 case GL_LIGHTING:
517 return ctx->Light.Enabled;
518 case GL_LIGHT0:
519 case GL_LIGHT1:
520 case GL_LIGHT2:
521 case GL_LIGHT3:
522 case GL_LIGHT4:
523 case GL_LIGHT5:
524 case GL_LIGHT6:
525 case GL_LIGHT7:
526 return ctx->Light.Light[cap-GL_LIGHT0].Enabled;
527 case GL_LINE_SMOOTH:
528 return ctx->Line.SmoothFlag;
529 case GL_LINE_STIPPLE:
530 return ctx->Line.StippleFlag;
531 case GL_INDEX_LOGIC_OP:
532 return ctx->Color.IndexLogicOpEnabled;
533 case GL_COLOR_LOGIC_OP:
534 return ctx->Color.ColorLogicOpEnabled;
535 case GL_MAP1_COLOR_4:
536 return ctx->Eval.Map1Color4;
537 case GL_MAP1_INDEX:
538 return ctx->Eval.Map1Index;
539 case GL_MAP1_NORMAL:
540 return ctx->Eval.Map1Normal;
541 case GL_MAP1_TEXTURE_COORD_1:
542 return ctx->Eval.Map1TextureCoord1;
543 case GL_MAP1_TEXTURE_COORD_2:
544 return ctx->Eval.Map1TextureCoord2;
545 case GL_MAP1_TEXTURE_COORD_3:
546 return ctx->Eval.Map1TextureCoord3;
547 case GL_MAP1_TEXTURE_COORD_4:
548 return ctx->Eval.Map1TextureCoord4;
549 case GL_MAP1_VERTEX_3:
550 return ctx->Eval.Map1Vertex3;
551 case GL_MAP1_VERTEX_4:
552 return ctx->Eval.Map1Vertex4;
553 case GL_MAP2_COLOR_4:
554 return ctx->Eval.Map2Color4;
555 case GL_MAP2_INDEX:
556 return ctx->Eval.Map2Index;
557 case GL_MAP2_NORMAL:
558 return ctx->Eval.Map2Normal;
559 case GL_MAP2_TEXTURE_COORD_1:
560 return ctx->Eval.Map2TextureCoord1;
561 case GL_MAP2_TEXTURE_COORD_2:
562 return ctx->Eval.Map2TextureCoord2;
563 case GL_MAP2_TEXTURE_COORD_3:
564 return ctx->Eval.Map2TextureCoord3;
565 case GL_MAP2_TEXTURE_COORD_4:
566 return ctx->Eval.Map2TextureCoord4;
567 case GL_MAP2_VERTEX_3:
568 return ctx->Eval.Map2Vertex3;
569 case GL_MAP2_VERTEX_4:
570 return ctx->Eval.Map2Vertex4;
571 case GL_NORMALIZE:
572 return ctx->Transform.Normalize;
573 case GL_POINT_SMOOTH:
574 return ctx->Point.SmoothFlag;
575 case GL_POLYGON_SMOOTH:
576 return ctx->Polygon.SmoothFlag;
577 case GL_POLYGON_STIPPLE:
578 return ctx->Polygon.StippleFlag;
579 case GL_POLYGON_OFFSET_POINT:
580 return ctx->Polygon.OffsetPoint;
581 case GL_POLYGON_OFFSET_LINE:
582 return ctx->Polygon.OffsetLine;
583 case GL_POLYGON_OFFSET_FILL:
584 /*case GL_POLYGON_OFFSET_EXT:*/
585 return ctx->Polygon.OffsetFill;
586 case GL_RESCALE_NORMAL_EXT:
587 return ctx->Transform.RescaleNormals;
588 case GL_SCISSOR_TEST:
589 return ctx->Scissor.Enabled;
590 case GL_SHARED_TEXTURE_PALETTE_EXT:
591 return ctx->Texture.SharedPalette;
592 case GL_STENCIL_TEST:
593 return ctx->Stencil.Enabled;
594 case GL_TEXTURE_1D:
595 {
596 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
597 return (texUnit->Enabled & TEXTURE0_1D) ? GL_TRUE : GL_FALSE;
598 }
599 case GL_TEXTURE_2D:
600 {
601 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
602 return (texUnit->Enabled & TEXTURE0_2D) ? GL_TRUE : GL_FALSE;
603 }
604 case GL_TEXTURE_3D:
605 {
606 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
Brian Paul65b5e1e1999-08-19 13:24:27 +0000607 return (texUnit->Enabled & TEXTURE0_3D) ? GL_TRUE : GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000608 }
609 case GL_TEXTURE_GEN_Q:
610 {
611 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
612 return (texUnit->TexGenEnabled & Q_BIT) ? GL_TRUE : GL_FALSE;
613 }
614 case GL_TEXTURE_GEN_R:
615 {
616 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
617 return (texUnit->TexGenEnabled & R_BIT) ? GL_TRUE : GL_FALSE;
618 }
619 case GL_TEXTURE_GEN_S:
620 {
621 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
622 return (texUnit->TexGenEnabled & S_BIT) ? GL_TRUE : GL_FALSE;
623 }
624 case GL_TEXTURE_GEN_T:
625 {
626 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
627 return (texUnit->TexGenEnabled & T_BIT) ? GL_TRUE : GL_FALSE;
628 }
629
630 /*
631 * CLIENT STATE!!!
632 */
633 case GL_VERTEX_ARRAY:
634 return ctx->Array.Vertex.Enabled;
635 case GL_NORMAL_ARRAY:
636 return ctx->Array.Normal.Enabled;
637 case GL_COLOR_ARRAY:
638 return ctx->Array.Color.Enabled;
639 case GL_INDEX_ARRAY:
640 return ctx->Array.Index.Enabled;
641 case GL_TEXTURE_COORD_ARRAY:
Brian Paul45224fa1999-09-07 22:31:30 +0000642 return ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled;
jtgafb833d1999-08-19 00:55:39 +0000643 case GL_EDGE_FLAG_ARRAY:
644 return ctx->Array.EdgeFlag.Enabled;
645 default:
646 gl_error( ctx, GL_INVALID_ENUM, "glIsEnabled" );
647 return GL_FALSE;
648 }
649}
650
651
652
653
654static void gl_client_state( GLcontext *ctx, GLenum cap, GLboolean state )
655{
656 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx,
657 (state
658 ? "glEnableClientState"
659 : "glDisableClientState") );
660
661 switch (cap) {
662 case GL_VERTEX_ARRAY:
663 ctx->Array.Vertex.Enabled = state;
664 break;
665 case GL_NORMAL_ARRAY:
666 ctx->Array.Normal.Enabled = state;
667 break;
668 case GL_COLOR_ARRAY:
669 ctx->Array.Color.Enabled = state;
670 break;
671 case GL_INDEX_ARRAY:
672 ctx->Array.Index.Enabled = state;
673 break;
674 case GL_TEXTURE_COORD_ARRAY:
Brian Paul45224fa1999-09-07 22:31:30 +0000675 ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled = state;
jtgafb833d1999-08-19 00:55:39 +0000676 break;
677 case GL_EDGE_FLAG_ARRAY:
678 ctx->Array.EdgeFlag.Enabled = state;
679 break;
680 default:
681 gl_error( ctx, GL_INVALID_ENUM, "glEnable/DisableClientState" );
682 }
683
684 ctx->NewState |= NEW_CLIENT_STATE;
685}
686
687
688
689void gl_EnableClientState( GLcontext *ctx, GLenum cap )
690{
691 gl_client_state( ctx, cap, GL_TRUE );
692}
693
694
695
696void gl_DisableClientState( GLcontext *ctx, GLenum cap )
697{
698 gl_client_state( ctx, cap, GL_FALSE );
699}
700