Subversion Repositories shark

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
56 pj 1
/* $Id: t_context.h,v 1.1 2003-02-28 11:48:06 pj 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