fixed bad clear value
[mesa.git] / src / mesa / tnl / t_context.h
1 /* $Id: t_context.h,v 1.43 2002/10/09 19:45: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 t_context.h
29 * \brief TnL module datatypes and definitions.
30 * \author Keith Whitwell
31 */
32
33 #ifndef _T_CONTEXT_H
34 #define _T_CONTEXT_H
35
36 #include "glheader.h"
37 #include "mtypes.h"
38
39 #include "math/m_matrix.h"
40 #include "math/m_vector.h"
41 #include "math/m_xform.h"
42
43
44 #define MAX_PIPELINE_STAGES 30
45
46
47 /* Numbers for sizing immediate structs.
48 */
49 #define IMM_MAX_COPIED_VERTS 3
50 #define IMM_MAXDATA (216 + IMM_MAX_COPIED_VERTS)
51 #define IMM_SIZE (IMM_MAXDATA + MAX_CLIPPED_VERTICES)
52
53
54 /* Values for IM->BeginState
55 */
56 #define VERT_BEGIN_0 0x1 /* glBegin (if initially inside beg/end) */
57 #define VERT_BEGIN_1 0x2 /* glBegin (if initially outside beg/end) */
58 #define VERT_ERROR_0 0x4 /* invalid_operation in initial state 0 */
59 #define VERT_ERROR_1 0x8 /* invalid_operation in initial state 1 */
60
61
62 /* Flags to be added to the primitive enum in VB->Primitive.
63 */
64 #define PRIM_MODE_MASK 0xff /* Extract the actual primitive */
65 #define PRIM_BEGIN 0x100 /* The prim starts here (not wrapped) */
66 #define PRIM_END 0x200 /* The prim ends in this VB (does not wrap) */
67 #define PRIM_PARITY 0x400 /* The prim wrapped on an odd number of verts */
68 #define PRIM_LAST 0x800 /* No more prims in the VB */
69
70
71 /**
72 * Flags that describe the inputs and outputs of pipeline stages, and
73 * the contents of a vertex-cassette. We reuse the VERT_BIT_* flags
74 * defined in mtypes.h and add a bunch of new ones.
75 */
76 /* bits 0..5 defined in mtypes.h */
77 #define VERT_BIT_INDEX VERT_BIT_SIX /* a free vertex attrib bit */
78 #define VERT_BIT_EDGEFLAG VERT_BIT_SEVEN /* a free vertex attrib bit */
79 /* bits 8..15 defined in mtypes.h */
80 #define VERT_BIT_EVAL_C1 (1 << 16) /* imm only */
81 #define VERT_BIT_EVAL_C2 (1 << 17) /* imm only */
82 #define VERT_BIT_EVAL_P1 (1 << 18) /* imm only */
83 #define VERT_BIT_EVAL_P2 (1 << 19) /* imm only */
84 #define VERT_BIT_OBJ_3 (1 << 20) /* imm only */
85 #define VERT_BIT_OBJ_4 (1 << 21) /* imm only */
86 #define VERT_BIT_MATERIAL (1 << 22) /* imm only, but tested in vb code */
87 #define VERT_BIT_ELT (1 << 23) /* imm only */
88 #define VERT_BIT_BEGIN (1 << 24) /* imm only, but tested in vb code */
89 #define VERT_BIT_END (1 << 25) /* imm only, but tested in vb code */
90 #define VERT_BIT_END_VB (1 << 26) /* imm only, but tested in vb code */
91 #define VERT_BIT_POINT_SIZE (1 << 27) /* vb only, could reuse a bit */
92 #define VERT_BIT_EYE VERT_BIT_BEGIN /* vb only, reuse imm bit */
93 #define VERT_BIT_CLIP VERT_BIT_END /* vb only, reuse imm bit*/
94
95
96 /* Flags for IM->TexCoordSize. Enough flags for 16 units.
97 */
98 #define TEX_0_SIZE_3 (unsigned)0x1
99 #define TEX_0_SIZE_4 (unsigned)0x10001
100 #define TEX_SIZE_3(unit) (TEX_0_SIZE_3 << (unit))
101 #define TEX_SIZE_4(unit) (TEX_0_SIZE_4 << (unit))
102
103
104 /* Shorthands.
105 */
106 #define VERT_BITS_OBJ_23 (VERT_BIT_POS | VERT_BIT_OBJ_3)
107 #define VERT_BITS_OBJ_234 (VERT_BIT_POS | VERT_BIT_OBJ_3 | VERT_BIT_OBJ_4)
108
109 #define VERT_BITS_TEX_ANY (VERT_BIT_TEX0 | \
110 VERT_BIT_TEX1 | \
111 VERT_BIT_TEX2 | \
112 VERT_BIT_TEX3 | \
113 VERT_BIT_TEX4 | \
114 VERT_BIT_TEX5 | \
115 VERT_BIT_TEX6 | \
116 VERT_BIT_TEX7)
117
118 #define VERT_BITS_EVAL_ANY (VERT_BIT_EVAL_C1 | VERT_BIT_EVAL_P1 | \
119 VERT_BIT_EVAL_C2 | VERT_BIT_EVAL_P2)
120
121 #define VERT_BITS_FIXUP (VERT_BITS_TEX_ANY | \
122 VERT_BIT_COLOR0 | \
123 VERT_BIT_COLOR1 | \
124 VERT_BIT_FOG | \
125 VERT_BIT_INDEX | \
126 VERT_BIT_EDGEFLAG | \
127 VERT_BIT_NORMAL)
128
129 #define VERT_BITS_CURRENT_DATA (VERT_BITS_FIXUP | \
130 VERT_BIT_MATERIAL)
131
132 #define VERT_BITS_DATA (VERT_BITS_TEX_ANY | \
133 VERT_BIT_COLOR0 | \
134 VERT_BIT_COLOR1 | \
135 VERT_BIT_FOG | \
136 VERT_BIT_INDEX | \
137 VERT_BIT_EDGEFLAG | \
138 VERT_BIT_NORMAL | \
139 VERT_BIT_POS | \
140 VERT_BIT_MATERIAL | \
141 VERT_BIT_ELT | \
142 VERT_BITS_EVAL_ANY)
143
144
145 /**
146 * KW: Represents everything that can take place between a begin and
147 * end, and can represent multiple begin/end pairs. Can be used to
148 * losslessly encode this information in display lists.
149 */
150 struct immediate
151 {
152 GLuint id, ref_count;
153
154 /* This must be saved when immediates are shared in display lists.
155 */
156 GLuint CopyStart, Start, Count;
157 GLuint LastData; /* count or count+1 */
158 GLuint AndFlag, OrFlag;
159 GLuint TexSize; /* keep track of texcoord sizes */
160 GLuint BeginState, SavedBeginState;
161 GLuint LastPrimitive;
162
163 GLuint ArrayEltFlags; /* precalc'ed for glArrayElt */
164 GLuint ArrayEltIncr;
165 GLuint ArrayEltFlush;
166
167 #define FLUSH_ELT_EAGER 0x1
168 #define FLUSH_ELT_LAZY 0x2
169 GLuint FlushElt;
170
171 GLuint MaxTextureUnits; /* precalc'ed for glMultiTexCoordARB */
172
173 /* Temporary values created when vertices are copied into the
174 * first 3 slots of the struct:
175 */
176 GLuint CopyOrFlag;
177 GLuint CopyAndFlag;
178 GLuint CopyTexSize;
179 GLuint Evaluated;
180
181
182 /* allocate storage for these on demand:
183 */
184 struct gl_material (*Material)[2];
185 GLuint *MaterialMask;
186 GLuint LastMaterial;
187 GLuint MaterialOrMask;
188 GLuint MaterialAndMask;
189
190 GLuint Primitive[IMM_SIZE]; /* BEGIN/END */
191 GLuint PrimitiveLength[IMM_SIZE]; /* BEGIN/END */
192 GLuint Flag[IMM_SIZE]; /* VERT_BIT_* flags */
193
194 /* All vertex attributes (position, normal, color, secondary color,
195 * texcoords, fog coord) are stored in the Attrib[] arrays instead
196 * of individual arrays as we did prior to Mesa 4.1.
197 *
198 * XXX may need to use 32-byte aligned allocation for this!!!
199 */
200 GLfloat Attrib[VERT_ATTRIB_MAX][IMM_SIZE][4]; /* GL_NV_vertex_program */
201
202 GLfloat *NormalLengthPtr; /* length of normal vectors (display list only) */
203
204 GLuint Elt[IMM_SIZE];
205 GLubyte EdgeFlag[IMM_SIZE];
206 GLuint Index[IMM_SIZE];
207 };
208
209
210 struct vertex_arrays
211 {
212 /* XXX move a bunch of these fields into the Attribs[] array??? */
213 GLvector4f Obj;
214 GLvector4f Normal;
215 struct gl_client_array Color;
216 struct gl_client_array SecondaryColor;
217 GLvector1ui Index;
218 GLvector1ub EdgeFlag;
219 GLvector4f TexCoord[MAX_TEXTURE_UNITS];
220 GLvector1ui Elt;
221 GLvector4f FogCoord;
222 GLvector4f Attribs[VERT_ATTRIB_MAX];
223 };
224
225
226 /**
227 * Contains the current state of a running pipeline.
228 */
229 typedef struct vertex_buffer
230 {
231 /* Constant over life of the vertex_buffer.
232 */
233 GLuint Size;
234
235 /* Constant over the pipeline.
236 */
237 GLuint Count; /* for everything except Elts */
238 GLuint FirstClipped; /* temp verts for clipping */
239 GLuint FirstPrimitive; /* usually zero */
240
241 /* Pointers to current data.
242 */
243 GLuint *Elts; /* VERT_BIT_ELT */
244 GLvector4f *ObjPtr; /* VERT_BIT_POS */
245 GLvector4f *EyePtr; /* VERT_BIT_EYE */
246 GLvector4f *ClipPtr; /* VERT_BIT_CLIP */
247 GLvector4f *NdcPtr; /* VERT_BIT_CLIP (2) */
248 GLubyte ClipOrMask; /* VERT_BIT_CLIP (3) */
249 GLubyte *ClipMask; /* VERT_BIT_CLIP (4) */
250 GLvector4f *NormalPtr; /* VERT_BIT_NORMAL */
251 GLfloat *NormalLengthPtr; /* VERT_BIT_NORMAL */
252 GLboolean *EdgeFlag; /* VERT_BIT_EDGEFLAG */
253 GLvector4f *TexCoordPtr[MAX_TEXTURE_UNITS]; /* VERT_TEX_0..n */
254 GLvector1ui *IndexPtr[2]; /* VERT_BIT_INDEX */
255 struct gl_client_array *ColorPtr[2]; /* VERT_BIT_COLOR0 */
256 struct gl_client_array *SecondaryColorPtr[2];/* VERT_BIT_COLOR1 */
257 GLvector4f *PointSizePtr; /* VERT_BIT_POINT_SIZE */
258 GLvector4f *FogCoordPtr; /* VERT_BIT_FOG */
259 struct gl_material (*Material)[2]; /* VERT_BIT_MATERIAL, optional */
260 GLuint *MaterialMask; /* VERT_BIT_MATERIAL, optional */
261 GLuint *Flag; /* VERT_BIT_* flags, optional */
262 GLuint *Primitive; /* GL_(mode)|PRIM_* flags */
263 GLuint *PrimitiveLength; /* integers */
264
265 /* Inputs to the vertex program stage */
266 GLvector4f *AttribPtr[VERT_ATTRIB_MAX]; /* GL_NV_vertex_program */
267
268 GLuint importable_data;
269 void *import_source;
270 void (*import_data)( GLcontext *ctx, GLuint flags, GLuint vecflags );
271 /* Callback to the provider of the untransformed input for the
272 * render stage (or other stages) to call if they need to write into
273 * write-protected arrays, or fixup the stride on input arrays.
274 *
275 * This is currently only necessary for client arrays that make it
276 * as far down the pipeline as the render stage.
277 */
278
279 GLuint LastClipped;
280 /* Private data from _tnl_render_stage that has no business being
281 * in this struct.
282 */
283
284 } TNLvertexbuffer;
285
286
287
288 /* Describes an individual operation on the pipeline.
289 */
290 struct gl_pipeline_stage {
291 const char *name;
292 GLuint check_state; /* All state referenced in check() --
293 * When is the pipeline_stage struct
294 * itself invalidated? Must be
295 * constant.
296 */
297
298 /* Usually constant or set by the 'check' callback:
299 */
300 GLuint run_state; /* All state referenced in run() --
301 * When is the cached output of the
302 * stage invalidated?
303 */
304
305 GLboolean active; /* True if runnable in current state */
306 GLuint inputs; /* VERT_* inputs to the stage */
307 GLuint outputs; /* VERT_* outputs of the stage */
308
309 /* Set in _tnl_run_pipeline():
310 */
311 GLuint changed_inputs; /* Generated value -- inputs to the
312 * stage that have changed since last
313 * call to 'run'.
314 */
315
316 /* Private data for the pipeline stage:
317 */
318 void *privatePtr;
319
320 /* Free private data. May not be null.
321 */
322 void (*destroy)( struct gl_pipeline_stage * );
323
324 /* Called from _tnl_validate_pipeline(). Must update all fields in
325 * the pipeline_stage struct for the current state.
326 */
327 void (*check)( GLcontext *ctx, struct gl_pipeline_stage * );
328
329 /* Called from _tnl_run_pipeline(). The stage.changed_inputs value
330 * encodes all inputs to thee struct which have changed. If
331 * non-zero, recompute all affected outputs of the stage, otherwise
332 * execute any 'sideeffects' of the stage.
333 *
334 * Return value: GL_TRUE - keep going
335 * GL_FALSE - finished pipeline
336 */
337 GLboolean (*run)( GLcontext *ctx, struct gl_pipeline_stage * );
338 };
339
340
341 struct gl_pipeline {
342 GLuint build_state_trigger; /* state changes which require build */
343 GLuint build_state_changes; /* state changes since last build */
344 GLuint run_state_changes; /* state changes since last run */
345 GLuint run_input_changes; /* VERT_* changes since last run */
346 GLuint inputs; /* VERT_* inputs to pipeline */
347 struct gl_pipeline_stage stages[MAX_PIPELINE_STAGES+1];
348 GLuint nr_stages;
349 };
350
351
352 struct tnl_eval_store {
353 GLuint EvalMap1Flags;
354 GLuint EvalMap2Flags;
355 GLuint EvalMap1AttribFlags; /* GL_NV_vertex_program */
356 GLuint EvalMap2AttribFlags; /* GL_NV_vertex_program */
357 GLuint EvalNewState;
358 struct immediate *im; /* used for temporary data */
359 };
360
361
362 typedef void (*points_func)( GLcontext *ctx, GLuint first, GLuint last );
363 typedef void (*line_func)( GLcontext *ctx, GLuint v1, GLuint v2 );
364 typedef void (*triangle_func)( GLcontext *ctx,
365 GLuint v1, GLuint v2, GLuint v3 );
366 typedef void (*quad_func)( GLcontext *ctx, GLuint v1, GLuint v2,
367 GLuint v3, GLuint v4 );
368 typedef void (*render_func)( GLcontext *ctx, GLuint start, GLuint count,
369 GLuint flags );
370 typedef void (*interp_func)( GLcontext *ctx,
371 GLfloat t, GLuint dst, GLuint out, GLuint in,
372 GLboolean force_boundary );
373 typedef void (*copy_pv_func)( GLcontext *ctx, GLuint dst, GLuint src );
374 typedef void (*setup_func)( GLcontext *ctx,
375 GLuint start, GLuint end,
376 GLuint new_inputs);
377
378
379 struct tnl_device_driver {
380 /***
381 *** TNL Pipeline
382 ***/
383
384 void (*RunPipeline)(GLcontext *ctx);
385 /* Replaces PipelineStart/PipelineFinish -- intended to allow
386 * drivers to wrap _tnl_run_pipeline() with code to validate state
387 * and grab/release hardware locks.
388 */
389
390 void (*NotifyMaterialChange)(GLcontext *ctx);
391 /* Alert tnl-aware drivers of changes to material.
392 */
393
394 GLboolean (*NotifyBegin)(GLcontext *ctx, GLenum p);
395 /* Allow drivers to hook in optimized begin/end engines.
396 * Return value: GL_TRUE - driver handled the begin
397 * GL_FALSE - driver didn't handle the begin
398 */
399
400 /***
401 *** Rendering -- These functions called only from t_vb_render.c
402 ***/
403 struct {
404 void (*Start)(GLcontext *ctx);
405 void (*Finish)(GLcontext *ctx);
406 /* Called before and after all rendering operations, including DrawPixels,
407 * ReadPixels, Bitmap, span functions, and CopyTexImage, etc commands.
408 * These are a suitable place for grabbing/releasing hardware locks.
409 */
410
411 void (*PrimitiveNotify)(GLcontext *ctx, GLenum mode);
412 /* Called between RenderStart() and RenderFinish() to indicate the
413 * type of primitive we're about to draw. Mode will be one of the
414 * modes accepted by glBegin().
415 */
416
417 interp_func Interp;
418 /* The interp function is called by the clipping routines when we need
419 * to generate an interpolated vertex. All pertinant vertex ancilliary
420 * data should be computed by interpolating between the 'in' and 'out'
421 * vertices.
422 */
423
424 copy_pv_func CopyPV;
425 /* The copy function is used to make a copy of a vertex. All pertinant
426 * vertex attributes should be copied.
427 */
428
429 void (*ClippedPolygon)( GLcontext *ctx, const GLuint *elts, GLuint n );
430 /* Render a polygon with <n> vertices whose indexes are in the <elts>
431 * array.
432 */
433
434 void (*ClippedLine)( GLcontext *ctx, GLuint v0, GLuint v1 );
435 /* Render a line between the two vertices given by indexes v0 and v1. */
436
437 points_func Points; /* must now respect vb->elts */
438 line_func Line;
439 triangle_func Triangle;
440 quad_func Quad;
441 /* These functions are called in order to render points, lines,
442 * triangles and quads. These are only called via the T&L module.
443 */
444
445 render_func *PrimTabVerts;
446 render_func *PrimTabElts;
447 /* Render whole unclipped primitives (points, lines, linestrips,
448 * lineloops, etc). The tables are indexed by the GL enum of the
449 * primitive to be rendered. RenderTabVerts is used for non-indexed
450 * arrays of vertices. RenderTabElts is used for indexed arrays of
451 * vertices.
452 */
453
454 void (*ResetLineStipple)( GLcontext *ctx );
455 /* Reset the hardware's line stipple counter.
456 */
457
458 setup_func BuildVertices;
459 /* This function is called whenever new vertices are required for
460 * rendering. The vertices in question are those n such that start
461 * <= n < end. The new_inputs parameter indicates those fields of
462 * the vertex which need to be updated, if only a partial repair of
463 * the vertex is required.
464 *
465 * This function is called only from _tnl_render_stage in tnl/t_render.c.
466 */
467
468
469 GLboolean (*Multipass)( GLcontext *ctx, GLuint passno );
470 /* Driver may request additional render passes by returning GL_TRUE
471 * when this function is called. This function will be called
472 * after the first pass, and passes will be made until the function
473 * returns GL_FALSE. If no function is registered, only one pass
474 * is made.
475 *
476 * This function will be first invoked with passno == 1.
477 */
478 } Render;
479 };
480
481
482 typedef struct {
483
484 /* Driver interface.
485 */
486 struct tnl_device_driver Driver;
487
488 /* Track whether the module is active.
489 */
490 GLboolean bound_exec;
491
492 /* Display list extensions
493 */
494 GLuint opcode_vertex_cassette;
495
496 /* Pipeline
497 */
498 struct gl_pipeline pipeline;
499 struct vertex_buffer vb;
500
501 /* GLvectors for binding to vb:
502 */
503 struct vertex_arrays imm_inputs;
504 struct vertex_arrays array_inputs;
505 GLuint *tmp_primitive;
506 GLuint *tmp_primitive_length;
507
508 /* Set when executing an internally generated begin/end object. If
509 * such an object is encountered in a display list, it will be
510 * replayed only if the list is outside any existing begin/end
511 * objects.
512 */
513 GLboolean ReplayHardBeginEnd;
514
515 /* Note which vertices need copying over succesive immediates.
516 * Will add save versions to precompute vertex copying where
517 * possible.
518 */
519 struct immediate *ExecCopySource;
520 GLuint ExecCopyCount;
521 GLuint ExecCopyElts[IMM_MAX_COPIED_VERTS];
522 GLuint ExecCopyTexSize;
523 GLuint ExecParity;
524
525 GLuint DlistPrimitive;
526 GLuint DlistPrimitiveLength;
527 GLuint DlistLastPrimitive;
528
529 /* Cache a single free immediate (refcount == 0)
530 */
531 struct immediate *freed_immediate;
532
533 /* Probably need a better configuration mechanism:
534 */
535 GLboolean NeedNdcCoords;
536 GLboolean LoopbackDListCassettes;
537 GLboolean CalcDListNormalLengths;
538 GLboolean IsolateMaterials;
539
540 /* Derived state and storage for _tnl_eval_vb:
541 */
542 struct tnl_eval_store eval;
543
544 /* Functions to be plugged into dispatch when tnl is active.
545 */
546 GLvertexformat vtxfmt;
547 GLvertexformat save_vtxfmt;
548
549 } TNLcontext;
550
551
552
553 #define TNL_CONTEXT(ctx) ((TNLcontext *)(ctx->swtnl_context))
554 #define TNL_CURRENT_IM(ctx) ((struct immediate *)(ctx->swtnl_im))
555
556
557 #define TYPE_IDX(t) ((t) & 0xf)
558 #define MAX_TYPES TYPE_IDX(GL_DOUBLE)+1 /* 0xa + 1 */
559
560 extern void _tnl_MakeCurrent( GLcontext *ctx,
561 GLframebuffer *drawBuffer,
562 GLframebuffer *readBuffer );
563
564
565 /*
566 * Macros for fetching current input buffer.
567 */
568 #ifdef THREADS
569 #define GET_IMMEDIATE struct immediate *IM = TNL_CURRENT_IM(((GLcontext *) (_glapi_Context ? _glapi_Context : _glapi_get_context())))
570 #define SET_IMMEDIATE(ctx, im) ctx->swtnl_im = (void *)im
571 #else
572 extern struct immediate *_tnl_CurrentInput;
573 #define GET_IMMEDIATE struct immediate *IM = _tnl_CurrentInput
574 #define SET_IMMEDIATE(ctx, im) \
575 do { \
576 ctx->swtnl_im = (void *)im; \
577 _tnl_CurrentInput = im; \
578 } while (0)
579 #endif
580
581
582 #endif