replaced experimental MESA_sprite_point with NV_point_sprite
[mesa.git] / src / mesa / main / mtypes.h
1 /* $Id: mtypes.h,v 1.76 2002/05/27 17:04:53 brianp Exp $ */
2
3 /*
4 * Mesa 3-D graphics library
5 * Version: 4.1
6 *
7 * Copyright (C) 1999-2002 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 * \file mtypes.h
29 * \brief Main Mesa data structures.
30 */
31
32 #ifndef TYPES_H
33 #define TYPES_H
34
35
36 #include "glheader.h"
37 #include "config.h" /* Hardwired parameters */
38 #include "glapitable.h"
39 #include "glthread.h"
40
41 #include "math/m_matrix.h" /* GLmatrix */
42
43 #if defined(MESA_TRACE)
44 #include "Trace/tr_context.h"
45 #endif
46
47
48 /* Please try to mark derived values with a leading underscore ('_').
49 */
50
51 /*
52 * Color channel data type:
53 */
54 #if CHAN_BITS == 8
55 typedef GLubyte GLchan;
56 #define CHAN_MAX 255
57 #define CHAN_MAXF 255.0F
58 #define CHAN_TYPE GL_UNSIGNED_BYTE
59 #elif CHAN_BITS == 16
60 typedef GLushort GLchan;
61 #define CHAN_MAX 65535
62 #define CHAN_MAXF 65535.0F
63 #define CHAN_TYPE GL_UNSIGNED_SHORT
64 #elif CHAN_BITS == 32
65 typedef GLfloat GLchan;
66 #define CHAN_MAX 1.0
67 #define CHAN_MAXF 1.0F
68 #define CHAN_TYPE GL_FLOAT
69 #else
70 #error "illegal number of color channel bits"
71 #endif
72
73
74 /**
75 * Accumulation buffer data type:
76 */
77 #if ACCUM_BITS==8
78 typedef GLbyte GLaccum;
79 #elif ACCUM_BITS==16
80 typedef GLshort GLaccum;
81 #elif ACCUM_BITS==32
82 typedef GLfloat GLaccum;
83 #else
84 # error "illegal number of accumulation bits"
85 #endif
86
87
88 /**
89 * Stencil buffer data type:
90 */
91 #if STENCIL_BITS==8
92 typedef GLubyte GLstencil;
93 # define STENCIL_MAX 0xff
94 #elif STENCIL_BITS==16
95 typedef GLushort GLstencil;
96 # define STENCIL_MAX 0xffff
97 #else
98 # error "illegal number of stencil bits"
99 #endif
100
101
102 /**
103 * Depth buffer data type:
104 */
105 typedef GLuint GLdepth; /* Must be 32-bits! */
106
107
108 /**
109 * Fixed point data type:
110 */
111 typedef int GLfixed;
112
113
114
115 /**
116 * Some forward type declarations
117 */
118 struct _mesa_HashTable;
119 struct gl_texture_image;
120 struct gl_texture_object;
121 typedef struct __GLcontextRec GLcontext;
122 typedef struct __GLcontextModesRec GLvisual;
123 typedef struct gl_frame_buffer GLframebuffer;
124
125
126
127 /* These define the aliases between numbered vertex attributes and
128 * conventional OpenGL vertex attributes. We use these values in
129 * quite a few places. New in Mesa 4.1.
130 */
131 #define VERT_ATTRIB_POS 0
132 #define VERT_ATTRIB_WEIGHT 1
133 #define VERT_ATTRIB_NORMAL 2
134 #define VERT_ATTRIB_COLOR0 3
135 #define VERT_ATTRIB_COLOR1 4
136 #define VERT_ATTRIB_FOG 5
137 #define VERT_ATTRIB_SIX 6
138 #define VERT_ATTRIB_SEVEN 7
139 #define VERT_ATTRIB_TEX0 8
140 #define VERT_ATTRIB_TEX1 9
141 #define VERT_ATTRIB_TEX2 10
142 #define VERT_ATTRIB_TEX3 11
143 #define VERT_ATTRIB_TEX4 12
144 #define VERT_ATTRIB_TEX5 13
145 #define VERT_ATTRIB_TEX6 14
146 #define VERT_ATTRIB_TEX7 15
147 #define VERT_ATTRIB_MAX 16
148
149 /* These are used in bitfields in many places */
150 #define VERT_BIT_POS (1 << VERT_ATTRIB_POS)
151 #define VERT_BIT_WEIGHT (1 << VERT_ATTRIB_WEIGHT)
152 #define VERT_BIT_NORMAL (1 << VERT_ATTRIB_NORMAL)
153 #define VERT_BIT_COLOR0 (1 << VERT_ATTRIB_COLOR0)
154 #define VERT_BIT_COLOR1 (1 << VERT_ATTRIB_COLOR1)
155 #define VERT_BIT_FOG (1 << VERT_ATTRIB_FOG)
156 #define VERT_BIT_SIX (1 << VERT_ATTRIB_SIX)
157 #define VERT_BIT_SEVEN (1 << VERT_ATTRIB_SEVEN)
158 #define VERT_BIT_TEX0 (1 << VERT_ATTRIB_TEX0)
159 #define VERT_BIT_TEX1 (1 << VERT_ATTRIB_TEX1)
160 #define VERT_BIT_TEX2 (1 << VERT_ATTRIB_TEX2)
161 #define VERT_BIT_TEX3 (1 << VERT_ATTRIB_TEX3)
162 #define VERT_BIT_TEX4 (1 << VERT_ATTRIB_TEX4)
163 #define VERT_BIT_TEX5 (1 << VERT_ATTRIB_TEX5)
164 #define VERT_BIT_TEX6 (1 << VERT_ATTRIB_TEX6)
165 #define VERT_BIT_TEX7 (1 << VERT_ATTRIB_TEX7)
166
167 #define VERT_BIT_TEX(u) (1 << (VERT_ATTRIB_TEX0 + (u)))
168
169
170
171 /**
172 * Maximum number of temporary vertices required for clipping. (Used
173 * in array_cache and tnl modules).
174 */
175 #define MAX_CLIPPED_VERTICES ((2 * (6 + MAX_CLIP_PLANES))+1)
176
177
178 /* Data structure for color tables */
179 struct gl_color_table {
180 GLenum Format; /* GL_ALPHA, GL_RGB, GL_RGB, etc */
181 GLenum IntFormat;
182 GLuint Size; /* number of entries (rows) in table */
183 GLvoid *Table; /* either GLfloat * or GLchan * */
184 GLboolean FloatTable; /* are entries stored as floats? */
185 GLubyte RedSize;
186 GLubyte GreenSize;
187 GLubyte BlueSize;
188 GLubyte AlphaSize;
189 GLubyte LuminanceSize;
190 GLubyte IntensitySize;
191 };
192
193
194 /*
195 * Bit flags used for updating material values.
196 */
197 #define FRONT_AMBIENT_BIT 0x1
198 #define BACK_AMBIENT_BIT 0x2
199 #define FRONT_DIFFUSE_BIT 0x4
200 #define BACK_DIFFUSE_BIT 0x8
201 #define FRONT_SPECULAR_BIT 0x10
202 #define BACK_SPECULAR_BIT 0x20
203 #define FRONT_EMISSION_BIT 0x40
204 #define BACK_EMISSION_BIT 0x80
205 #define FRONT_SHININESS_BIT 0x100
206 #define BACK_SHININESS_BIT 0x200
207 #define FRONT_INDEXES_BIT 0x400
208 #define BACK_INDEXES_BIT 0x800
209
210 #define FRONT_MATERIAL_BITS (FRONT_EMISSION_BIT | FRONT_AMBIENT_BIT | \
211 FRONT_DIFFUSE_BIT | FRONT_SPECULAR_BIT | \
212 FRONT_SHININESS_BIT | FRONT_INDEXES_BIT)
213
214 #define BACK_MATERIAL_BITS (BACK_EMISSION_BIT | BACK_AMBIENT_BIT | \
215 BACK_DIFFUSE_BIT | BACK_SPECULAR_BIT | \
216 BACK_SHININESS_BIT | BACK_INDEXES_BIT)
217
218 #define ALL_MATERIAL_BITS (FRONT_MATERIAL_BITS | BACK_MATERIAL_BITS)
219
220
221
222 /*
223 * Specular exponent and material shininess lookup table sizes:
224 */
225 #define EXP_TABLE_SIZE 512
226 #define SHINE_TABLE_SIZE 256
227
228 struct gl_shine_tab {
229 struct gl_shine_tab *next, *prev;
230 GLfloat tab[SHINE_TABLE_SIZE+1];
231 GLfloat shininess;
232 GLuint refcount;
233 };
234
235
236 struct gl_light {
237 struct gl_light *next; /* double linked list with sentinel */
238 struct gl_light *prev;
239
240 GLfloat Ambient[4]; /* ambient color */
241 GLfloat Diffuse[4]; /* diffuse color */
242 GLfloat Specular[4]; /* specular color */
243 GLfloat EyePosition[4]; /* position in eye coordinates */
244 GLfloat EyeDirection[4]; /* spotlight dir in eye coordinates */
245 GLfloat SpotExponent;
246 GLfloat SpotCutoff; /* in degress */
247 GLfloat _CosCutoff; /* = MAX(0, cos(SpotCutoff)) */
248 GLfloat ConstantAttenuation;
249 GLfloat LinearAttenuation;
250 GLfloat QuadraticAttenuation;
251 GLboolean Enabled; /* On/off flag */
252
253 /* Derived fields */
254 GLuint _Flags; /* State */
255
256 GLfloat _Position[4]; /* position in eye/obj coordinates */
257 GLfloat _VP_inf_norm[3]; /* Norm direction to infinite light */
258 GLfloat _h_inf_norm[3]; /* Norm( _VP_inf_norm + <0,0,1> ) */
259 GLfloat _NormDirection[4]; /* normalized spotlight direction */
260 GLfloat _VP_inf_spot_attenuation;
261
262 GLfloat _SpotExpTable[EXP_TABLE_SIZE][2]; /* to replace a pow() call */
263 GLfloat _MatAmbient[2][3]; /* material ambient * light ambient */
264 GLfloat _MatDiffuse[2][3]; /* material diffuse * light diffuse */
265 GLfloat _MatSpecular[2][3]; /* material spec * light specular */
266 GLfloat _dli; /* CI diffuse light intensity */
267 GLfloat _sli; /* CI specular light intensity */
268 };
269
270
271 struct gl_lightmodel {
272 GLfloat Ambient[4]; /* ambient color */
273 GLboolean LocalViewer; /* Local (or infinite) view point? */
274 GLboolean TwoSide; /* Two (or one) sided lighting? */
275 GLenum ColorControl; /* either GL_SINGLE_COLOR */
276 /* or GL_SEPARATE_SPECULAR_COLOR */
277 };
278
279
280 struct gl_material
281 {
282 GLfloat Ambient[4];
283 GLfloat Diffuse[4];
284 GLfloat Specular[4];
285 GLfloat Emission[4];
286 GLfloat Shininess;
287 GLfloat AmbientIndex; /* for color index lighting */
288 GLfloat DiffuseIndex; /* for color index lighting */
289 GLfloat SpecularIndex; /* for color index lighting */
290 };
291
292
293 /*
294 * Attribute structures:
295 * We define a struct for each attribute group to make pushing and
296 * popping attributes easy. Also it's a good organization.
297 */
298 struct gl_accum_attrib {
299 GLfloat ClearColor[4]; /* Accumulation buffer clear color */
300 };
301
302
303 /*
304 * Used in DrawDestMask below
305 */
306 #define FRONT_LEFT_BIT 1
307 #define FRONT_RIGHT_BIT 2
308 #define BACK_LEFT_BIT 4
309 #define BACK_RIGHT_BIT 8
310
311
312 struct gl_colorbuffer_attrib {
313 GLuint ClearIndex; /* Index to use for glClear */
314 GLchan ClearColor[4]; /* Color to use for glClear */
315
316 GLuint IndexMask; /* Color index write mask */
317 GLubyte ColorMask[4]; /* Each flag is 0xff or 0x0 */
318
319 GLenum DrawBuffer; /* Which buffer to draw into */
320 GLenum DriverDrawBuffer; /* Current device driver dest buffer */
321 GLboolean MultiDrawBuffer; /* Drawing to multiple buffers? */
322 GLubyte DrawDestMask; /* bitwise-OR of bitflags above */
323
324 /* alpha testing */
325 GLboolean AlphaEnabled; /* Alpha test enabled flag */
326 GLenum AlphaFunc; /* Alpha test function */
327 GLchan AlphaRef; /* Alpha ref value as GLchan */
328
329 /* blending */
330 GLboolean BlendEnabled; /* Blending enabled flag */
331 GLenum BlendSrcRGB; /* Blending source operator */
332 GLenum BlendDstRGB; /* Blending destination operator */
333 GLenum BlendSrcA; /* GL_INGR_blend_func_separate */
334 GLenum BlendDstA; /* GL_INGR_blend_func_separate */
335 GLenum BlendEquation;
336 GLfloat BlendColor[4];
337
338 /* logic op */
339 GLenum LogicOp; /* Logic operator */
340 GLboolean IndexLogicOpEnabled; /* Color index logic op enabled flag */
341 GLboolean ColorLogicOpEnabled; /* RGBA logic op enabled flag */
342
343 GLboolean DitherFlag; /* Dither enable flag */
344 };
345
346
347 struct gl_current_attrib {
348 /* These values valid only when FLUSH_VERTICES has been called.
349 */
350 GLfloat Attrib[VERT_ATTRIB_MAX][4]; /* Current vertex attributes */
351 /* indexed by VERT_ATTRIB_* */
352 GLuint Index; /* Current color index */
353 GLboolean EdgeFlag; /* Current edge flag */
354
355 /* These values are always valid. BTW, note how similar this set of
356 * attributes is to the SWvertex datatype in the software rasterizer...
357 */
358 GLfloat RasterPos[4]; /* Current raster position */
359 GLfloat RasterDistance; /* Current raster distance */
360 GLfloat RasterColor[4]; /* Current raster color */
361 GLfloat RasterSecondaryColor[4]; /* Current rast 2ndary color */
362 GLuint RasterIndex; /* Current raster index */
363 GLfloat RasterTexCoords[MAX_TEXTURE_UNITS][4];/* Current raster texcoords */
364 GLboolean RasterPosValid; /* Raster pos valid flag */
365 };
366
367
368 struct gl_depthbuffer_attrib {
369 GLenum Func; /* Function for depth buffer compare */
370 GLfloat Clear; /* Value to clear depth buffer to */
371 GLboolean Test; /* Depth buffering enabled flag */
372 GLboolean Mask; /* Depth buffer writable? */
373 GLboolean OcclusionTest; /* GL_HP_occlusion_test */
374 };
375
376
377 struct gl_enable_attrib {
378 GLboolean AlphaTest;
379 GLboolean AutoNormal;
380 GLboolean Blend;
381 GLuint ClipPlanes;
382 GLboolean ColorMaterial;
383 GLboolean Convolution1D;
384 GLboolean Convolution2D;
385 GLboolean Separable2D;
386 GLboolean CullFace;
387 GLboolean DepthTest;
388 GLboolean Dither;
389 GLboolean Fog;
390 GLboolean Histogram;
391 GLboolean Light[MAX_LIGHTS];
392 GLboolean Lighting;
393 GLboolean LineSmooth;
394 GLboolean LineStipple;
395 GLboolean IndexLogicOp;
396 GLboolean ColorLogicOp;
397 GLboolean Map1Color4;
398 GLboolean Map1Index;
399 GLboolean Map1Normal;
400 GLboolean Map1TextureCoord1;
401 GLboolean Map1TextureCoord2;
402 GLboolean Map1TextureCoord3;
403 GLboolean Map1TextureCoord4;
404 GLboolean Map1Vertex3;
405 GLboolean Map1Vertex4;
406 GLboolean Map1Attrib[16]; /* GL_NV_vertex_program */
407 GLboolean Map2Color4;
408 GLboolean Map2Index;
409 GLboolean Map2Normal;
410 GLboolean Map2TextureCoord1;
411 GLboolean Map2TextureCoord2;
412 GLboolean Map2TextureCoord3;
413 GLboolean Map2TextureCoord4;
414 GLboolean Map2Vertex3;
415 GLboolean Map2Vertex4;
416 GLboolean Map2Attrib[16]; /* GL_NV_vertex_program */
417 GLboolean MinMax;
418 GLboolean Normalize;
419 GLboolean PixelTexture;
420 GLboolean PointSmooth;
421 GLboolean PolygonOffsetPoint;
422 GLboolean PolygonOffsetLine;
423 GLboolean PolygonOffsetFill;
424 GLboolean PolygonSmooth;
425 GLboolean PolygonStipple;
426 GLboolean RescaleNormals;
427 GLboolean Scissor;
428 GLboolean Stencil;
429 GLboolean MultisampleEnabled; /* GL_ARB_multisample */
430 GLboolean SampleAlphaToCoverage; /* GL_ARB_multisample */
431 GLboolean SampleAlphaToOne; /* GL_ARB_multisample */
432 GLboolean SampleCoverage; /* GL_ARB_multisample */
433 GLboolean SampleCoverageInvert; /* GL_ARB_multisample */
434 GLboolean RasterPositionUnclipped; /* GL_IBM_rasterpos_clip */
435 GLuint Texture[MAX_TEXTURE_UNITS];
436 GLuint TexGen[MAX_TEXTURE_UNITS];
437 GLboolean VertexProgram; /* GL_NV_vertex_program */
438 GLboolean VertexProgramPointSize; /* GL_NV_vertex_program */
439 GLboolean VertexProgramTwoSide; /* GL_NV_vertex_program */
440 GLboolean PointSprite; /* GL_NV_point_sprite */
441 };
442
443
444 struct gl_eval_attrib {
445 /* Enable bits */
446 GLboolean Map1Color4;
447 GLboolean Map1Index;
448 GLboolean Map1Normal;
449 GLboolean Map1TextureCoord1;
450 GLboolean Map1TextureCoord2;
451 GLboolean Map1TextureCoord3;
452 GLboolean Map1TextureCoord4;
453 GLboolean Map1Vertex3;
454 GLboolean Map1Vertex4;
455 GLboolean Map1Attrib[16]; /* GL_NV_vertex_program */
456 GLboolean Map2Color4;
457 GLboolean Map2Index;
458 GLboolean Map2Normal;
459 GLboolean Map2TextureCoord1;
460 GLboolean Map2TextureCoord2;
461 GLboolean Map2TextureCoord3;
462 GLboolean Map2TextureCoord4;
463 GLboolean Map2Vertex3;
464 GLboolean Map2Vertex4;
465 GLboolean Map2Attrib[16]; /* GL_NV_vertex_program */
466 GLboolean AutoNormal;
467 /* Map Grid endpoints and divisions and calculated du values */
468 GLint MapGrid1un;
469 GLfloat MapGrid1u1, MapGrid1u2, MapGrid1du;
470 GLint MapGrid2un, MapGrid2vn;
471 GLfloat MapGrid2u1, MapGrid2u2, MapGrid2du;
472 GLfloat MapGrid2v1, MapGrid2v2, MapGrid2dv;
473 };
474
475
476 struct gl_fog_attrib {
477 GLboolean Enabled; /* Fog enabled flag */
478 GLfloat Color[4]; /* Fog color */
479 GLfloat Density; /* Density >= 0.0 */
480 GLfloat Start; /* Start distance in eye coords */
481 GLfloat End; /* End distance in eye coords */
482 GLfloat Index; /* Fog index */
483 GLenum Mode; /* Fog mode */
484 GLboolean ColorSumEnabled;
485 GLenum FogCoordinateSource; /* GL_EXT_fog_coord */
486 };
487
488
489 struct gl_hint_attrib {
490 /* always one of GL_FASTEST, GL_NICEST, or GL_DONT_CARE */
491 GLenum PerspectiveCorrection;
492 GLenum PointSmooth;
493 GLenum LineSmooth;
494 GLenum PolygonSmooth;
495 GLenum Fog;
496 GLenum ClipVolumeClipping; /* GL_EXT_clip_volume_hint */
497 GLenum TextureCompression; /* GL_ARB_texture_compression */
498 GLenum GenerateMipmap; /* GL_SGIS_generate_mipmap */
499 };
500
501
502 struct gl_histogram_attrib {
503 GLuint Width; /* number of table entries */
504 GLint Format; /* GL_ALPHA, GL_RGB, etc */
505 GLuint Count[HISTOGRAM_TABLE_SIZE][4]; /* the histogram */
506 GLboolean Sink; /* terminate image transfer? */
507 GLubyte RedSize; /* Bits per counter */
508 GLubyte GreenSize;
509 GLubyte BlueSize;
510 GLubyte AlphaSize;
511 GLubyte LuminanceSize;
512 };
513
514
515 struct gl_minmax_attrib {
516 GLenum Format;
517 GLboolean Sink;
518 GLfloat Min[4], Max[4]; /* RGBA */
519 };
520
521
522 struct gl_convolution_attrib {
523 GLenum Format;
524 GLenum InternalFormat;
525 GLuint Width;
526 GLuint Height;
527 GLfloat Filter[MAX_CONVOLUTION_WIDTH * MAX_CONVOLUTION_HEIGHT * 4];
528 };
529
530
531 #define LIGHT_SPOT 0x1
532 #define LIGHT_LOCAL_VIEWER 0x2
533 #define LIGHT_POSITIONAL 0x4
534 #define LIGHT_NEED_VERTICES (LIGHT_POSITIONAL|LIGHT_LOCAL_VIEWER)
535
536 struct gl_light_attrib {
537 struct gl_light Light[MAX_LIGHTS]; /* Array of lights */
538 struct gl_lightmodel Model; /* Lighting model */
539
540 /* Must flush FLUSH_VERTICES before referencing:
541 */
542 struct gl_material Material[2]; /* Material 0=front, 1=back */
543
544 GLboolean Enabled; /* Lighting enabled flag */
545 GLenum ShadeModel; /* GL_FLAT or GL_SMOOTH */
546 GLenum ColorMaterialFace; /* GL_FRONT, BACK or FRONT_AND_BACK */
547 GLenum ColorMaterialMode; /* GL_AMBIENT, GL_DIFFUSE, etc */
548 GLuint ColorMaterialBitmask; /* bitmask formed from Face and Mode */
549 GLboolean ColorMaterialEnabled;
550
551 struct gl_light EnabledList; /* List sentinel */
552
553 /* Derived for optimizations: */
554 GLboolean _NeedVertices; /* Use fast shader? */
555 GLuint _Flags; /* LIGHT_* flags, see above */
556 GLfloat _BaseColor[2][3];
557 };
558
559
560 struct gl_line_attrib {
561 GLboolean SmoothFlag; /* GL_LINE_SMOOTH enabled? */
562 GLboolean StippleFlag; /* GL_LINE_STIPPLE enabled? */
563 GLushort StipplePattern; /* Stipple pattern */
564 GLint StippleFactor; /* Stipple repeat factor */
565 GLfloat Width; /* Line width */
566 GLfloat _Width; /* Clamped Line width */
567 };
568
569
570 struct gl_list_attrib {
571 GLuint ListBase;
572 };
573
574
575 struct gl_list_opcode {
576 GLuint size;
577 void (*execute)( GLcontext *ctx, void *data );
578 void (*destroy)( GLcontext *ctx, void *data );
579 void (*print)( GLcontext *ctx, void *data );
580 };
581
582 #define GL_MAX_EXT_OPCODES 16
583
584 struct gl_list_extensions {
585 struct gl_list_opcode opcode[GL_MAX_EXT_OPCODES];
586 GLuint nr_opcodes;
587 };
588
589
590 struct gl_multisample_attrib {
591 GLboolean Enabled;
592 GLboolean SampleAlphaToCoverage;
593 GLboolean SampleAlphaToOne;
594 GLboolean SampleCoverage;
595 GLfloat SampleCoverageValue;
596 GLboolean SampleCoverageInvert;
597 };
598
599
600 struct gl_pixel_attrib {
601 GLenum ReadBuffer; /* src buffer for glRead/CopyPixels */
602 GLenum DriverReadBuffer; /* Driver's current source buffer */
603 GLfloat RedBias, RedScale;
604 GLfloat GreenBias, GreenScale;
605 GLfloat BlueBias, BlueScale;
606 GLfloat AlphaBias, AlphaScale;
607 GLfloat DepthBias, DepthScale;
608 GLint IndexShift, IndexOffset;
609 GLboolean MapColorFlag;
610 GLboolean MapStencilFlag;
611 GLfloat ZoomX, ZoomY;
612 /* XXX move these out of gl_pixel_attrib */
613 GLint MapStoSsize; /* Size of each pixel map */
614 GLint MapItoIsize;
615 GLint MapItoRsize;
616 GLint MapItoGsize;
617 GLint MapItoBsize;
618 GLint MapItoAsize;
619 GLint MapRtoRsize;
620 GLint MapGtoGsize;
621 GLint MapBtoBsize;
622 GLint MapAtoAsize;
623 GLint MapStoS[MAX_PIXEL_MAP_TABLE]; /* Pixel map tables */
624 GLint MapItoI[MAX_PIXEL_MAP_TABLE];
625 GLfloat MapItoR[MAX_PIXEL_MAP_TABLE];
626 GLfloat MapItoG[MAX_PIXEL_MAP_TABLE];
627 GLfloat MapItoB[MAX_PIXEL_MAP_TABLE];
628 GLfloat MapItoA[MAX_PIXEL_MAP_TABLE];
629 GLubyte MapItoR8[MAX_PIXEL_MAP_TABLE]; /* converted to 8-bit color */
630 GLubyte MapItoG8[MAX_PIXEL_MAP_TABLE];
631 GLubyte MapItoB8[MAX_PIXEL_MAP_TABLE];
632 GLubyte MapItoA8[MAX_PIXEL_MAP_TABLE];
633 GLfloat MapRtoR[MAX_PIXEL_MAP_TABLE];
634 GLfloat MapGtoG[MAX_PIXEL_MAP_TABLE];
635 GLfloat MapBtoB[MAX_PIXEL_MAP_TABLE];
636 GLfloat MapAtoA[MAX_PIXEL_MAP_TABLE];
637 /* GL_EXT_histogram */
638 GLboolean HistogramEnabled;
639 GLboolean MinMaxEnabled;
640 /* GL_SGIS_pixel_texture */
641 GLboolean PixelTextureEnabled;
642 GLenum FragmentRgbSource;
643 GLenum FragmentAlphaSource;
644 /* GL_SGI_color_matrix */
645 GLfloat PostColorMatrixScale[4]; /* RGBA */
646 GLfloat PostColorMatrixBias[4]; /* RGBA */
647 /* GL_SGI_color_table */
648 GLfloat ColorTableScale[4];
649 GLfloat ColorTableBias[4];
650 GLboolean ColorTableEnabled;
651 GLfloat PCCTscale[4];
652 GLfloat PCCTbias[4];
653 GLboolean PostConvolutionColorTableEnabled;
654 GLfloat PCMCTscale[4];
655 GLfloat PCMCTbias[4];
656 GLboolean PostColorMatrixColorTableEnabled;
657 /* Convolution */
658 GLboolean Convolution1DEnabled;
659 GLboolean Convolution2DEnabled;
660 GLboolean Separable2DEnabled;
661 GLfloat ConvolutionBorderColor[3][4];
662 GLenum ConvolutionBorderMode[3];
663 GLfloat ConvolutionFilterScale[3][4];
664 GLfloat ConvolutionFilterBias[3][4];
665 GLfloat PostConvolutionScale[4]; /* RGBA */
666 GLfloat PostConvolutionBias[4]; /* RGBA */
667 };
668
669
670 struct gl_point_attrib {
671 GLboolean SmoothFlag; /* True if GL_POINT_SMOOTH is enabled */
672 GLfloat Size; /* User-specified point size */
673 GLfloat _Size; /* Size clamped to Const.Min/MaxPointSize */
674 GLfloat Params[3]; /* GL_EXT_point_parameters */
675 GLfloat MinSize, MaxSize; /* GL_EXT_point_parameters */
676 GLfloat Threshold; /* GL_EXT_point_parameters */
677 GLboolean _Attenuated; /* True if Params != [1, 0, 0] */
678 GLboolean PointSprite; /* GL_NV_point_sprite */
679 GLboolean CoordReplace[MAX_TEXTURE_UNITS]; /* GL_NV_point_sprite */
680 GLenum SpriteRMode; /* GL_NV_point_sprite */
681 };
682
683
684 struct gl_polygon_attrib {
685 GLenum FrontFace; /* Either GL_CW or GL_CCW */
686 GLenum FrontMode; /* Either GL_POINT, GL_LINE or GL_FILL */
687 GLenum BackMode; /* Either GL_POINT, GL_LINE or GL_FILL */
688 GLboolean _FrontBit; /* */
689 GLboolean CullFlag; /* Culling on/off flag */
690 GLboolean SmoothFlag; /* True if GL_POLYGON_SMOOTH is enabled */
691 GLboolean StippleFlag; /* True if GL_POLYGON_STIPPLE is enabled */
692 GLenum CullFaceMode; /* Culling mode GL_FRONT or GL_BACK */
693 GLfloat OffsetFactor; /* Polygon offset factor, from user */
694 GLfloat OffsetUnits; /* Polygon offset units, from user */
695 GLfloat OffsetMRD; /* = OffsetUnits * visual->MRD */
696 GLboolean OffsetPoint; /* Offset in GL_POINT mode */
697 GLboolean OffsetLine; /* Offset in GL_LINE mode */
698 GLboolean OffsetFill; /* Offset in GL_FILL mode */
699 GLboolean _OffsetAny;
700 };
701
702
703 struct gl_scissor_attrib {
704 GLboolean Enabled; /* Scissor test enabled? */
705 GLint X, Y; /* Lower left corner of box */
706 GLsizei Width, Height; /* Size of box */
707 };
708
709
710 struct gl_stencil_attrib {
711 GLboolean Enabled; /* Enabled flag */
712 GLenum Function; /* Stencil function */
713 GLenum FailFunc; /* Fail function */
714 GLenum ZPassFunc; /* Depth buffer pass function */
715 GLenum ZFailFunc; /* Depth buffer fail function */
716 GLstencil Ref; /* Reference value */
717 GLstencil ValueMask; /* Value mask */
718 GLstencil Clear; /* Clear value */
719 GLstencil WriteMask; /* Write mask */
720 };
721
722
723 /* TexGenEnabled flags */
724 #define S_BIT 1
725 #define T_BIT 2
726 #define R_BIT 4
727 #define Q_BIT 8
728
729 /* Texture Enabled flags */
730 #define TEXTURE0_1D 0x1 /* Texture unit 0 (default) */
731 #define TEXTURE0_2D 0x2
732 #define TEXTURE0_3D 0x4
733 #define TEXTURE0_CUBE 0x8
734 #define TEXTURE0_ANY (TEXTURE0_1D | TEXTURE0_2D | TEXTURE0_3D | TEXTURE0_CUBE)
735 #define TEXTURE1_1D (TEXTURE0_1D << 4) /* Texture unit 1 */
736 #define TEXTURE1_2D (TEXTURE0_2D << 4)
737 #define TEXTURE1_3D (TEXTURE0_3D << 4)
738 #define TEXTURE1_CUBE (TEXTURE0_CUBE << 4)
739 #define TEXTURE1_ANY (TEXTURE1_1D | TEXTURE1_2D | TEXTURE1_3D | TEXTURE1_CUBE)
740 #define TEXTURE2_1D (TEXTURE0_1D << 8) /* Texture unit 2 */
741 #define TEXTURE2_2D (TEXTURE0_2D << 8)
742 #define TEXTURE2_3D (TEXTURE0_3D << 8)
743 #define TEXTURE2_CUBE (TEXTURE0_CUBE << 8)
744 #define TEXTURE2_ANY (TEXTURE2_1D | TEXTURE2_2D | TEXTURE2_3D | TEXTURE2_CUBE)
745 #define TEXTURE3_1D (TEXTURE0_1D << 12) /* Texture unit 3 */
746 #define TEXTURE3_2D (TEXTURE0_2D << 12)
747 #define TEXTURE3_3D (TEXTURE0_3D << 12)
748 #define TEXTURE3_CUBE (TEXTURE0_CUBE << 12)
749 #define TEXTURE3_ANY (TEXTURE3_1D | TEXTURE3_2D | TEXTURE3_3D | TEXTURE3_CUBE)
750 #define TEXTURE4_1D (TEXTURE0_1D << 16) /* Texture unit 4 */
751 #define TEXTURE4_2D (TEXTURE0_2D << 16)
752 #define TEXTURE4_3D (TEXTURE0_3D << 16)
753 #define TEXTURE4_CUBE (TEXTURE0_CUBE << 16)
754 #define TEXTURE5_ANY (TEXTURE3_1D | TEXTURE3_2D | TEXTURE3_3D | TEXTURE3_CUBE)
755 #define TEXTURE5_1D (TEXTURE0_1D << 20) /* Texture unit 5 */
756 #define TEXTURE5_2D (TEXTURE0_2D << 20)
757 #define TEXTURE5_3D (TEXTURE0_3D << 20)
758 #define TEXTURE5_CUBE (TEXTURE0_CUBE << 20)
759 #define TEXTURE5_ANY (TEXTURE3_1D | TEXTURE3_2D | TEXTURE3_3D | TEXTURE3_CUBE)
760 #define TEXTURE6_1D (TEXTURE0_1D << 24) /* Texture unit 6 */
761 #define TEXTURE6_2D (TEXTURE0_2D << 24)
762 #define TEXTURE6_3D (TEXTURE0_3D << 24)
763 #define TEXTURE6_CUBE (TEXTURE0_CUBE << 24)
764 #define TEXTURE6_ANY (TEXTURE3_1D | TEXTURE3_2D | TEXTURE3_3D | TEXTURE3_CUBE)
765 #define TEXTURE7_1D (TEXTURE0_1D << 28) /* Texture unit 7 */
766 #define TEXTURE7_2D (TEXTURE0_2D << 28)
767 #define TEXTURE7_3D (TEXTURE0_3D << 28)
768 #define TEXTURE7_CUBE (TEXTURE0_CUBE << 28)
769 #define TEXTURE7_ANY (TEXTURE3_1D | TEXTURE3_2D | TEXTURE3_3D | TEXTURE3_CUBE)
770
771 /* Bitmap versions of the GL_ constants.
772 */
773 #define TEXGEN_SPHERE_MAP 0x1
774 #define TEXGEN_OBJ_LINEAR 0x2
775 #define TEXGEN_EYE_LINEAR 0x4
776 #define TEXGEN_REFLECTION_MAP_NV 0x8
777 #define TEXGEN_NORMAL_MAP_NV 0x10
778
779 #define TEXGEN_NEED_NORMALS (TEXGEN_SPHERE_MAP | \
780 TEXGEN_REFLECTION_MAP_NV | \
781 TEXGEN_NORMAL_MAP_NV)
782 #define TEXGEN_NEED_EYE_COORD (TEXGEN_SPHERE_MAP | \
783 TEXGEN_REFLECTION_MAP_NV | \
784 TEXGEN_NORMAL_MAP_NV | \
785 TEXGEN_EYE_LINEAR)
786
787
788
789 /* A selection of state flags to make driver and module's lives easier.
790 */
791 #define ENABLE_TEXGEN0 0x1
792 #define ENABLE_TEXGEN1 0x2
793 #define ENABLE_TEXGEN2 0x4
794 #define ENABLE_TEXGEN3 0x8
795 #define ENABLE_TEXGEN4 0x10
796 #define ENABLE_TEXGEN5 0x20
797 #define ENABLE_TEXGEN6 0x40
798 #define ENABLE_TEXGEN7 0x80
799
800 #define ENABLE_TEXMAT0 0x1 /* Ie. not the identity matrix */
801 #define ENABLE_TEXMAT1 0x2
802 #define ENABLE_TEXMAT2 0x4
803 #define ENABLE_TEXMAT3 0x8
804 #define ENABLE_TEXMAT4 0x10
805 #define ENABLE_TEXMAT5 0x20
806 #define ENABLE_TEXMAT6 0x40
807 #define ENABLE_TEXMAT7 0x80
808
809 #define ENABLE_TEXGEN(i) (ENABLE_TEXGEN0 << (i))
810 #define ENABLE_TEXMAT(i) (ENABLE_TEXMAT0 << (i))
811
812 /*
813 * If teximage is color-index, texelOut returns GLchan[1].
814 * If teximage is depth, texelOut returns GLfloat[1].
815 * Otherwise, texelOut returns GLchan[4].
816 */
817 typedef void (*FetchTexelFunc)( const struct gl_texture_image *texImage,
818 GLint col, GLint row, GLint img,
819 GLvoid *texelOut );
820
821 /* Texture format record */
822 struct gl_texture_format {
823 GLint MesaFormat; /* One of the MESA_FORMAT_* values */
824
825 GLenum BaseFormat; /* Either GL_ALPHA, GL_INTENSITY, GL_LUMINANCE,
826 * GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA,
827 * GL_COLOR_INDEX or GL_DEPTH_COMPONENT.
828 */
829 GLenum Type; /* Internal type as GL enum value */
830
831 GLubyte RedBits; /* Bits per texel component */
832 GLubyte GreenBits;
833 GLubyte BlueBits;
834 GLubyte AlphaBits;
835 GLubyte LuminanceBits;
836 GLubyte IntensityBits;
837 GLubyte IndexBits;
838 GLubyte DepthBits;
839
840 GLint TexelBytes;
841
842 FetchTexelFunc FetchTexel1D; /* Texel fetch function pointers */
843 FetchTexelFunc FetchTexel2D;
844 FetchTexelFunc FetchTexel3D;
845 };
846
847 /* Texture image record */
848 struct gl_texture_image {
849 GLenum Format; /* GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA,
850 * GL_INTENSITY, GL_RGB, GL_RGBA,
851 * GL_COLOR_INDEX or GL_DEPTH_COMPONENT only.
852 */
853 GLint IntFormat; /* Internal format as given by the user */
854 GLuint Border; /* 0 or 1 */
855 GLuint Width; /* = 2^WidthLog2 + 2*Border */
856 GLuint Height; /* = 2^HeightLog2 + 2*Border */
857 GLuint Depth; /* = 2^DepthLog2 + 2*Border */
858 GLuint Width2; /* = Width - 2*Border */
859 GLuint Height2; /* = Height - 2*Border */
860 GLuint Depth2; /* = Depth - 2*Border */
861 GLuint WidthLog2; /* = log2(Width2) */
862 GLuint HeightLog2; /* = log2(Height2) */
863 GLuint DepthLog2; /* = log2(Depth2) */
864 GLuint MaxLog2; /* = MAX(WidthLog2, HeightLog2) */
865 GLvoid *Data; /* Image data, accessed via FetchTexel() */
866
867 const struct gl_texture_format *TexFormat;
868
869 FetchTexelFunc FetchTexel; /* Texel fetch function pointer */
870
871 GLboolean IsCompressed; /* GL_ARB_texture_compression */
872 GLuint CompressedSize; /* GL_ARB_texture_compression */
873
874 /* For device driver: */
875 void *DriverData; /* Arbitrary device driver data */
876 };
877
878
879 /* Texture object record */
880 struct gl_texture_object {
881 _glthread_Mutex Mutex; /* for thread safety */
882 GLint RefCount; /* reference count */
883 GLuint Name; /* an unsigned integer */
884 GLuint Dimensions; /* 1 or 2 or 3 or 6 (cube map) */
885 GLfloat Priority; /* in [0,1] */
886 GLfloat BorderValues[4]; /* unclamped */
887 GLchan BorderColor[4]; /* clamped, as GLchan */
888 GLenum WrapS; /* Wrap modes are: GL_CLAMP, REPEAT */
889 GLenum WrapT; /* GL_CLAMP_TO_EDGE, and */
890 GLenum WrapR; /* GL_CLAMP_TO_BORDER_ARB */
891 GLenum MinFilter; /* minification filter */
892 GLenum MagFilter; /* magnification filter */
893 GLfloat MinLod; /* min lambda, OpenGL 1.2 */
894 GLfloat MaxLod; /* max lambda, OpenGL 1.2 */
895 GLint BaseLevel; /* min mipmap level, OpenGL 1.2 */
896 GLint MaxLevel; /* max mipmap level, OpenGL 1.2 */
897 GLfloat MaxAnisotropy; /* GL_EXT_texture_filter_anisotropic */
898 GLboolean CompareFlag; /* GL_SGIX_shadow */
899 GLenum CompareOperator; /* GL_SGIX_shadow */
900 GLchan ShadowAmbient; /* GL_SGIX/ARB_shadow_ambient */
901 GLenum CompareMode; /* GL_ARB_shadow */
902 GLenum CompareFunc; /* GL_ARB_shadow */
903 GLenum DepthMode; /* GL_ARB_depth_texture */
904 GLint _MaxLevel; /* actual max mipmap level (q in the spec) */
905 GLfloat _MaxLambda; /* = _MaxLevel - BaseLevel (q - b in spec) */
906 GLboolean GenerateMipmap; /* GL_SGIS_generate_mipmap */
907
908 struct gl_texture_image *Image[MAX_TEXTURE_LEVELS];
909
910 /* Texture cube faces */
911 /* Image[] is alias for *PosX[MAX_TEXTURE_LEVELS]; */
912 struct gl_texture_image *NegX[MAX_TEXTURE_LEVELS];
913 struct gl_texture_image *PosY[MAX_TEXTURE_LEVELS];
914 struct gl_texture_image *NegY[MAX_TEXTURE_LEVELS];
915 struct gl_texture_image *PosZ[MAX_TEXTURE_LEVELS];
916 struct gl_texture_image *NegZ[MAX_TEXTURE_LEVELS];
917
918 /* GL_EXT_paletted_texture */
919 struct gl_color_table Palette;
920
921 GLboolean Complete; /* Is texture object complete? */
922 struct gl_texture_object *Next; /* Next in linked list */
923
924 /* For device driver: */
925 void *DriverData; /* Arbitrary device driver data */
926 };
927
928
929
930 /*
931 * Texture units are new with the multitexture extension.
932 */
933 struct gl_texture_unit {
934 GLuint Enabled; /* bitmask of TEXTURE0_1D, _2D, _3D, _CUBE */
935 GLuint _ReallyEnabled; /* 0 or one of TEXTURE0_1D, _2D, _3D, _CUBE */
936
937 GLenum EnvMode; /* GL_MODULATE, GL_DECAL, GL_BLEND, etc. */
938 GLfloat EnvColor[4];
939 GLuint TexGenEnabled; /* Bitwise-OR of [STRQ]_BIT values */
940 GLenum GenModeS; /* Tex coord generation mode, either */
941 GLenum GenModeT; /* GL_OBJECT_LINEAR, or */
942 GLenum GenModeR; /* GL_EYE_LINEAR, or */
943 GLenum GenModeQ; /* GL_SPHERE_MAP */
944 GLuint _GenBitS;
945 GLuint _GenBitT;
946 GLuint _GenBitR;
947 GLuint _GenBitQ;
948 GLuint _GenFlags; /* bitwise or of GenBit[STRQ] */
949 GLfloat ObjectPlaneS[4];
950 GLfloat ObjectPlaneT[4];
951 GLfloat ObjectPlaneR[4];
952 GLfloat ObjectPlaneQ[4];
953 GLfloat EyePlaneS[4];
954 GLfloat EyePlaneT[4];
955 GLfloat EyePlaneR[4];
956 GLfloat EyePlaneQ[4];
957 GLfloat LodBias; /* for biasing mipmap levels */
958
959 /* GL_EXT_texture_env_combine */
960 GLenum CombineModeRGB; /* GL_REPLACE, GL_DECAL, GL_ADD, etc. */
961 GLenum CombineModeA; /* GL_REPLACE, GL_DECAL, GL_ADD, etc. */
962 GLenum CombineSourceRGB[3]; /* GL_PRIMARY_COLOR, GL_TEXTURE, etc. */
963 GLenum CombineSourceA[3]; /* GL_PRIMARY_COLOR, GL_TEXTURE, etc. */
964 GLenum CombineOperandRGB[3]; /* SRC_COLOR, ONE_MINUS_SRC_COLOR, etc */
965 GLenum CombineOperandA[3]; /* SRC_ALPHA, ONE_MINUS_SRC_ALPHA, etc */
966 GLuint CombineScaleShiftRGB; /* 0, 1 or 2 */
967 GLuint CombineScaleShiftA; /* 0, 1 or 2 */
968
969 struct gl_texture_object *Current1D;
970 struct gl_texture_object *Current2D;
971 struct gl_texture_object *Current3D;
972 struct gl_texture_object *CurrentCubeMap; /* GL_ARB_texture_cube_map */
973
974 struct gl_texture_object *_Current; /* Points to really enabled tex obj */
975
976 struct gl_texture_object Saved1D; /* only used by glPush/PopAttrib */
977 struct gl_texture_object Saved2D;
978 struct gl_texture_object Saved3D;
979 struct gl_texture_object SavedCubeMap;
980 };
981
982
983 struct gl_texture_attrib {
984 /* multitexture */
985 GLuint CurrentUnit; /* Active texture unit */
986
987 GLuint _ReallyEnabled; /* enables for all texture units: */
988 /* = (Unit[0]._ReallyEnabled << 0) | */
989 /* (Unit[1]._ReallyEnabled << 4) | */
990 /* (Unit[2]._ReallyEnabled << 8) | etc... */
991
992 GLuint _GenFlags; /* for texgen */
993 GLuint _TexGenEnabled;
994 GLuint _TexMatEnabled;
995
996 struct gl_texture_unit Unit[MAX_TEXTURE_UNITS];
997
998 struct gl_texture_object *Proxy1D;
999 struct gl_texture_object *Proxy2D;
1000 struct gl_texture_object *Proxy3D;
1001 struct gl_texture_object *ProxyCubeMap;
1002
1003 /* GL_EXT_shared_texture_palette */
1004 GLboolean SharedPalette;
1005 struct gl_color_table Palette;
1006 };
1007
1008
1009 struct gl_transform_attrib {
1010 GLenum MatrixMode; /* Matrix mode */
1011 GLfloat EyeUserPlane[MAX_CLIP_PLANES][4];
1012 GLfloat _ClipUserPlane[MAX_CLIP_PLANES][4]; /* derived */
1013 GLuint ClipPlanesEnabled; /* on/off bitmask */
1014 GLboolean Normalize; /* Normalize all normals? */
1015 GLboolean RescaleNormals; /* GL_EXT_rescale_normal */
1016 GLboolean RasterPositionUnclipped; /* GL_IBM_rasterpos_clip */
1017 };
1018
1019
1020 struct gl_viewport_attrib {
1021 GLint X, Y; /* position */
1022 GLsizei Width, Height; /* size */
1023 GLfloat Near, Far; /* Depth buffer range */
1024 GLmatrix _WindowMap; /* Mapping transformation as a matrix. */
1025 };
1026
1027
1028 /* For the attribute stack: */
1029 struct gl_attrib_node {
1030 GLbitfield kind;
1031 void *data;
1032 struct gl_attrib_node *next;
1033 };
1034
1035
1036 /*
1037 * Client pixel packing/unpacking attributes
1038 */
1039 struct gl_pixelstore_attrib {
1040 GLint Alignment;
1041 GLint RowLength;
1042 GLint SkipPixels;
1043 GLint SkipRows;
1044 GLint ImageHeight; /* for GL_EXT_texture3D */
1045 GLint SkipImages; /* for GL_EXT_texture3D */
1046 GLboolean SwapBytes;
1047 GLboolean LsbFirst;
1048 };
1049
1050
1051 #define CA_CLIENT_DATA 0x1 /* Data not alloced by mesa */
1052
1053
1054 /*
1055 * Client vertex array attributes
1056 */
1057 struct gl_client_array {
1058 GLint Size;
1059 GLenum Type;
1060 GLsizei Stride; /* user-specified stride */
1061 GLsizei StrideB; /* actual stride in bytes */
1062 void *Ptr;
1063 GLuint Flags;
1064 GLuint Enabled; /* one of the _NEW_ARRAY_ bits */
1065 };
1066
1067
1068 struct gl_array_attrib {
1069 struct gl_client_array Vertex; /* client data descriptors */
1070 struct gl_client_array Normal;
1071 struct gl_client_array Color;
1072 struct gl_client_array SecondaryColor;
1073 struct gl_client_array FogCoord;
1074 struct gl_client_array Index;
1075 struct gl_client_array TexCoord[MAX_TEXTURE_UNITS];
1076 struct gl_client_array EdgeFlag;
1077
1078 struct gl_client_array VertexAttrib[16]; /* GL_NV_vertex_program */
1079
1080 GLint TexCoordInterleaveFactor;
1081 GLint ActiveTexture; /* Client Active Texture */
1082 GLuint LockFirst;
1083 GLuint LockCount;
1084
1085 GLuint _Enabled; /* _NEW_ARRAY_* - bit set if array enabled */
1086 GLuint NewState; /* _NEW_ARRAY_* */
1087 };
1088
1089
1090 struct gl_feedback {
1091 GLenum Type;
1092 GLuint _Mask; /* FB_* bits */
1093 GLfloat *Buffer;
1094 GLuint BufferSize;
1095 GLuint Count;
1096 };
1097
1098
1099 struct gl_selection {
1100 GLuint *Buffer;
1101 GLuint BufferSize; /* size of SelectBuffer */
1102 GLuint BufferCount; /* number of values in SelectBuffer */
1103 GLuint Hits; /* number of records in SelectBuffer */
1104 GLuint NameStackDepth;
1105 GLuint NameStack[MAX_NAME_STACK_DEPTH];
1106 GLboolean HitFlag;
1107 GLfloat HitMinZ, HitMaxZ;
1108 };
1109
1110
1111 /*
1112 * 1-D Evaluator control points
1113 */
1114 struct gl_1d_map {
1115 GLuint Order; /* Number of control points */
1116 GLfloat u1, u2, du; /* u1, u2, 1.0/(u2-u1) */
1117 GLfloat *Points; /* Points to contiguous control points */
1118 };
1119
1120
1121 /*
1122 * 2-D Evaluator control points
1123 */
1124 struct gl_2d_map {
1125 GLuint Uorder; /* Number of control points in U dimension */
1126 GLuint Vorder; /* Number of control points in V dimension */
1127 GLfloat u1, u2, du;
1128 GLfloat v1, v2, dv;
1129 GLfloat *Points; /* Points to contiguous control points */
1130 };
1131
1132
1133 /*
1134 * All evalutator control points
1135 */
1136 struct gl_evaluators {
1137 /* 1-D maps */
1138 struct gl_1d_map Map1Vertex3;
1139 struct gl_1d_map Map1Vertex4;
1140 struct gl_1d_map Map1Index;
1141 struct gl_1d_map Map1Color4;
1142 struct gl_1d_map Map1Normal;
1143 struct gl_1d_map Map1Texture1;
1144 struct gl_1d_map Map1Texture2;
1145 struct gl_1d_map Map1Texture3;
1146 struct gl_1d_map Map1Texture4;
1147 struct gl_1d_map Map1Attrib[16]; /* GL_NV_vertex_program */
1148
1149 /* 2-D maps */
1150 struct gl_2d_map Map2Vertex3;
1151 struct gl_2d_map Map2Vertex4;
1152 struct gl_2d_map Map2Index;
1153 struct gl_2d_map Map2Color4;
1154 struct gl_2d_map Map2Normal;
1155 struct gl_2d_map Map2Texture1;
1156 struct gl_2d_map Map2Texture2;
1157 struct gl_2d_map Map2Texture3;
1158 struct gl_2d_map Map2Texture4;
1159 struct gl_2d_map Map2Attrib[16]; /* GL_NV_vertex_program */
1160 };
1161
1162
1163 /*
1164 * Vertex program tokens and datatypes
1165 */
1166
1167 #define VP_MAX_INSTRUCTIONS 128
1168
1169 #define VP_NUM_INPUT_REGS VERT_ATTRIB_MAX
1170 #define VP_NUM_OUTPUT_REGS 15
1171 #define VP_NUM_TEMP_REGS 12
1172 #define VP_NUM_PROG_REGS 96
1173
1174 #define VP_NUM_TOTAL_REGISTERS (VP_NUM_INPUT_REGS + VP_NUM_OUTPUT_REGS + VP_NUM_TEMP_REGS + VP_NUM_PROG_REGS)
1175
1176 /* Location of register sets within the whole register file */
1177 #define VP_INPUT_REG_START 0
1178 #define VP_INPUT_REG_END (VP_INPUT_REG_START + VP_NUM_INPUT_REGS - 1)
1179 #define VP_OUTPUT_REG_START (VP_INPUT_REG_END + 1)
1180 #define VP_OUTPUT_REG_END (VP_OUTPUT_REG_START + VP_NUM_OUTPUT_REGS - 1)
1181 #define VP_TEMP_REG_START (VP_OUTPUT_REG_END + 1)
1182 #define VP_TEMP_REG_END (VP_TEMP_REG_START + VP_NUM_TEMP_REGS - 1)
1183 #define VP_PROG_REG_START (VP_TEMP_REG_END + 1)
1184 #define VP_PROG_REG_END (VP_PROG_REG_START + VP_NUM_PROG_REGS - 1)
1185
1186
1187 /* Machine state (i.e. the register file) */
1188 struct vp_machine
1189 {
1190 GLfloat Registers[VP_NUM_TOTAL_REGISTERS][4];
1191 GLint AddressReg; /* might someday be a 4-vector */
1192 };
1193
1194
1195 /* Vertex program opcodes */
1196 enum vp_opcode
1197 {
1198 MOV,
1199 LIT,
1200 RCP,
1201 RSQ,
1202 EXP,
1203 LOG,
1204 MUL,
1205 ADD,
1206 DP3,
1207 DP4,
1208 DST,
1209 MIN,
1210 MAX,
1211 SLT,
1212 SGE,
1213 MAD,
1214 ARL,
1215 DPH,
1216 RCC,
1217 SUB,
1218 ABS,
1219 END
1220 };
1221
1222
1223 /* Instruction source register */
1224 struct vp_src_register
1225 {
1226 GLint Register; /* or the offset from the address register */
1227 GLuint Swizzle[4];
1228 GLboolean Negate;
1229 GLboolean RelAddr;
1230 };
1231
1232
1233 /* Instruction destination register */
1234 struct vp_dst_register
1235 {
1236 GLint Register;
1237 GLboolean WriteMask[4];
1238 };
1239
1240
1241 /* Vertex program instruction */
1242 struct vp_instruction
1243 {
1244 enum vp_opcode Opcode;
1245 struct vp_src_register SrcReg[3];
1246 struct vp_dst_register DstReg;
1247 };
1248
1249
1250 /* The actual vertex program, stored in the hash table */
1251 struct vp_program
1252 {
1253 GLubyte *String; /* Original user code */
1254 struct vp_instruction *Instructions; /* Compiled instructions */
1255 GLenum Target; /* GL_VERTEX_PROGRAM_NV or GL_VERTEX_STATE_PROGRAM_NV */
1256 GLint ErrorPos; /* Position in string where error was detected */
1257 GLint RefCount; /* Since programs can be shared among contexts */
1258 GLboolean IsPositionInvariant; /* GL_NV_vertex_program1_1 */
1259 GLboolean Resident;
1260 GLuint InputsRead; /* Bitmask of which input regs are read */
1261 GLuint OutputsWritten; /* Bitmask of which output regs are written to */
1262 };
1263
1264
1265 /*
1266 * State vars for GL_NV_vertex_program
1267 */
1268 struct vertex_program_state
1269 {
1270 GLboolean Enabled; /* GL_VERTEX_PROGRAM_NV */
1271 GLboolean PointSizeEnabled; /* GL_VERTEX_PROGRAM_POINT_SIZE_NV */
1272 GLboolean TwoSideEnabled; /* GL_VERTEX_PROGRAM_TWO_SIDE_NV */
1273 GLuint CurrentID; /* currently bound program's ID */
1274 struct vp_program *Current; /* ptr to currently bound program */
1275 struct vp_machine Machine; /* machine state */
1276
1277 GLenum TrackMatrix[VP_NUM_PROG_REGS / 4];
1278 GLenum TrackMatrixTransform[VP_NUM_PROG_REGS / 4];
1279 };
1280
1281
1282
1283 /*
1284 * State which can be shared by multiple contexts:
1285 */
1286 struct gl_shared_state {
1287 _glthread_Mutex Mutex; /* for thread safety */
1288 GLint RefCount; /* Reference count */
1289 struct _mesa_HashTable *DisplayList; /* Display lists hash table */
1290 struct _mesa_HashTable *TexObjects; /* Texture objects hash table */
1291 struct gl_texture_object *TexObjectList;/* Linked list of texture objects */
1292
1293 /* Default texture objects (shared by all multi-texture units) */
1294 struct gl_texture_object *Default1D;
1295 struct gl_texture_object *Default2D;
1296 struct gl_texture_object *Default3D;
1297 struct gl_texture_object *DefaultCubeMap;
1298
1299 /* GL_NV_vertex_program */
1300 struct _mesa_HashTable *VertexPrograms;
1301
1302 void *DriverData; /* Device driver shared state */
1303 };
1304
1305
1306 /*
1307 * A "frame buffer" is a color buffer and its optional ancillary buffers:
1308 * depth, accum, stencil, and software-simulated alpha buffers.
1309 * In C++ terms, think of this as a base class from which device drivers
1310 * will make derived classes.
1311 */
1312 struct gl_frame_buffer {
1313 GLvisual Visual; /* The corresponding visual */
1314
1315 GLuint Width, Height; /* size of frame buffer in pixels */
1316
1317 GLboolean UseSoftwareDepthBuffer;
1318 GLboolean UseSoftwareAccumBuffer;
1319 GLboolean UseSoftwareStencilBuffer;
1320 GLboolean UseSoftwareAlphaBuffers;
1321
1322 /* Software depth (aka Z) buffer */
1323 GLvoid *DepthBuffer; /* array [Width*Height] of GLushort or GLuint*/
1324
1325 /* Software stencil buffer */
1326 GLstencil *Stencil; /* array [Width*Height] of GLstencil values */
1327
1328 /* Software accumulation buffer */
1329 GLaccum *Accum; /* array [4*Width*Height] of GLaccum values */
1330
1331 /* Software alpha planes */
1332 GLchan *FrontLeftAlpha; /* array [Width*Height] of GLubyte */
1333 GLchan *BackLeftAlpha; /* array [Width*Height] of GLubyte */
1334 GLchan *FrontRightAlpha; /* array [Width*Height] of GLubyte */
1335 GLchan *BackRightAlpha; /* array [Width*Height] of GLubyte */
1336 GLchan *Alpha; /* Points to current alpha buffer */
1337
1338 /* Drawing bounds: intersection of window size and scissor box */
1339 GLint _Xmin, _Ymin; /* inclusive */
1340 GLint _Xmax, _Ymax; /* exclusive */
1341 };
1342
1343
1344 /*
1345 * Constants which may be overriden by device driver during context creation
1346 * but are never changed after that.
1347 */
1348 struct gl_constants {
1349 GLint MaxTextureLevels;
1350 GLint Max3DTextureLevels;
1351 GLint MaxCubeTextureLevels;
1352 GLuint MaxTextureUnits;
1353 GLfloat MaxTextureMaxAnisotropy; /* GL_EXT_texture_filter_anisotropic */
1354 GLfloat MaxTextureLodBias; /* GL_EXT_texture_lod_bias */
1355 GLuint MaxArrayLockSize;
1356 GLint SubPixelBits;
1357 GLfloat MinPointSize, MaxPointSize; /* aliased */
1358 GLfloat MinPointSizeAA, MaxPointSizeAA; /* antialiased */
1359 GLfloat PointSizeGranularity;
1360 GLfloat MinLineWidth, MaxLineWidth; /* aliased */
1361 GLfloat MinLineWidthAA, MaxLineWidthAA; /* antialiased */
1362 GLfloat LineWidthGranularity;
1363 GLuint NumAuxBuffers;
1364 GLuint MaxColorTableSize;
1365 GLuint MaxConvolutionWidth;
1366 GLuint MaxConvolutionHeight;
1367 GLuint NumCompressedTextureFormats; /* GL_ARB_texture_compression */
1368 GLenum CompressedTextureFormats[MAX_COMPRESSED_TEXTURE_FORMATS];
1369 GLuint MaxClipPlanes;
1370 GLuint MaxLights;
1371 };
1372
1373
1374 /*
1375 * List of extensions.
1376 */
1377 struct extension;
1378 struct gl_extensions {
1379 char *ext_string;
1380 struct extension *ext_list;
1381 /* Flags to quickly test if certain extensions are available.
1382 * Not every extension needs to have such a flag, but it's encouraged.
1383 */
1384 GLboolean ARB_depth_texture;
1385 GLboolean ARB_imaging;
1386 GLboolean ARB_multisample;
1387 GLboolean ARB_multitexture;
1388 GLboolean ARB_shadow;
1389 GLboolean ARB_texture_border_clamp;
1390 GLboolean ARB_texture_compression;
1391 GLboolean ARB_texture_cube_map;
1392 GLboolean ARB_texture_env_combine;
1393 GLboolean ARB_texture_env_crossbar;
1394 GLboolean ARB_texture_env_dot3;
1395 GLboolean ARB_texture_mirrored_repeat;
1396 GLboolean ARB_window_pos;
1397 GLboolean EXT_blend_color;
1398 GLboolean EXT_blend_func_separate;
1399 GLboolean EXT_blend_logic_op;
1400 GLboolean EXT_blend_minmax;
1401 GLboolean EXT_blend_subtract;
1402 GLboolean EXT_clip_volume_hint;
1403 GLboolean EXT_convolution;
1404 GLboolean EXT_compiled_vertex_array;
1405 GLboolean EXT_fog_coord;
1406 GLboolean EXT_histogram;
1407 GLboolean EXT_packed_pixels;
1408 GLboolean EXT_paletted_texture;
1409 GLboolean EXT_point_parameters;
1410 GLboolean EXT_polygon_offset;
1411 GLboolean EXT_rescale_normal;
1412 GLboolean EXT_shadow_funcs;
1413 GLboolean EXT_secondary_color;
1414 GLboolean EXT_shared_texture_palette;
1415 GLboolean EXT_stencil_wrap;
1416 GLboolean EXT_texture3D;
1417 GLboolean EXT_texture_compression_s3tc;
1418 GLboolean EXT_texture_env_add;
1419 GLboolean EXT_texture_env_combine;
1420 GLboolean EXT_texture_env_dot3;
1421 GLboolean EXT_texture_filter_anisotropic;
1422 GLboolean EXT_texture_object;
1423 GLboolean EXT_texture_lod_bias;
1424 GLboolean EXT_vertex_array_set;
1425 GLboolean HP_occlusion_test;
1426 GLboolean IBM_rasterpos_clip;
1427 GLboolean INGR_blend_func_separate;
1428 GLboolean MESA_window_pos;
1429 GLboolean MESA_resize_buffers;
1430 GLboolean MESA_sprite_point;
1431 GLboolean NV_blend_square;
1432 GLboolean NV_point_sprite;
1433 GLboolean NV_texgen_reflection;
1434 GLboolean NV_vertex_program;
1435 GLboolean NV_vertex_program1_1;
1436 GLboolean SGI_color_matrix;
1437 GLboolean SGI_color_table;
1438 GLboolean SGIS_generate_mipmap;
1439 GLboolean SGIS_pixel_texture;
1440 GLboolean SGIS_texture_edge_clamp;
1441 GLboolean SGIX_depth_texture;
1442 GLboolean SGIX_pixel_texture;
1443 GLboolean SGIX_shadow;
1444 GLboolean SGIX_shadow_ambient; /* or GL_ARB_shadow_ambient */
1445 GLboolean _3DFX_texture_compression_FXT1;
1446 };
1447
1448
1449 /* XXX just an idea */
1450 struct matrix_stack
1451 {
1452 GLmatrix *Top; /* points into Stack */
1453 GLmatrix *Stack; /* array [MaxDepth] of GLmatrix */
1454 GLuint Depth; /* 0 <= Depth < MaxDepth */
1455 GLuint MaxDepth; /* size of Stack[] array */
1456 GLuint DirtyFlag; /* _NEW_MODELVIEW or _NEW_PROJECTION, for example */
1457 };
1458
1459
1460 /*
1461 * Bits for image transfer operations (ctx->ImageTransferState).
1462 */
1463 #define IMAGE_SCALE_BIAS_BIT 0x1
1464 #define IMAGE_SHIFT_OFFSET_BIT 0x2
1465 #define IMAGE_MAP_COLOR_BIT 0x4
1466 #define IMAGE_COLOR_TABLE_BIT 0x8
1467 #define IMAGE_CONVOLUTION_BIT 0x10
1468 #define IMAGE_POST_CONVOLUTION_SCALE_BIAS 0x20
1469 #define IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT 0x40
1470 #define IMAGE_COLOR_MATRIX_BIT 0x80
1471 #define IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT 0x100
1472 #define IMAGE_HISTOGRAM_BIT 0x200
1473 #define IMAGE_MIN_MAX_BIT 0x400
1474
1475 /* transfer ops up to convolution: */
1476 #define IMAGE_PRE_CONVOLUTION_BITS (IMAGE_SCALE_BIAS_BIT | \
1477 IMAGE_SHIFT_OFFSET_BIT | \
1478 IMAGE_MAP_COLOR_BIT | \
1479 IMAGE_COLOR_TABLE_BIT)
1480
1481 /* transfer ops after convolution: */
1482 #define IMAGE_POST_CONVOLUTION_BITS (IMAGE_POST_CONVOLUTION_SCALE_BIAS | \
1483 IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT | \
1484 IMAGE_COLOR_MATRIX_BIT | \
1485 IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT |\
1486 IMAGE_HISTOGRAM_BIT | \
1487 IMAGE_MIN_MAX_BIT)
1488
1489
1490 /*
1491 * Bits to indicate what state has changed. 6 unused flags.
1492 */
1493 #define _NEW_MODELVIEW 0x1 /* ctx->ModelView */
1494 #define _NEW_PROJECTION 0x2 /* ctx->Projection */
1495 #define _NEW_TEXTURE_MATRIX 0x4 /* ctx->TextureMatrix */
1496 #define _NEW_COLOR_MATRIX 0x8 /* ctx->ColorMatrix */
1497 #define _NEW_ACCUM 0x10 /* ctx->Accum */
1498 #define _NEW_COLOR 0x20 /* ctx->Color */
1499 #define _NEW_DEPTH 0x40 /* ctx->Depth */
1500 #define _NEW_EVAL 0x80 /* ctx->Eval, ctx->EvalMap */
1501 #define _NEW_FOG 0x100 /* ctx->Fog */
1502 #define _NEW_HINT 0x200 /* ctx->Hint */
1503 #define _NEW_LIGHT 0x400 /* ctx->Light */
1504 #define _NEW_LINE 0x800 /* ctx->Line */
1505 #define _NEW_PIXEL 0x1000 /* ctx->Pixel */
1506 #define _NEW_POINT 0x2000 /* ctx->Point */
1507 #define _NEW_POLYGON 0x4000 /* ctx->Polygon */
1508 #define _NEW_POLYGONSTIPPLE 0x8000 /* ctx->PolygonStipple */
1509 #define _NEW_SCISSOR 0x10000 /* ctx->Scissor */
1510 #define _NEW_STENCIL 0x20000 /* ctx->Stencil */
1511 #define _NEW_TEXTURE 0x40000 /* ctx->Texture */
1512 #define _NEW_TRANSFORM 0x80000 /* ctx->Transform */
1513 #define _NEW_VIEWPORT 0x100000 /* ctx->Viewport */
1514 #define _NEW_PACKUNPACK 0x200000 /* ctx->Pack, ctx->Unpack */
1515 #define _NEW_ARRAY 0x400000 /* ctx->Array */
1516 #define _NEW_RENDERMODE 0x800000 /* RenderMode, Feedback, Select */
1517 #define _NEW_BUFFERS 0x1000000 /* ctx->Visual, ctx->DrawBuffer, */
1518 #define _NEW_MULTISAMPLE 0x2000000 /* ctx->Multisample */
1519 #define _NEW_TRACK_MATRIX 0x4000000 /* ctx->VertexProgram */
1520 #define _NEW_PROGRAM 0x8000000 /* ctx->VertexProgram */
1521 #define _NEW_ALL ~0
1522
1523
1524
1525 /* Bits to track array state changes (also used to summarize array enabled)
1526 */
1527 #define _NEW_ARRAY_VERTEX VERT_BIT_POS
1528 #define _NEW_ARRAY_WEIGHT VERT_BIT_WEIGHT
1529 #define _NEW_ARRAY_NORMAL VERT_BIT_NORMAL
1530 #define _NEW_ARRAY_COLOR0 VERT_BIT_COLOR0
1531 #define _NEW_ARRAY_COLOR1 VERT_BIT_COLOR1
1532 #define _NEW_ARRAY_FOGCOORD VERT_BIT_FOG
1533 #define _NEW_ARRAY_INDEX VERT_BIT_SIX
1534 #define _NEW_ARRAY_EDGEFLAG VERT_BIT_SEVEN
1535 #define _NEW_ARRAY_TEXCOORD_0 VERT_BIT_TEX0
1536 #define _NEW_ARRAY_TEXCOORD_1 VERT_BIT_TEX1
1537 #define _NEW_ARRAY_TEXCOORD_2 VERT_BIT_TEX2
1538 #define _NEW_ARRAY_TEXCOORD_3 VERT_BIT_TEX3
1539 #define _NEW_ARRAY_TEXCOORD_4 VERT_BIT_TEX4
1540 #define _NEW_ARRAY_TEXCOORD_5 VERT_BIT_TEX5
1541 #define _NEW_ARRAY_TEXCOORD_6 VERT_BIT_TEX6
1542 #define _NEW_ARRAY_TEXCOORD_7 VERT_BIT_TEX7
1543 #define _NEW_ARRAY_ATTRIB_0 0x10000 /* start at bit 16 */
1544 #define _NEW_ARRAY_ALL 0xffffffff
1545
1546
1547 #define _NEW_ARRAY_TEXCOORD(i) (_NEW_ARRAY_TEXCOORD_0 << (i))
1548 #define _NEW_ARRAY_ATTRIB(i) (_NEW_ARRAY_ATTRIB_0 << (i))
1549
1550 /* A bunch of flags that we think might be useful to drivers.
1551 */
1552 #define DD_FLATSHADE 0x1
1553 #define DD_SEPARATE_SPECULAR 0x2
1554 #define DD_TRI_CULL_FRONT_BACK 0x4 /* special case on some hw */
1555 #define DD_TRI_LIGHT_TWOSIDE 0x8
1556 #define DD_TRI_UNFILLED 0x10
1557 #define DD_TRI_SMOOTH 0x20
1558 #define DD_TRI_STIPPLE 0x40
1559 #define DD_TRI_OFFSET 0x80
1560 #define DD_LINE_SMOOTH 0x100
1561 #define DD_LINE_STIPPLE 0x200
1562 #define DD_LINE_WIDTH 0x400
1563 #define DD_POINT_SMOOTH 0x800
1564 #define DD_POINT_SIZE 0x1000
1565 #define DD_POINT_ATTEN 0x2000
1566
1567 /* Define the state changes under which each of these bits might change
1568 */
1569 #define _DD_NEW_FLATSHADE _NEW_LIGHT
1570 #define _DD_NEW_SEPARATE_SPECULAR (_NEW_LIGHT | _NEW_FOG)
1571 #define _DD_NEW_TRI_CULL_FRONT_BACK _NEW_POLYGON
1572 #define _DD_NEW_TRI_LIGHT_TWOSIDE _NEW_LIGHT
1573 #define _DD_NEW_TRI_UNFILLED _NEW_POLYGON
1574 #define _DD_NEW_TRI_SMOOTH _NEW_POLYGON
1575 #define _DD_NEW_TRI_STIPPLE _NEW_POLYGON
1576 #define _DD_NEW_TRI_OFFSET _NEW_POLYGON
1577 #define _DD_NEW_LINE_SMOOTH _NEW_LINE
1578 #define _DD_NEW_LINE_STIPPLE _NEW_LINE
1579 #define _DD_NEW_LINE_WIDTH _NEW_LINE
1580 #define _DD_NEW_POINT_SMOOTH _NEW_POINT
1581 #define _DD_NEW_POINT_SIZE _NEW_POINT
1582 #define _DD_NEW_POINT_ATTEN _NEW_POINT
1583
1584 #define _MESA_NEW_NEED_EYE_COORDS (_NEW_LIGHT | \
1585 _NEW_TEXTURE | \
1586 _NEW_POINT | \
1587 _NEW_MODELVIEW)
1588
1589 #define _MESA_NEW_NEED_NORMALS (_NEW_LIGHT | \
1590 _NEW_TEXTURE)
1591
1592 #define _IMAGE_NEW_TRANSFER_STATE (_NEW_PIXEL | _NEW_COLOR_MATRIX)
1593
1594
1595 /* Bits for ctx->_NeedNormals */
1596 #define NEED_NORMALS_TEXGEN 0x1
1597 #define NEED_NORMALS_LIGHT 0x2
1598
1599 /* Bits for ctx->_NeedEyeCoords */
1600 #define NEED_EYE_TEXGEN 0x1
1601 #define NEED_EYE_LIGHT 0x2
1602 #define NEED_EYE_LIGHT_MODELVIEW 0x4
1603 #define NEED_EYE_POINT_ATTEN 0x8
1604 #define NEED_EYE_DRIVER 0x10
1605
1606
1607 /*
1608 * Forward declaration of display list datatypes:
1609 */
1610 union node;
1611 typedef union node Node;
1612
1613
1614 /* This has to be included here. */
1615 #include "dd.h"
1616
1617
1618 /*
1619 * Core Mesa's support for tnl modules:
1620 */
1621 #define NUM_VERTEX_FORMAT_ENTRIES (sizeof(GLvertexformat) / sizeof(void *))
1622
1623 struct gl_tnl_module {
1624 /* Vertex format to be lazily swapped into current dispatch.
1625 */
1626 GLvertexformat *Current;
1627
1628 /* Record of functions swapped out. On restore, only need to swap
1629 * these functions back in.
1630 */
1631 void *Swapped[NUM_VERTEX_FORMAT_ENTRIES][2];
1632 GLuint SwapCount;
1633 };
1634
1635
1636 /**
1637 * This is the central context data structure for Mesa. Almost all
1638 * OpenGL state is contained in this structure.
1639 */
1640 struct __GLcontextRec {
1641 /**
1642 * OS related interfaces; these *must* be the first members of this
1643 * structure, because they are exposed to the outside world (i.e. GLX
1644 * extension).
1645 */
1646 __GLimports imports;
1647 __GLexports exports;
1648
1649 /* State possibly shared with other contexts in the address space */
1650 struct gl_shared_state *Shared;
1651
1652 /* API function pointer tables */
1653 struct _glapi_table *Save; /**< Display list save funcs */
1654 struct _glapi_table *Exec; /**< Execute funcs */
1655 struct _glapi_table *CurrentDispatch; /**< == Save or Exec !! */
1656
1657 GLboolean ExecPrefersFloat; /**< What preference for color conversion? */
1658 GLboolean SavePrefersFloat;
1659
1660 GLvisual Visual;
1661 GLframebuffer *DrawBuffer; /**< buffer for writing */
1662 GLframebuffer *ReadBuffer; /**< buffer for reading */
1663
1664 /**
1665 * Device driver function pointer table
1666 */
1667 struct dd_function_table Driver;
1668
1669 void *DriverCtx; /**< Points to device driver context/state */
1670 void *DriverMgrCtx; /**< Points to device driver manager (optional)*/
1671
1672 /* Core/Driver constants */
1673 struct gl_constants Const;
1674
1675 /* The various 4x4 matrix stacks */
1676 struct matrix_stack ModelviewMatrixStack;
1677 struct matrix_stack ProjectionMatrixStack;
1678 struct matrix_stack ColorMatrixStack;
1679 struct matrix_stack TextureMatrixStack[MAX_TEXTURE_UNITS];
1680 struct matrix_stack ProgramMatrixStack[MAX_PROGRAM_MATRICES];
1681 struct matrix_stack *CurrentStack; /* Points to one of the above stacks */
1682
1683 /* Combined modelview and projection matrix */
1684 GLmatrix _ModelProjectMatrix;
1685
1686 /* Display lists */
1687 GLuint CallDepth; /* Current recursion calling depth */
1688 GLboolean ExecuteFlag; /* Execute GL commands? */
1689 GLboolean CompileFlag; /* Compile GL commands into display list? */
1690 Node *CurrentListPtr; /* Head of list being compiled */
1691 GLuint CurrentListNum; /* Number of the list being compiled */
1692 Node *CurrentBlock; /* Pointer to current block of nodes */
1693 GLuint CurrentPos; /* Index into current block of nodes */
1694
1695 /* Extensions */
1696 struct gl_extensions Extensions;
1697
1698 /* Renderer attribute stack */
1699 GLuint AttribStackDepth;
1700 struct gl_attrib_node *AttribStack[MAX_ATTRIB_STACK_DEPTH];
1701
1702 /* Renderer attribute groups */
1703 struct gl_accum_attrib Accum;
1704 struct gl_colorbuffer_attrib Color;
1705 struct gl_current_attrib Current;
1706 struct gl_depthbuffer_attrib Depth;
1707 struct gl_eval_attrib Eval;
1708 struct gl_fog_attrib Fog;
1709 struct gl_hint_attrib Hint;
1710 struct gl_light_attrib Light;
1711 struct gl_line_attrib Line;
1712 struct gl_list_attrib List;
1713 struct gl_multisample_attrib Multisample;
1714 struct gl_pixel_attrib Pixel;
1715 struct gl_point_attrib Point;
1716 struct gl_polygon_attrib Polygon;
1717 GLuint PolygonStipple[32];
1718 struct gl_scissor_attrib Scissor;
1719 struct gl_stencil_attrib Stencil;
1720 struct gl_texture_attrib Texture;
1721 struct gl_transform_attrib Transform;
1722 struct gl_viewport_attrib Viewport;
1723
1724 /* Other attribute groups */
1725 struct gl_histogram_attrib Histogram;
1726 struct gl_minmax_attrib MinMax;
1727 struct gl_convolution_attrib Convolution1D;
1728 struct gl_convolution_attrib Convolution2D;
1729 struct gl_convolution_attrib Separable2D;
1730
1731 /* Client attribute stack */
1732 GLuint ClientAttribStackDepth;
1733 struct gl_attrib_node *ClientAttribStack[MAX_CLIENT_ATTRIB_STACK_DEPTH];
1734
1735 /* Client attribute groups */
1736 struct gl_array_attrib Array; /* Vertex arrays */
1737 struct gl_pixelstore_attrib Pack; /* Pixel packing */
1738 struct gl_pixelstore_attrib Unpack; /* Pixel unpacking */
1739
1740 struct gl_evaluators EvalMap; /* All evaluators */
1741 struct gl_feedback Feedback; /* Feedback */
1742 struct gl_selection Select; /* Selection */
1743
1744 struct gl_color_table ColorTable; /* Pre-convolution */
1745 struct gl_color_table ProxyColorTable; /* Pre-convolution */
1746 struct gl_color_table PostConvolutionColorTable;
1747 struct gl_color_table ProxyPostConvolutionColorTable;
1748 struct gl_color_table PostColorMatrixColorTable;
1749 struct gl_color_table ProxyPostColorMatrixColorTable;
1750
1751 struct vertex_program_state VertexProgram; /* GL_NV_vertex_program */
1752
1753 GLenum ErrorValue; /* Last error code */
1754 GLenum RenderMode; /* either GL_RENDER, GL_SELECT, GL_FEEDBACK */
1755 GLuint NewState; /* bitwise-or of _NEW_* flags */
1756
1757 /* Derived */
1758 GLuint _TriangleCaps; /* bitwise-or of DD_* flags */
1759 GLuint _ImageTransferState;/* bitwise-or of IMAGE_*_BIT flags */
1760 GLfloat _EyeZDir[3];
1761 GLfloat _ModelViewInvScale;
1762 GLuint _NeedEyeCoords;
1763 GLuint _NeedNormals; /* Are vertex normal vectors needed? */
1764
1765 struct gl_shine_tab *_ShineTable[2]; /* Active shine tables */
1766 struct gl_shine_tab *_ShineTabList; /* Mru list of inactive shine tables */
1767
1768 struct gl_list_extensions listext; /* driver dlist extensions */
1769
1770
1771 GLboolean OcclusionResult; /**< for GL_HP_occlusion_test */
1772 GLboolean OcclusionResultSaved; /**< for GL_HP_occlusion_test */
1773
1774 /* Z buffer stuff */
1775 GLuint DepthMax; /**< Max depth buffer value */
1776 GLfloat DepthMaxF; /**< Float max depth buffer value */
1777 GLfloat MRD; /**< minimum resolvable difference in Z values */
1778
1779 /** Should 3Dfx Glide driver catch signals? */
1780 GLboolean CatchSignals;
1781
1782 /** For debugging/development only */
1783 GLboolean NoRaster;
1784 GLboolean FirstTimeCurrent;
1785
1786 /** Dither disable via MESA_NO_DITHER env var */
1787 GLboolean NoDither;
1788
1789 GLboolean Rendering;
1790
1791 #if defined(MESA_TRACE)
1792 struct _glapi_table *TraceDispatch;
1793 trace_context_t *TraceCtx;
1794 #else
1795 void *TraceDispatch;
1796 void *TraceCtx;
1797 #endif
1798
1799 /* Core tnl module support */
1800 struct gl_tnl_module TnlModule;
1801
1802 /* Hooks for module contexts. These will eventually live
1803 * in the driver or elsewhere.
1804 */
1805 void *swrast_context;
1806 void *swsetup_context;
1807 void *swtnl_context;
1808 void *swtnl_im;
1809 void *acache_context;
1810 void *aelt_context;
1811 };
1812
1813
1814 /* The string names for GL_POINT, GL_LINE_LOOP, etc */
1815 extern const char *_mesa_prim_name[GL_POLYGON+4];
1816
1817 #ifndef MESA_DEBUG
1818 #define MESA_DEBUG
1819 #endif
1820
1821 #ifdef MESA_DEBUG
1822 extern int MESA_VERBOSE;
1823 extern int MESA_DEBUG_FLAGS;
1824 #else
1825 # define MESA_VERBOSE 0
1826 # define MESA_DEBUG_FLAGS 0
1827 # ifndef NDEBUG
1828 # define NDEBUG
1829 # endif
1830 #endif
1831
1832
1833 enum _verbose {
1834 VERBOSE_VARRAY = 0x0001,
1835 VERBOSE_TEXTURE = 0x0002,
1836 VERBOSE_IMMEDIATE = 0x0004,
1837 VERBOSE_PIPELINE = 0x0008,
1838 VERBOSE_DRIVER = 0x0010,
1839 VERBOSE_STATE = 0x0020,
1840 VERBOSE_API = 0x0040,
1841 VERBOSE_DISPLAY_LIST = 0x0100,
1842 VERBOSE_LIGHTING = 0x0200,
1843 VERBOSE_PRIMS = 0x0400,
1844 VERBOSE_VERTS = 0x0800
1845 };
1846
1847
1848 enum _debug {
1849 DEBUG_ALWAYS_FLUSH = 0x1
1850 };
1851
1852
1853
1854 #define Elements(x) sizeof(x)/sizeof(*(x))
1855
1856 /*
1857 * Provide a reasonable replacement for __FUNCTION__ when using
1858 * non-GNU C compilers.
1859 */
1860 #if !defined(__GNUC__)
1861 #define STRINGIZE(x) #x
1862 #define STRINGIZE_EVAL(x) STRINGIZE(x)
1863 #define __FUNCTION__ STRINGIZE_EVAL(__FILE__) ", line " STRINGIZE_EVAL(__LINE__)
1864 #endif
1865
1866 /* Eventually let the driver specify what statechanges require a flush:
1867 */
1868 #define FLUSH_VERTICES(ctx, newstate) \
1869 do { \
1870 if (MESA_VERBOSE & VERBOSE_STATE) \
1871 fprintf(stderr, "FLUSH_VERTICES in %s\n", __FUNCTION__); \
1872 if (ctx->Driver.NeedFlush & FLUSH_STORED_VERTICES) \
1873 ctx->Driver.FlushVertices(ctx, FLUSH_STORED_VERTICES); \
1874 ctx->NewState |= newstate; \
1875 } while (0)
1876
1877 #define FLUSH_CURRENT(ctx, newstate) \
1878 do { \
1879 if (MESA_VERBOSE & VERBOSE_STATE) \
1880 fprintf(stderr, "FLUSH_CURRENT in %s\n", __FUNCTION__); \
1881 if (ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT) \
1882 ctx->Driver.FlushVertices(ctx, FLUSH_UPDATE_CURRENT); \
1883 ctx->NewState |= newstate; \
1884 } while (0)
1885
1886 #define ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval) \
1887 do { \
1888 if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) { \
1889 _mesa_error( ctx, GL_INVALID_OPERATION, "begin/end" ); \
1890 return retval; \
1891 } \
1892 } while (0)
1893
1894 #define ASSERT_OUTSIDE_BEGIN_END(ctx) \
1895 do { \
1896 if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) { \
1897 _mesa_error( ctx, GL_INVALID_OPERATION, "begin/end" ); \
1898 return; \
1899 } \
1900 } while (0)
1901
1902 #define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx) \
1903 do { \
1904 ASSERT_OUTSIDE_BEGIN_END(ctx); \
1905 FLUSH_VERTICES(ctx, 0); \
1906 } while (0)
1907
1908 #define ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, retval) \
1909 do { \
1910 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, retval); \
1911 FLUSH_VERTICES(ctx, 0); \
1912 } while (0)
1913
1914
1915
1916
1917 #endif /* TYPES_H */