blob: 537d2dda88c30c854bd9f8f5e765f5f6ca844c21 [file] [log] [blame]
Brian Paulfa4525e2000-08-21 14:22:24 +00001/* $Id: enable.c,v 1.22 2000/08/21 14:22:24 brianp Exp $ */
jtgafb833d1999-08-19 00:55:39 +00002
3/*
4 * Mesa 3-D graphics library
Brian Paulfbd8f211999-11-11 01:22:25 +00005 * Version: 3.3
jtgafb833d1999-08-19 00:55:39 +00006 *
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
Brian Paulfbd8f211999-11-11 01:22:25 +000031#include "glheader.h"
jtgafb833d1999-08-19 00:55:39 +000032#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"
jtgafb833d1999-08-19 00:55:39 +000043#endif
44
45
46
47/*
48 * Perform glEnable and glDisable calls.
49 */
Brian Paulfbd8f211999-11-11 01:22:25 +000050void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state )
jtgafb833d1999-08-19 00:55:39 +000051{
52 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx, "gl_enable/disable" );
53
54 if (MESA_VERBOSE & VERBOSE_API)
Keith Whitwell2be79c11999-08-26 14:50:49 +000055 fprintf(stderr, "%s %s (newstate is %x)\n",
jtgafb833d1999-08-19 00:55:39 +000056 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;
Brian Paulfbd8f211999-11-11 01:22:25 +0000119 if (state)
120 gl_update_color_material( ctx, ctx->Current.ByteColor );
jtgafb833d1999-08-19 00:55:39 +0000121 }
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;
Keith Whitwell2be79c11999-08-26 14:50:49 +0000154 ctx->NewState |= NEW_FOG|NEW_RASTER_OPS;
jtgafb833d1999-08-19 00:55:39 +0000155 }
156 break;
Brian Paul1a1cf7e2000-05-04 13:48:49 +0000157 case GL_HISTOGRAM:
158 ctx->Pixel.HistogramEnabled = state;
159 break;
jtgafb833d1999-08-19 00:55:39 +0000160 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;
Brian Paul2c318aa1999-10-20 22:16:45 +0000190 if (state)
jtgafb833d1999-08-19 00:55:39 +0000191 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;
Brian Paul1afd9462000-05-05 23:41:52 +0000198 ctx->TriangleCaps ^= DD_LINE_SMOOTH;
jtgafb833d1999-08-19 00:55:39 +0000199 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;
Brian Paul1a1cf7e2000-05-04 13:48:49 +0000275 case GL_MINMAX:
276 ctx->Pixel.MinMaxEnabled = state;
277 break;
jtgafb833d1999-08-19 00:55:39 +0000278 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;
jtgafb833d1999-08-19 00:55:39 +0000338 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;
Keith Whitwell1bf9dfa1999-09-18 20:41:22 +0000347 ctx->TriangleCaps ^= DD_STENCIL;
jtgafb833d1999-08-19 00:55:39 +0000348 }
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:
Brian Paul45224fa1999-09-07 22:31:30 +0000455 ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled = state;
jtgafb833d1999-08-19 00:55:39 +0000456 break;
457 case GL_EDGE_FLAG_ARRAY:
458 ctx->Array.EdgeFlag.Enabled = state;
459 break;
460
Brian Paul1b2ff692000-03-11 23:23:26 +0000461 /* GL_HP_occlusion_test */
462 case GL_OCCLUSION_TEST_HP:
463 if (ctx->Extensions.HaveHpOcclusionTest) {
464 ctx->Depth.OcclusionTest = state;
Brian Paul7e67fb42000-04-04 15:14:10 +0000465 if (state)
466 ctx->OcclusionResult = ctx->OcclusionResultSaved;
467 else
468 ctx->OcclusionResultSaved = ctx->OcclusionResult;
Brian Paul1b2ff692000-03-11 23:23:26 +0000469 ctx->NewState |= NEW_RASTER_OPS;
470 }
471 else {
472 gl_error( ctx, GL_INVALID_ENUM, state ? "glEnable": "glDisable" );
473 return;
474 }
475 break;
476
Brian Paul2b2e9252000-04-07 16:27:26 +0000477 /* GL_SGIS_pixel_texture */
478 case GL_PIXEL_TEXTURE_SGIS:
Brian Paulfa4525e2000-08-21 14:22:24 +0000479 /* XXX check for extension */
Brian Paul2b2e9252000-04-07 16:27:26 +0000480 ctx->Pixel.PixelTextureEnabled = state;
481 break;
482
483 /* GL_SGIX_pixel_texture */
484 case GL_PIXEL_TEX_GEN_SGIX:
Brian Paulfa4525e2000-08-21 14:22:24 +0000485 /* XXX check for extension */
Brian Paul2b2e9252000-04-07 16:27:26 +0000486 ctx->Pixel.PixelTextureEnabled = state;
487 break;
488
Brian Paul13811372000-04-12 00:27:37 +0000489 /* GL_SGI_color_table */
490 case GL_COLOR_TABLE_SGI:
Brian Paulfa4525e2000-08-21 14:22:24 +0000491 /* XXX check for extension */
Brian Paul13811372000-04-12 00:27:37 +0000492 ctx->Pixel.ColorTableEnabled = state;
Brian Paulfa4525e2000-08-21 14:22:24 +0000493 ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
Brian Paul13811372000-04-12 00:27:37 +0000494 break;
495 case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
496 ctx->Pixel.PostConvolutionColorTableEnabled = state;
Brian Paulfa4525e2000-08-21 14:22:24 +0000497 ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
Brian Paul13811372000-04-12 00:27:37 +0000498 break;
499 case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
500 ctx->Pixel.PostColorMatrixColorTableEnabled = state;
Brian Paulfa4525e2000-08-21 14:22:24 +0000501 ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
Brian Paul13811372000-04-12 00:27:37 +0000502 break;
503
Brian Paul82b02f02000-05-07 20:37:40 +0000504 /* GL_EXT_convolution */
505 case GL_CONVOLUTION_1D:
Brian Paulfa4525e2000-08-21 14:22:24 +0000506 /* XXX check for extension */
Brian Paul82b02f02000-05-07 20:37:40 +0000507 ctx->Pixel.Convolution1DEnabled = state;
Brian Paulfa4525e2000-08-21 14:22:24 +0000508 ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
Brian Paul82b02f02000-05-07 20:37:40 +0000509 break;
510 case GL_CONVOLUTION_2D:
511 ctx->Pixel.Convolution2DEnabled = state;
Brian Paulfa4525e2000-08-21 14:22:24 +0000512 ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
Brian Paul82b02f02000-05-07 20:37:40 +0000513 break;
514 case GL_SEPARABLE_2D:
515 ctx->Pixel.Separable2DEnabled = state;
Brian Paulfa4525e2000-08-21 14:22:24 +0000516 ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
Brian Paul82b02f02000-05-07 20:37:40 +0000517 break;
518
Brian Paul86fc3702000-05-22 16:33:20 +0000519 /* GL_ARB_texture_cube_map */
520 case GL_TEXTURE_CUBE_MAP_ARB:
Brian Paulfc4b4432000-05-23 15:17:12 +0000521 if (ctx->Extensions.HaveTextureCubeMap) {
522 if (ctx->Visual->RGBAflag) {
523 const GLuint curr = ctx->Texture.CurrentUnit;
524 const GLuint flag = TEXTURE0_CUBE << (curr * 4);
525 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[curr];
526 ctx->NewState |= NEW_TEXTURE_ENABLE;
527 if (state) {
528 texUnit->Enabled |= TEXTURE0_CUBE;
529 ctx->Enabled |= flag;
530 }
531 else {
532 texUnit->Enabled &= ~TEXTURE0_CUBE;
533 ctx->Enabled &= ~flag;
534 }
Brian Paul86fc3702000-05-22 16:33:20 +0000535 }
536 }
Brian Paulfc4b4432000-05-23 15:17:12 +0000537 else {
538 if (state)
539 gl_error(ctx, GL_INVALID_ENUM, "glEnable");
540 else
541 gl_error(ctx, GL_INVALID_ENUM, "glDisable");
542 return;
543 }
Brian Paul86fc3702000-05-22 16:33:20 +0000544 break;
Brian Paul86fc3702000-05-22 16:33:20 +0000545
jtgafb833d1999-08-19 00:55:39 +0000546 default:
547 if (state) {
548 gl_error( ctx, GL_INVALID_ENUM, "glEnable" );
549 }
550 else {
551 gl_error( ctx, GL_INVALID_ENUM, "glDisable" );
552 }
553 return;
554 }
555
556 if (ctx->Driver.Enable) {
557 (*ctx->Driver.Enable)( ctx, cap, state );
558 }
559}
560
561
562
563
Brian Paulfbd8f211999-11-11 01:22:25 +0000564void
565_mesa_Enable( GLenum cap )
jtgafb833d1999-08-19 00:55:39 +0000566{
Brian Paulfbd8f211999-11-11 01:22:25 +0000567 GET_CURRENT_CONTEXT(ctx);
568 _mesa_set_enable( ctx, cap, GL_TRUE );
jtgafb833d1999-08-19 00:55:39 +0000569}
570
571
572
Brian Paulfbd8f211999-11-11 01:22:25 +0000573void
574_mesa_Disable( GLenum cap )
jtgafb833d1999-08-19 00:55:39 +0000575{
Brian Paulfbd8f211999-11-11 01:22:25 +0000576 GET_CURRENT_CONTEXT(ctx);
577 _mesa_set_enable( ctx, cap, GL_FALSE );
jtgafb833d1999-08-19 00:55:39 +0000578}
579
580
581
Brian Paulfbd8f211999-11-11 01:22:25 +0000582GLboolean
583_mesa_IsEnabled( GLenum cap )
jtgafb833d1999-08-19 00:55:39 +0000584{
Brian Paulfbd8f211999-11-11 01:22:25 +0000585 GET_CURRENT_CONTEXT(ctx);
jtgafb833d1999-08-19 00:55:39 +0000586 switch (cap) {
587 case GL_ALPHA_TEST:
588 return ctx->Color.AlphaEnabled;
589 case GL_AUTO_NORMAL:
590 return ctx->Eval.AutoNormal;
591 case GL_BLEND:
592 return ctx->Color.BlendEnabled;
593 case GL_CLIP_PLANE0:
594 case GL_CLIP_PLANE1:
595 case GL_CLIP_PLANE2:
596 case GL_CLIP_PLANE3:
597 case GL_CLIP_PLANE4:
598 case GL_CLIP_PLANE5:
599 return ctx->Transform.ClipEnabled[cap-GL_CLIP_PLANE0];
600 case GL_COLOR_MATERIAL:
601 return ctx->Light.ColorMaterialEnabled;
602 case GL_CULL_FACE:
603 return ctx->Polygon.CullFlag;
604 case GL_DEPTH_TEST:
605 return ctx->Depth.Test;
606 case GL_DITHER:
607 return ctx->Color.DitherFlag;
608 case GL_FOG:
609 return ctx->Fog.Enabled;
Brian Paul1a1cf7e2000-05-04 13:48:49 +0000610 case GL_HISTOGRAM:
611 return ctx->Pixel.HistogramEnabled;
jtgafb833d1999-08-19 00:55:39 +0000612 case GL_LIGHTING:
613 return ctx->Light.Enabled;
614 case GL_LIGHT0:
615 case GL_LIGHT1:
616 case GL_LIGHT2:
617 case GL_LIGHT3:
618 case GL_LIGHT4:
619 case GL_LIGHT5:
620 case GL_LIGHT6:
621 case GL_LIGHT7:
622 return ctx->Light.Light[cap-GL_LIGHT0].Enabled;
623 case GL_LINE_SMOOTH:
624 return ctx->Line.SmoothFlag;
625 case GL_LINE_STIPPLE:
626 return ctx->Line.StippleFlag;
627 case GL_INDEX_LOGIC_OP:
628 return ctx->Color.IndexLogicOpEnabled;
629 case GL_COLOR_LOGIC_OP:
630 return ctx->Color.ColorLogicOpEnabled;
631 case GL_MAP1_COLOR_4:
632 return ctx->Eval.Map1Color4;
633 case GL_MAP1_INDEX:
634 return ctx->Eval.Map1Index;
635 case GL_MAP1_NORMAL:
636 return ctx->Eval.Map1Normal;
637 case GL_MAP1_TEXTURE_COORD_1:
638 return ctx->Eval.Map1TextureCoord1;
639 case GL_MAP1_TEXTURE_COORD_2:
640 return ctx->Eval.Map1TextureCoord2;
641 case GL_MAP1_TEXTURE_COORD_3:
642 return ctx->Eval.Map1TextureCoord3;
643 case GL_MAP1_TEXTURE_COORD_4:
644 return ctx->Eval.Map1TextureCoord4;
645 case GL_MAP1_VERTEX_3:
646 return ctx->Eval.Map1Vertex3;
647 case GL_MAP1_VERTEX_4:
648 return ctx->Eval.Map1Vertex4;
649 case GL_MAP2_COLOR_4:
650 return ctx->Eval.Map2Color4;
651 case GL_MAP2_INDEX:
652 return ctx->Eval.Map2Index;
653 case GL_MAP2_NORMAL:
654 return ctx->Eval.Map2Normal;
655 case GL_MAP2_TEXTURE_COORD_1:
656 return ctx->Eval.Map2TextureCoord1;
657 case GL_MAP2_TEXTURE_COORD_2:
658 return ctx->Eval.Map2TextureCoord2;
659 case GL_MAP2_TEXTURE_COORD_3:
660 return ctx->Eval.Map2TextureCoord3;
661 case GL_MAP2_TEXTURE_COORD_4:
662 return ctx->Eval.Map2TextureCoord4;
663 case GL_MAP2_VERTEX_3:
664 return ctx->Eval.Map2Vertex3;
665 case GL_MAP2_VERTEX_4:
666 return ctx->Eval.Map2Vertex4;
Brian Paul1a1cf7e2000-05-04 13:48:49 +0000667 case GL_MINMAX:
668 return ctx->Pixel.MinMaxEnabled;
jtgafb833d1999-08-19 00:55:39 +0000669 case GL_NORMALIZE:
670 return ctx->Transform.Normalize;
671 case GL_POINT_SMOOTH:
672 return ctx->Point.SmoothFlag;
673 case GL_POLYGON_SMOOTH:
674 return ctx->Polygon.SmoothFlag;
675 case GL_POLYGON_STIPPLE:
676 return ctx->Polygon.StippleFlag;
677 case GL_POLYGON_OFFSET_POINT:
678 return ctx->Polygon.OffsetPoint;
679 case GL_POLYGON_OFFSET_LINE:
680 return ctx->Polygon.OffsetLine;
681 case GL_POLYGON_OFFSET_FILL:
682 /*case GL_POLYGON_OFFSET_EXT:*/
683 return ctx->Polygon.OffsetFill;
684 case GL_RESCALE_NORMAL_EXT:
685 return ctx->Transform.RescaleNormals;
686 case GL_SCISSOR_TEST:
687 return ctx->Scissor.Enabled;
688 case GL_SHARED_TEXTURE_PALETTE_EXT:
689 return ctx->Texture.SharedPalette;
690 case GL_STENCIL_TEST:
691 return ctx->Stencil.Enabled;
692 case GL_TEXTURE_1D:
693 {
694 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
695 return (texUnit->Enabled & TEXTURE0_1D) ? GL_TRUE : GL_FALSE;
696 }
697 case GL_TEXTURE_2D:
698 {
699 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
700 return (texUnit->Enabled & TEXTURE0_2D) ? GL_TRUE : GL_FALSE;
701 }
702 case GL_TEXTURE_3D:
703 {
704 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
Brian Paul65b5e1e1999-08-19 13:24:27 +0000705 return (texUnit->Enabled & TEXTURE0_3D) ? GL_TRUE : GL_FALSE;
jtgafb833d1999-08-19 00:55:39 +0000706 }
707 case GL_TEXTURE_GEN_Q:
708 {
709 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
710 return (texUnit->TexGenEnabled & Q_BIT) ? GL_TRUE : GL_FALSE;
711 }
712 case GL_TEXTURE_GEN_R:
713 {
714 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
715 return (texUnit->TexGenEnabled & R_BIT) ? GL_TRUE : GL_FALSE;
716 }
717 case GL_TEXTURE_GEN_S:
718 {
719 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
720 return (texUnit->TexGenEnabled & S_BIT) ? GL_TRUE : GL_FALSE;
721 }
722 case GL_TEXTURE_GEN_T:
723 {
724 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
725 return (texUnit->TexGenEnabled & T_BIT) ? GL_TRUE : GL_FALSE;
726 }
727
728 /*
729 * CLIENT STATE!!!
730 */
731 case GL_VERTEX_ARRAY:
732 return ctx->Array.Vertex.Enabled;
733 case GL_NORMAL_ARRAY:
734 return ctx->Array.Normal.Enabled;
735 case GL_COLOR_ARRAY:
736 return ctx->Array.Color.Enabled;
737 case GL_INDEX_ARRAY:
738 return ctx->Array.Index.Enabled;
739 case GL_TEXTURE_COORD_ARRAY:
Brian Paul45224fa1999-09-07 22:31:30 +0000740 return ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled;
jtgafb833d1999-08-19 00:55:39 +0000741 case GL_EDGE_FLAG_ARRAY:
742 return ctx->Array.EdgeFlag.Enabled;
Brian Paul1b2ff692000-03-11 23:23:26 +0000743
744 /* GL_HP_occlusion_test */
745 case GL_OCCLUSION_TEST_HP:
746 if (ctx->Extensions.HaveHpOcclusionTest) {
747 return ctx->Depth.OcclusionTest;
748 }
749 else {
750 gl_error( ctx, GL_INVALID_ENUM, "glIsEnabled" );
751 return GL_FALSE;
752 }
753
Brian Paul2b2e9252000-04-07 16:27:26 +0000754 /* GL_SGIS_pixel_texture */
755 case GL_PIXEL_TEXTURE_SGIS:
756 return ctx->Pixel.PixelTextureEnabled;
Brian Paul2b2e9252000-04-07 16:27:26 +0000757
758 /* GL_SGIX_pixel_texture */
759 case GL_PIXEL_TEX_GEN_SGIX:
760 return ctx->Pixel.PixelTextureEnabled;
Brian Paul13811372000-04-12 00:27:37 +0000761
762 /* GL_SGI_color_table */
763 case GL_COLOR_TABLE_SGI:
764 return ctx->Pixel.ColorTableEnabled;
765 case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
766 return ctx->Pixel.PostConvolutionColorTableEnabled;
767 case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
768 return ctx->Pixel.PostColorMatrixColorTableEnabled;
Brian Paul2b2e9252000-04-07 16:27:26 +0000769
Brian Paul82b02f02000-05-07 20:37:40 +0000770 /* GL_EXT_convolution */
771 case GL_CONVOLUTION_1D:
772 return ctx->Pixel.Convolution1DEnabled;
773 case GL_CONVOLUTION_2D:
774 return ctx->Pixel.Convolution2DEnabled;
775 case GL_SEPARABLE_2D:
776 return ctx->Pixel.Separable2DEnabled;
777
Brian Paul86fc3702000-05-22 16:33:20 +0000778 /* GL_ARB_texture_cube_map */
779 case GL_TEXTURE_CUBE_MAP_ARB:
Brian Paulfc4b4432000-05-23 15:17:12 +0000780 if (ctx->Extensions.HaveTextureCubeMap) {
781 const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
782 return (texUnit->Enabled & TEXTURE0_CUBE) ? GL_TRUE : GL_FALSE;
Brian Paul86fc3702000-05-22 16:33:20 +0000783 }
Brian Paulfc4b4432000-05-23 15:17:12 +0000784 else {
785 gl_error(ctx, GL_INVALID_ENUM, "glIsEnabled");
786 return GL_FALSE;
787 }
Brian Paul86fc3702000-05-22 16:33:20 +0000788
jtgafb833d1999-08-19 00:55:39 +0000789 default:
790 gl_error( ctx, GL_INVALID_ENUM, "glIsEnabled" );
791 return GL_FALSE;
792 }
793}
794
795
796
797
Brian Paulfbd8f211999-11-11 01:22:25 +0000798static void
799client_state( GLcontext *ctx, GLenum cap, GLboolean state )
jtgafb833d1999-08-19 00:55:39 +0000800{
801 ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH( ctx,
802 (state
803 ? "glEnableClientState"
804 : "glDisableClientState") );
805
806 switch (cap) {
807 case GL_VERTEX_ARRAY:
808 ctx->Array.Vertex.Enabled = state;
809 break;
810 case GL_NORMAL_ARRAY:
811 ctx->Array.Normal.Enabled = state;
812 break;
813 case GL_COLOR_ARRAY:
814 ctx->Array.Color.Enabled = state;
815 break;
816 case GL_INDEX_ARRAY:
817 ctx->Array.Index.Enabled = state;
818 break;
819 case GL_TEXTURE_COORD_ARRAY:
Brian Paul45224fa1999-09-07 22:31:30 +0000820 ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled = state;
jtgafb833d1999-08-19 00:55:39 +0000821 break;
822 case GL_EDGE_FLAG_ARRAY:
823 ctx->Array.EdgeFlag.Enabled = state;
824 break;
825 default:
826 gl_error( ctx, GL_INVALID_ENUM, "glEnable/DisableClientState" );
827 }
828
829 ctx->NewState |= NEW_CLIENT_STATE;
830}
831
832
833
Brian Paulfbd8f211999-11-11 01:22:25 +0000834void
835_mesa_EnableClientState( GLenum cap )
jtgafb833d1999-08-19 00:55:39 +0000836{
Brian Paulfbd8f211999-11-11 01:22:25 +0000837 GET_CURRENT_CONTEXT(ctx);
838 client_state( ctx, cap, GL_TRUE );
jtgafb833d1999-08-19 00:55:39 +0000839}
840
841
842
Brian Paulfbd8f211999-11-11 01:22:25 +0000843void
844_mesa_DisableClientState( GLenum cap )
jtgafb833d1999-08-19 00:55:39 +0000845{
Brian Paulfbd8f211999-11-11 01:22:25 +0000846 GET_CURRENT_CONTEXT(ctx);
847 client_state( ctx, cap, GL_FALSE );
jtgafb833d1999-08-19 00:55:39 +0000848}
849