1 /* $Id: enable.c,v 1.44 2001/03/03 20:33:27 brianp Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
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:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
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.
37 #include "simple_list.h"
41 #include "math/m_matrix.h"
42 #include "math/m_xform.h"
48 client_state( GLcontext
*ctx
, GLenum cap
, GLboolean state
)
55 var
= &ctx
->Array
.Vertex
.Enabled
;
56 flag
= _NEW_ARRAY_VERTEX
;
59 var
= &ctx
->Array
.Normal
.Enabled
;
60 flag
= _NEW_ARRAY_NORMAL
;
63 var
= &ctx
->Array
.Color
.Enabled
;
64 flag
= _NEW_ARRAY_COLOR
;
67 var
= &ctx
->Array
.Index
.Enabled
;
68 flag
= _NEW_ARRAY_INDEX
;
70 case GL_TEXTURE_COORD_ARRAY
:
71 var
= &ctx
->Array
.TexCoord
[ctx
->Array
.ActiveTexture
].Enabled
;
72 flag
= _NEW_ARRAY_TEXCOORD(ctx
->Array
.ActiveTexture
);
74 case GL_EDGE_FLAG_ARRAY
:
75 var
= &ctx
->Array
.EdgeFlag
.Enabled
;
76 flag
= _NEW_ARRAY_EDGEFLAG
;
78 case GL_FOG_COORDINATE_ARRAY_EXT
:
79 var
= &ctx
->Array
.FogCoord
.Enabled
;
80 flag
= _NEW_ARRAY_FOGCOORD
;
82 case GL_SECONDARY_COLOR_ARRAY_EXT
:
83 var
= &ctx
->Array
.SecondaryColor
.Enabled
;
84 flag
= _NEW_ARRAY_SECONDARYCOLOR
;
87 _mesa_error( ctx
, GL_INVALID_ENUM
, "glEnable/DisableClientState" );
94 FLUSH_VERTICES(ctx
, _NEW_ARRAY
);
95 ctx
->Array
.NewState
|= flag
;
99 ctx
->Array
._Enabled
|= flag
;
101 ctx
->Array
._Enabled
&= ~flag
;
103 if (ctx
->Driver
.Enable
) {
104 (*ctx
->Driver
.Enable
)( ctx
, cap
, state
);
111 _mesa_EnableClientState( GLenum cap
)
113 GET_CURRENT_CONTEXT(ctx
);
114 ASSERT_OUTSIDE_BEGIN_END(ctx
);
115 client_state( ctx
, cap
, GL_TRUE
);
121 _mesa_DisableClientState( GLenum cap
)
123 GET_CURRENT_CONTEXT(ctx
);
124 ASSERT_OUTSIDE_BEGIN_END(ctx
);
125 client_state( ctx
, cap
, GL_FALSE
);
130 * Perform glEnable and glDisable calls.
132 void _mesa_set_enable( GLcontext
*ctx
, GLenum cap
, GLboolean state
)
134 if (MESA_VERBOSE
& VERBOSE_API
)
135 fprintf(stderr
, "%s %s (newstate is %x)\n",
136 state
? "glEnable" : "glDisable",
137 _mesa_lookup_enum_by_nr(cap
),
142 if (ctx
->Color
.AlphaEnabled
== state
)
144 FLUSH_VERTICES(ctx
, _NEW_COLOR
);
145 ctx
->Color
.AlphaEnabled
= state
;
148 if (ctx
->Eval
.AutoNormal
== state
)
150 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
151 ctx
->Eval
.AutoNormal
= state
;
154 if (ctx
->Color
.BlendEnabled
== state
)
157 FLUSH_VERTICES(ctx
, _NEW_COLOR
);
158 ctx
->Color
.BlendEnabled
= state
;
159 /* The following needed to accomodate 1.0 RGB logic op blending */
160 ctx
->Color
.ColorLogicOpEnabled
=
161 (ctx
->Color
.BlendEquation
== GL_LOGIC_OP
&& state
);
168 case GL_CLIP_PLANE5
: {
169 GLuint p
= cap
-GL_CLIP_PLANE0
;
171 if (ctx
->Transform
.ClipEnabled
[p
] == state
)
174 FLUSH_VERTICES(ctx
, _NEW_TRANSFORM
);
175 ctx
->Transform
.ClipEnabled
[p
] = state
;
178 ctx
->_Enabled
|= ENABLE_USERCLIP
;
179 ctx
->Transform
._AnyClip
++;
181 if (ctx
->ProjectionMatrix
.flags
& MAT_DIRTY
) {
182 _math_matrix_analyse( &ctx
->ProjectionMatrix
);
185 /* This derived state also calculated in clip.c and
186 * from _mesa_update_state() on changes to EyeUserPlane
187 * and ctx->ProjectionMatrix respectively.
189 _mesa_transform_vector( ctx
->Transform
._ClipUserPlane
[p
],
190 ctx
->Transform
.EyeUserPlane
[p
],
191 ctx
->ProjectionMatrix
.inv
);
193 if (--ctx
->Transform
._AnyClip
== 0)
194 ctx
->_Enabled
&= ~ENABLE_USERCLIP
;
198 case GL_COLOR_MATERIAL
:
199 if (ctx
->Light
.ColorMaterialEnabled
== state
)
201 FLUSH_VERTICES(ctx
, _NEW_LIGHT
);
202 ctx
->Light
.ColorMaterialEnabled
= state
;
204 FLUSH_CURRENT(ctx
, 0);
205 _mesa_update_color_material( ctx
, ctx
->Current
.Color
);
209 if (ctx
->Polygon
.CullFlag
== state
)
211 FLUSH_VERTICES(ctx
, _NEW_POLYGON
);
212 ctx
->Polygon
.CullFlag
= state
;
215 if (state
&& ctx
->Visual
.depthBits
==0) {
216 _mesa_warning(ctx
,"glEnable(GL_DEPTH_TEST) but no depth buffer");
219 if (ctx
->Depth
.Test
==state
)
221 FLUSH_VERTICES(ctx
, _NEW_DEPTH
);
222 ctx
->Depth
.Test
= state
;
226 state
= GL_FALSE
; /* MESA_NO_DITHER env var */
228 if (ctx
->Color
.DitherFlag
==state
)
230 FLUSH_VERTICES(ctx
, _NEW_COLOR
);
231 ctx
->Color
.DitherFlag
= state
;
234 if (ctx
->Fog
.Enabled
==state
)
236 FLUSH_VERTICES(ctx
, _NEW_FOG
);
237 ctx
->Fog
.Enabled
= state
;
238 ctx
->_Enabled
^= ENABLE_FOG
;
241 if (!ctx
->Extensions
.EXT_histogram
&& !ctx
->Extensions
.ARB_imaging
) {
242 _mesa_error(ctx
, GL_INVALID_ENUM
, "glEnable(GL_HISTOGRAM)");
245 if (ctx
->Pixel
.HistogramEnabled
== state
)
247 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
248 ctx
->Pixel
.HistogramEnabled
= state
;
258 if (ctx
->Light
.Light
[cap
-GL_LIGHT0
].Enabled
== state
)
260 FLUSH_VERTICES(ctx
, _NEW_LIGHT
);
261 ctx
->Light
.Light
[cap
-GL_LIGHT0
].Enabled
= state
;
263 insert_at_tail(&ctx
->Light
.EnabledList
,
264 &ctx
->Light
.Light
[cap
-GL_LIGHT0
]);
267 remove_from_list(&ctx
->Light
.Light
[cap
-GL_LIGHT0
]);
271 if (ctx
->Light
.Enabled
== state
)
273 FLUSH_VERTICES(ctx
, _NEW_LIGHT
);
274 ctx
->Light
.Enabled
= state
;
275 ctx
->_Enabled
^= ENABLE_LIGHT
;
277 if ((ctx
->Light
.Enabled
&&
278 ctx
->Light
.Model
.ColorControl
==GL_SEPARATE_SPECULAR_COLOR
)
279 || ctx
->Fog
.ColorSumEnabled
)
280 ctx
->_TriangleCaps
|= DD_SEPERATE_SPECULAR
;
282 ctx
->_TriangleCaps
&= ~DD_SEPERATE_SPECULAR
;
286 if (ctx
->Line
.SmoothFlag
== state
)
288 FLUSH_VERTICES(ctx
, _NEW_LINE
);
289 ctx
->Line
.SmoothFlag
= state
;
290 ctx
->_TriangleCaps
^= DD_LINE_SMOOTH
;
292 case GL_LINE_STIPPLE
:
293 if (ctx
->Line
.StippleFlag
== state
)
295 FLUSH_VERTICES(ctx
, _NEW_LINE
);
296 ctx
->Line
.StippleFlag
= state
;
297 ctx
->_TriangleCaps
^= DD_LINE_STIPPLE
;
299 case GL_INDEX_LOGIC_OP
:
300 if (ctx
->Color
.IndexLogicOpEnabled
== state
)
302 FLUSH_VERTICES(ctx
, _NEW_COLOR
);
303 ctx
->Color
.IndexLogicOpEnabled
= state
;
305 case GL_COLOR_LOGIC_OP
:
306 if (ctx
->Color
.ColorLogicOpEnabled
== state
)
308 FLUSH_VERTICES(ctx
, _NEW_COLOR
);
309 ctx
->Color
.ColorLogicOpEnabled
= state
;
311 case GL_MAP1_COLOR_4
:
312 if (ctx
->Eval
.Map1Color4
== state
)
314 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
315 ctx
->Eval
.Map1Color4
= state
;
318 if (ctx
->Eval
.Map1Index
== state
)
320 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
321 ctx
->Eval
.Map1Index
= state
;
324 if (ctx
->Eval
.Map1Normal
== state
)
326 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
327 ctx
->Eval
.Map1Normal
= state
;
329 case GL_MAP1_TEXTURE_COORD_1
:
330 if (ctx
->Eval
.Map1TextureCoord1
== state
)
332 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
333 ctx
->Eval
.Map1TextureCoord1
= state
;
335 case GL_MAP1_TEXTURE_COORD_2
:
336 if (ctx
->Eval
.Map1TextureCoord2
== state
)
338 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
339 ctx
->Eval
.Map1TextureCoord2
= state
;
341 case GL_MAP1_TEXTURE_COORD_3
:
342 if (ctx
->Eval
.Map1TextureCoord3
== state
)
344 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
345 ctx
->Eval
.Map1TextureCoord3
= state
;
347 case GL_MAP1_TEXTURE_COORD_4
:
348 if (ctx
->Eval
.Map1TextureCoord4
== state
)
350 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
351 ctx
->Eval
.Map1TextureCoord4
= state
;
353 case GL_MAP1_VERTEX_3
:
354 if (ctx
->Eval
.Map1Vertex3
== state
)
356 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
357 ctx
->Eval
.Map1Vertex3
= state
;
359 case GL_MAP1_VERTEX_4
:
360 if (ctx
->Eval
.Map1Vertex4
== state
)
362 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
363 ctx
->Eval
.Map1Vertex4
= state
;
365 case GL_MAP2_COLOR_4
:
366 if (ctx
->Eval
.Map2Color4
== state
)
368 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
369 ctx
->Eval
.Map2Color4
= state
;
372 if (ctx
->Eval
.Map2Index
== state
)
374 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
375 ctx
->Eval
.Map2Index
= state
;
378 if (ctx
->Eval
.Map2Normal
== state
)
380 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
381 ctx
->Eval
.Map2Normal
= state
;
383 case GL_MAP2_TEXTURE_COORD_1
:
384 if (ctx
->Eval
.Map2TextureCoord1
== state
)
386 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
387 ctx
->Eval
.Map2TextureCoord1
= state
;
389 case GL_MAP2_TEXTURE_COORD_2
:
390 if (ctx
->Eval
.Map2TextureCoord2
== state
)
392 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
393 ctx
->Eval
.Map2TextureCoord2
= state
;
395 case GL_MAP2_TEXTURE_COORD_3
:
396 if (ctx
->Eval
.Map2TextureCoord3
== state
)
398 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
399 ctx
->Eval
.Map2TextureCoord3
= state
;
401 case GL_MAP2_TEXTURE_COORD_4
:
402 if (ctx
->Eval
.Map2TextureCoord4
== state
)
404 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
405 ctx
->Eval
.Map2TextureCoord4
= state
;
407 case GL_MAP2_VERTEX_3
:
408 if (ctx
->Eval
.Map2Vertex3
== state
)
410 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
411 ctx
->Eval
.Map2Vertex3
= state
;
413 case GL_MAP2_VERTEX_4
:
414 if (ctx
->Eval
.Map2Vertex4
== state
)
416 FLUSH_VERTICES(ctx
, _NEW_EVAL
);
417 ctx
->Eval
.Map2Vertex4
= state
;
420 if (ctx
->Pixel
.MinMaxEnabled
== state
)
422 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
423 ctx
->Pixel
.MinMaxEnabled
= state
;
426 if (ctx
->Transform
.Normalize
== state
)
428 FLUSH_VERTICES(ctx
, _NEW_TRANSFORM
);
429 ctx
->Transform
.Normalize
= state
;
430 ctx
->_Enabled
^= ENABLE_NORMALIZE
;
432 case GL_POINT_SMOOTH
:
433 if (ctx
->Point
.SmoothFlag
==state
)
435 FLUSH_VERTICES(ctx
, _NEW_POINT
);
436 ctx
->Point
.SmoothFlag
= state
;
437 ctx
->_TriangleCaps
^= DD_POINT_SMOOTH
;
439 case GL_POLYGON_SMOOTH
:
440 if (ctx
->Polygon
.SmoothFlag
==state
)
442 FLUSH_VERTICES(ctx
, _NEW_POLYGON
);
443 ctx
->Polygon
.SmoothFlag
= state
;
444 ctx
->_TriangleCaps
^= DD_TRI_SMOOTH
;
446 case GL_POLYGON_STIPPLE
:
447 if (ctx
->Polygon
.StippleFlag
==state
)
449 FLUSH_VERTICES(ctx
, _NEW_POLYGON
);
450 ctx
->Polygon
.StippleFlag
= state
;
451 ctx
->_TriangleCaps
^= DD_TRI_STIPPLE
;
453 case GL_POLYGON_OFFSET_POINT
:
454 if (ctx
->Polygon
.OffsetPoint
==state
)
456 FLUSH_VERTICES(ctx
, _NEW_POLYGON
);
457 ctx
->Polygon
.OffsetPoint
= state
;
459 case GL_POLYGON_OFFSET_LINE
:
460 if (ctx
->Polygon
.OffsetLine
==state
)
462 FLUSH_VERTICES(ctx
, _NEW_POLYGON
);
463 ctx
->Polygon
.OffsetLine
= state
;
465 case GL_POLYGON_OFFSET_FILL
:
466 /*case GL_POLYGON_OFFSET_EXT:*/
467 if (ctx
->Polygon
.OffsetFill
==state
)
469 FLUSH_VERTICES(ctx
, _NEW_POLYGON
);
470 ctx
->Polygon
.OffsetFill
= state
;
472 case GL_RESCALE_NORMAL_EXT
:
473 if (ctx
->Transform
.RescaleNormals
== state
)
475 FLUSH_VERTICES(ctx
, _NEW_TRANSFORM
);
476 ctx
->Transform
.RescaleNormals
= state
;
477 ctx
->_Enabled
^= ENABLE_RESCALE
;
479 case GL_SCISSOR_TEST
:
480 if (ctx
->Scissor
.Enabled
==state
)
482 FLUSH_VERTICES(ctx
, _NEW_SCISSOR
);
483 ctx
->Scissor
.Enabled
= state
;
485 case GL_SHARED_TEXTURE_PALETTE_EXT
:
486 if (ctx
->Texture
.SharedPalette
== state
)
488 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
489 ctx
->Texture
.SharedPalette
= state
;
491 case GL_STENCIL_TEST
:
492 if (state
&& ctx
->Visual
.stencilBits
==0) {
493 _mesa_warning(ctx
, "glEnable(GL_STENCIL_TEST) but no stencil buffer");
496 if (ctx
->Stencil
.Enabled
==state
)
498 FLUSH_VERTICES(ctx
, _NEW_STENCIL
);
499 ctx
->Stencil
.Enabled
= state
;
500 ctx
->_TriangleCaps
^= DD_STENCIL
;
502 case GL_TEXTURE_1D
: {
503 const GLuint curr
= ctx
->Texture
.CurrentUnit
;
504 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[curr
];
505 GLuint newenabled
= texUnit
->Enabled
& ~TEXTURE0_1D
;
507 newenabled
|= TEXTURE0_1D
;
508 if (!ctx
->Visual
.rgbMode
|| texUnit
->Enabled
== newenabled
)
510 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
511 texUnit
->Enabled
= newenabled
;
514 case GL_TEXTURE_2D
: {
515 const GLuint curr
= ctx
->Texture
.CurrentUnit
;
516 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[curr
];
517 GLuint newenabled
= texUnit
->Enabled
& ~TEXTURE0_2D
;
519 newenabled
|= TEXTURE0_2D
;
520 if (!ctx
->Visual
.rgbMode
|| texUnit
->Enabled
== newenabled
)
522 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
523 texUnit
->Enabled
= newenabled
;
526 case GL_TEXTURE_3D
: {
527 const GLuint curr
= ctx
->Texture
.CurrentUnit
;
528 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[curr
];
529 GLuint newenabled
= texUnit
->Enabled
& ~TEXTURE0_3D
;
531 newenabled
|= TEXTURE0_3D
;
532 if (!ctx
->Visual
.rgbMode
|| texUnit
->Enabled
== newenabled
)
534 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
535 texUnit
->Enabled
= newenabled
;
538 case GL_TEXTURE_GEN_Q
: {
539 GLuint unit
= ctx
->Texture
.CurrentUnit
;
540 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[unit
];
541 GLuint newenabled
= texUnit
->TexGenEnabled
& ~Q_BIT
;
544 if (texUnit
->TexGenEnabled
== newenabled
)
546 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
547 texUnit
->TexGenEnabled
= newenabled
;
550 case GL_TEXTURE_GEN_R
: {
551 GLuint unit
= ctx
->Texture
.CurrentUnit
;
552 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[unit
];
553 GLuint newenabled
= texUnit
->TexGenEnabled
& ~R_BIT
;
556 if (texUnit
->TexGenEnabled
== newenabled
)
558 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
559 texUnit
->TexGenEnabled
= newenabled
;
563 case GL_TEXTURE_GEN_S
: {
564 GLuint unit
= ctx
->Texture
.CurrentUnit
;
565 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[unit
];
566 GLuint newenabled
= texUnit
->TexGenEnabled
& ~S_BIT
;
569 if (texUnit
->TexGenEnabled
== newenabled
)
571 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
572 texUnit
->TexGenEnabled
= newenabled
;
576 case GL_TEXTURE_GEN_T
: {
577 GLuint unit
= ctx
->Texture
.CurrentUnit
;
578 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[unit
];
579 GLuint newenabled
= texUnit
->TexGenEnabled
& ~T_BIT
;
582 if (texUnit
->TexGenEnabled
== newenabled
)
584 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
585 texUnit
->TexGenEnabled
= newenabled
;
593 case GL_VERTEX_ARRAY
:
594 case GL_NORMAL_ARRAY
:
597 case GL_TEXTURE_COORD_ARRAY
:
598 case GL_EDGE_FLAG_ARRAY
:
599 case GL_FOG_COORDINATE_ARRAY_EXT
:
600 case GL_SECONDARY_COLOR_ARRAY_EXT
:
601 client_state( ctx
, cap
, state
);
604 /* GL_HP_occlusion_test */
605 case GL_OCCLUSION_TEST_HP
:
606 if (!ctx
->Extensions
.HP_occlusion_test
) {
607 _mesa_error( ctx
, GL_INVALID_ENUM
, state
? "glEnable": "glDisable" );
610 if (ctx
->Depth
.OcclusionTest
== state
)
612 FLUSH_VERTICES(ctx
, _NEW_DEPTH
);
613 ctx
->Depth
.OcclusionTest
= state
;
615 ctx
->OcclusionResult
= ctx
->OcclusionResultSaved
;
617 ctx
->OcclusionResultSaved
= ctx
->OcclusionResult
;
620 /* GL_SGIS_pixel_texture */
621 case GL_PIXEL_TEXTURE_SGIS
:
622 if (!ctx
->Extensions
.SGIS_pixel_texture
) {
623 _mesa_error( ctx
, GL_INVALID_ENUM
, state
? "glEnable": "glDisable" );
626 if (ctx
->Pixel
.PixelTextureEnabled
== state
)
628 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
629 ctx
->Pixel
.PixelTextureEnabled
= state
;
632 /* GL_SGIX_pixel_texture */
633 case GL_PIXEL_TEX_GEN_SGIX
:
634 if (!ctx
->Extensions
.SGIX_pixel_texture
) {
635 _mesa_error( ctx
, GL_INVALID_ENUM
, state
? "glEnable": "glDisable" );
638 if (ctx
->Pixel
.PixelTextureEnabled
== state
)
640 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
641 ctx
->Pixel
.PixelTextureEnabled
= state
;
644 /* GL_SGI_color_table */
645 case GL_COLOR_TABLE_SGI
:
646 if (!ctx
->Extensions
.SGI_color_table
&& !ctx
->Extensions
.ARB_imaging
) {
647 _mesa_error( ctx
, GL_INVALID_ENUM
, state
? "glEnable": "glDisable" );
650 if (ctx
->Pixel
.ColorTableEnabled
== state
)
652 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
653 ctx
->Pixel
.ColorTableEnabled
= state
;
655 case GL_POST_CONVOLUTION_COLOR_TABLE_SGI
:
656 if (!ctx
->Extensions
.SGI_color_table
&& !ctx
->Extensions
.ARB_imaging
) {
657 _mesa_error( ctx
, GL_INVALID_ENUM
, state
? "glEnable": "glDisable" );
660 if (ctx
->Pixel
.PostConvolutionColorTableEnabled
== state
)
662 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
663 ctx
->Pixel
.PostConvolutionColorTableEnabled
= state
;
665 case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI
:
666 if (!ctx
->Extensions
.SGI_color_table
&& !ctx
->Extensions
.ARB_imaging
) {
667 _mesa_error( ctx
, GL_INVALID_ENUM
, state
? "glEnable": "glDisable" );
670 if (ctx
->Pixel
.PostColorMatrixColorTableEnabled
== state
)
672 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
673 ctx
->Pixel
.PostColorMatrixColorTableEnabled
= state
;
676 /* GL_EXT_convolution */
677 case GL_CONVOLUTION_1D
:
678 if (!ctx
->Extensions
.EXT_convolution
&& !ctx
->Extensions
.ARB_imaging
) {
679 _mesa_error(ctx
, GL_INVALID_ENUM
, state
? "glEnable" : "glDisable");
682 if (ctx
->Pixel
.Convolution1DEnabled
== state
)
684 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
685 ctx
->Pixel
.Convolution1DEnabled
= state
;
687 case GL_CONVOLUTION_2D
:
688 if (!ctx
->Extensions
.EXT_convolution
&& !ctx
->Extensions
.ARB_imaging
) {
689 _mesa_error(ctx
, GL_INVALID_ENUM
, state
? "glEnable" : "glDisable");
692 if (ctx
->Pixel
.Convolution2DEnabled
== state
)
694 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
695 ctx
->Pixel
.Convolution2DEnabled
= state
;
697 case GL_SEPARABLE_2D
:
698 if (!ctx
->Extensions
.EXT_convolution
&& !ctx
->Extensions
.ARB_imaging
) {
699 _mesa_error(ctx
, GL_INVALID_ENUM
, state
? "glEnable" : "glDisable");
702 if (ctx
->Pixel
.Separable2DEnabled
== state
)
704 FLUSH_VERTICES(ctx
, _NEW_PIXEL
);
705 ctx
->Pixel
.Separable2DEnabled
= state
;
708 /* GL_ARB_texture_cube_map */
709 case GL_TEXTURE_CUBE_MAP_ARB
: {
710 const GLuint curr
= ctx
->Texture
.CurrentUnit
;
711 struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[curr
];
712 GLuint newenabled
= texUnit
->Enabled
& ~TEXTURE0_CUBE
;
714 newenabled
|= TEXTURE0_CUBE
;
715 if (!ctx
->Extensions
.ARB_texture_cube_map
) {
716 _mesa_error(ctx
, GL_INVALID_ENUM
, state
? "glEnable" : "glDisable");
719 if (!ctx
->Visual
.rgbMode
|| texUnit
->Enabled
== newenabled
)
721 FLUSH_VERTICES(ctx
, _NEW_TEXTURE
);
722 texUnit
->Enabled
= newenabled
;
725 /* GL_EXT_secondary_color */
726 case GL_COLOR_SUM_EXT
:
727 if (!ctx
->Extensions
.EXT_secondary_color
) {
728 _mesa_error(ctx
, GL_INVALID_ENUM
, state
? "glEnable" : "glDisable");
731 if (ctx
->Fog
.ColorSumEnabled
== state
)
733 FLUSH_VERTICES(ctx
, _NEW_FOG
);
734 ctx
->Fog
.ColorSumEnabled
= state
;
736 if ((ctx
->Light
.Enabled
&&
737 ctx
->Light
.Model
.ColorControl
==GL_SEPARATE_SPECULAR_COLOR
)
738 || ctx
->Fog
.ColorSumEnabled
)
739 ctx
->_TriangleCaps
|= DD_SEPERATE_SPECULAR
;
741 ctx
->_TriangleCaps
&= ~DD_SEPERATE_SPECULAR
;
745 /* GL_MESA_sprite_point */
746 case GL_SPRITE_POINT_MESA
:
747 if (!ctx
->Extensions
.MESA_sprite_point
) {
748 _mesa_error(ctx
, GL_INVALID_ENUM
, state
? "glEnable" : "glDisable");
751 if (ctx
->Point
.SpriteMode
== state
)
753 FLUSH_VERTICES(ctx
, _NEW_POINT
);
754 ctx
->Point
.SpriteMode
= state
;
758 _mesa_error(ctx
, GL_INVALID_ENUM
, state
? "glEnable" : "glDisable");
762 if (ctx
->Driver
.Enable
) {
763 (*ctx
->Driver
.Enable
)( ctx
, cap
, state
);
771 _mesa_Enable( GLenum cap
)
773 GET_CURRENT_CONTEXT(ctx
);
774 ASSERT_OUTSIDE_BEGIN_END(ctx
);
776 _mesa_set_enable( ctx
, cap
, GL_TRUE
);
782 _mesa_Disable( GLenum cap
)
784 GET_CURRENT_CONTEXT(ctx
);
785 ASSERT_OUTSIDE_BEGIN_END(ctx
);
787 _mesa_set_enable( ctx
, cap
, GL_FALSE
);
793 _mesa_IsEnabled( GLenum cap
)
795 GET_CURRENT_CONTEXT(ctx
);
798 return ctx
->Color
.AlphaEnabled
;
800 return ctx
->Eval
.AutoNormal
;
802 return ctx
->Color
.BlendEnabled
;
809 return ctx
->Transform
.ClipEnabled
[cap
-GL_CLIP_PLANE0
];
810 case GL_COLOR_MATERIAL
:
811 return ctx
->Light
.ColorMaterialEnabled
;
813 return ctx
->Polygon
.CullFlag
;
815 return ctx
->Depth
.Test
;
817 return ctx
->Color
.DitherFlag
;
819 return ctx
->Fog
.Enabled
;
821 if (ctx
->Extensions
.EXT_histogram
|| ctx
->Extensions
.ARB_imaging
) {
822 return ctx
->Pixel
.HistogramEnabled
;
825 _mesa_error(ctx
, GL_INVALID_ENUM
, "glIsEnabled");
829 return ctx
->Light
.Enabled
;
838 return ctx
->Light
.Light
[cap
-GL_LIGHT0
].Enabled
;
840 return ctx
->Line
.SmoothFlag
;
841 case GL_LINE_STIPPLE
:
842 return ctx
->Line
.StippleFlag
;
843 case GL_INDEX_LOGIC_OP
:
844 return ctx
->Color
.IndexLogicOpEnabled
;
845 case GL_COLOR_LOGIC_OP
:
846 return ctx
->Color
.ColorLogicOpEnabled
;
847 case GL_MAP1_COLOR_4
:
848 return ctx
->Eval
.Map1Color4
;
850 return ctx
->Eval
.Map1Index
;
852 return ctx
->Eval
.Map1Normal
;
853 case GL_MAP1_TEXTURE_COORD_1
:
854 return ctx
->Eval
.Map1TextureCoord1
;
855 case GL_MAP1_TEXTURE_COORD_2
:
856 return ctx
->Eval
.Map1TextureCoord2
;
857 case GL_MAP1_TEXTURE_COORD_3
:
858 return ctx
->Eval
.Map1TextureCoord3
;
859 case GL_MAP1_TEXTURE_COORD_4
:
860 return ctx
->Eval
.Map1TextureCoord4
;
861 case GL_MAP1_VERTEX_3
:
862 return ctx
->Eval
.Map1Vertex3
;
863 case GL_MAP1_VERTEX_4
:
864 return ctx
->Eval
.Map1Vertex4
;
865 case GL_MAP2_COLOR_4
:
866 return ctx
->Eval
.Map2Color4
;
868 return ctx
->Eval
.Map2Index
;
870 return ctx
->Eval
.Map2Normal
;
871 case GL_MAP2_TEXTURE_COORD_1
:
872 return ctx
->Eval
.Map2TextureCoord1
;
873 case GL_MAP2_TEXTURE_COORD_2
:
874 return ctx
->Eval
.Map2TextureCoord2
;
875 case GL_MAP2_TEXTURE_COORD_3
:
876 return ctx
->Eval
.Map2TextureCoord3
;
877 case GL_MAP2_TEXTURE_COORD_4
:
878 return ctx
->Eval
.Map2TextureCoord4
;
879 case GL_MAP2_VERTEX_3
:
880 return ctx
->Eval
.Map2Vertex3
;
881 case GL_MAP2_VERTEX_4
:
882 return ctx
->Eval
.Map2Vertex4
;
884 return ctx
->Pixel
.MinMaxEnabled
;
886 return ctx
->Transform
.Normalize
;
887 case GL_POINT_SMOOTH
:
888 return ctx
->Point
.SmoothFlag
;
889 case GL_POLYGON_SMOOTH
:
890 return ctx
->Polygon
.SmoothFlag
;
891 case GL_POLYGON_STIPPLE
:
892 return ctx
->Polygon
.StippleFlag
;
893 case GL_POLYGON_OFFSET_POINT
:
894 return ctx
->Polygon
.OffsetPoint
;
895 case GL_POLYGON_OFFSET_LINE
:
896 return ctx
->Polygon
.OffsetLine
;
897 case GL_POLYGON_OFFSET_FILL
:
898 /*case GL_POLYGON_OFFSET_EXT:*/
899 return ctx
->Polygon
.OffsetFill
;
900 case GL_RESCALE_NORMAL_EXT
:
901 return ctx
->Transform
.RescaleNormals
;
902 case GL_SCISSOR_TEST
:
903 return ctx
->Scissor
.Enabled
;
904 case GL_SHARED_TEXTURE_PALETTE_EXT
:
905 return ctx
->Texture
.SharedPalette
;
906 case GL_STENCIL_TEST
:
907 return ctx
->Stencil
.Enabled
;
910 const struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
911 return (texUnit
->Enabled
& TEXTURE0_1D
) ? GL_TRUE
: GL_FALSE
;
915 const struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
916 return (texUnit
->Enabled
& TEXTURE0_2D
) ? GL_TRUE
: GL_FALSE
;
920 const struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
921 return (texUnit
->Enabled
& TEXTURE0_3D
) ? GL_TRUE
: GL_FALSE
;
923 case GL_TEXTURE_GEN_Q
:
925 const struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
926 return (texUnit
->TexGenEnabled
& Q_BIT
) ? GL_TRUE
: GL_FALSE
;
928 case GL_TEXTURE_GEN_R
:
930 const struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
931 return (texUnit
->TexGenEnabled
& R_BIT
) ? GL_TRUE
: GL_FALSE
;
933 case GL_TEXTURE_GEN_S
:
935 const struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
936 return (texUnit
->TexGenEnabled
& S_BIT
) ? GL_TRUE
: GL_FALSE
;
938 case GL_TEXTURE_GEN_T
:
940 const struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
941 return (texUnit
->TexGenEnabled
& T_BIT
) ? GL_TRUE
: GL_FALSE
;
947 case GL_VERTEX_ARRAY
:
948 return ctx
->Array
.Vertex
.Enabled
;
949 case GL_NORMAL_ARRAY
:
950 return ctx
->Array
.Normal
.Enabled
;
952 return ctx
->Array
.Color
.Enabled
;
954 return ctx
->Array
.Index
.Enabled
;
955 case GL_TEXTURE_COORD_ARRAY
:
956 return ctx
->Array
.TexCoord
[ctx
->Array
.ActiveTexture
].Enabled
;
957 case GL_EDGE_FLAG_ARRAY
:
958 return ctx
->Array
.EdgeFlag
.Enabled
;
960 /* GL_HP_occlusion_test */
961 case GL_OCCLUSION_TEST_HP
:
962 if (ctx
->Extensions
.HP_occlusion_test
) {
963 return ctx
->Depth
.OcclusionTest
;
966 _mesa_error( ctx
, GL_INVALID_ENUM
, "glIsEnabled" );
970 /* GL_SGIS_pixel_texture */
971 case GL_PIXEL_TEXTURE_SGIS
:
972 return ctx
->Pixel
.PixelTextureEnabled
;
974 /* GL_SGIX_pixel_texture */
975 case GL_PIXEL_TEX_GEN_SGIX
:
976 return ctx
->Pixel
.PixelTextureEnabled
;
978 /* GL_SGI_color_table */
979 case GL_COLOR_TABLE_SGI
:
980 return ctx
->Pixel
.ColorTableEnabled
;
981 case GL_POST_CONVOLUTION_COLOR_TABLE_SGI
:
982 return ctx
->Pixel
.PostConvolutionColorTableEnabled
;
983 case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI
:
984 return ctx
->Pixel
.PostColorMatrixColorTableEnabled
;
986 /* GL_EXT_convolution */
987 case GL_CONVOLUTION_1D
:
988 return ctx
->Pixel
.Convolution1DEnabled
;
989 case GL_CONVOLUTION_2D
:
990 return ctx
->Pixel
.Convolution2DEnabled
;
991 case GL_SEPARABLE_2D
:
992 return ctx
->Pixel
.Separable2DEnabled
;
994 /* GL_ARB_texture_cube_map */
995 case GL_TEXTURE_CUBE_MAP_ARB
:
996 if (ctx
->Extensions
.ARB_texture_cube_map
) {
997 const struct gl_texture_unit
*texUnit
= &ctx
->Texture
.Unit
[ctx
->Texture
.CurrentUnit
];
998 return (texUnit
->Enabled
& TEXTURE0_CUBE
) ? GL_TRUE
: GL_FALSE
;
1001 _mesa_error(ctx
, GL_INVALID_ENUM
, "glIsEnabled");
1005 /* GL_MESA_sprite_point */
1006 case GL_SPRITE_POINT_MESA
:
1007 return ctx
->Point
.SpriteMode
;
1010 _mesa_error( ctx
, GL_INVALID_ENUM
, "glIsEnabled" );