home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mesa5.zip / mesa5src.zip / tnl / t_context.h < prev    next >
C/C++ Source or Header  |  2002-12-08  |  21KB  |  588 lines

  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.  
  369. typedef void (_Optlink Fquad_func)( GLcontext *ctx, GLuint v1, GLuint v2,
  370.                            GLuint v3, GLuint v4 );
  371. typedef Fquad_func *quad_func;
  372.  
  373. typedef void (*render_func)( GLcontext *ctx, GLuint start, GLuint count,
  374.                  GLuint flags );
  375. typedef void (*interp_func)( GLcontext *ctx,
  376.                  GLfloat t, GLuint dst, GLuint out, GLuint in,
  377.                  GLboolean force_boundary );
  378. typedef void (*copy_pv_func)( GLcontext *ctx, GLuint dst, GLuint src );
  379. typedef void (*setup_func)( GLcontext *ctx,
  380.                 GLuint start, GLuint end,
  381.                 GLuint new_inputs);
  382.  
  383.  
  384. struct tnl_device_driver {
  385.    /***
  386.     *** TNL Pipeline
  387.     ***/
  388.  
  389.    void (*RunPipeline)(GLcontext *ctx);
  390.    /* Replaces PipelineStart/PipelineFinish -- intended to allow
  391.     * drivers to wrap _tnl_run_pipeline() with code to validate state
  392.     * and grab/release hardware locks.  
  393.     */
  394.  
  395.    void (*NotifyMaterialChange)(GLcontext *ctx);
  396.    /* Alert tnl-aware drivers of changes to material.
  397.     */
  398.  
  399.    GLboolean (*NotifyBegin)(GLcontext *ctx, GLenum p);
  400.    /* Allow drivers to hook in optimized begin/end engines.
  401.     * Return value:  GL_TRUE - driver handled the begin
  402.     *                GL_FALSE - driver didn't handle the begin
  403.     */
  404.  
  405.    /***
  406.     *** Rendering -- These functions called only from t_vb_render.c
  407.     ***/
  408.    struct {
  409.       void (*Start)(GLcontext *ctx);
  410.       void (*Finish)(GLcontext *ctx);
  411.       /* Called before and after all rendering operations, including DrawPixels,
  412.        * ReadPixels, Bitmap, span functions, and CopyTexImage, etc commands.
  413.        * These are a suitable place for grabbing/releasing hardware locks.
  414.        */
  415.  
  416.       void (*PrimitiveNotify)(GLcontext *ctx, GLenum mode);
  417.       /* Called between RenderStart() and RenderFinish() to indicate the
  418.        * type of primitive we're about to draw.  Mode will be one of the
  419.        * modes accepted by glBegin().
  420.        */
  421.  
  422.       interp_func Interp;
  423.       /* The interp function is called by the clipping routines when we need
  424.        * to generate an interpolated vertex.  All pertinant vertex ancilliary
  425.        * data should be computed by interpolating between the 'in' and 'out'
  426.        * vertices.
  427.        */
  428.  
  429.       copy_pv_func CopyPV;
  430.       /* The copy function is used to make a copy of a vertex.  All pertinant
  431.        * vertex attributes should be copied.
  432.        */
  433.  
  434.       void (*ClippedPolygon)( GLcontext *ctx, const GLuint *elts, GLuint n );
  435.       /* Render a polygon with <n> vertices whose indexes are in the <elts>
  436.        * array.
  437.        */
  438.  
  439.       void (*ClippedLine)( GLcontext *ctx, GLuint v0, GLuint v1 );
  440.       /* Render a line between the two vertices given by indexes v0 and v1. */
  441.  
  442.       points_func           Points; /* must now respect vb->elts */
  443.       line_func             Line;
  444.       triangle_func         Triangle;
  445.       quad_func             Quad;
  446.       /* These functions are called in order to render points, lines,
  447.        * triangles and quads.  These are only called via the T&L module.
  448.        */
  449.  
  450.       render_func          *PrimTabVerts;
  451.       render_func          *PrimTabElts;
  452.       /* Render whole unclipped primitives (points, lines, linestrips,
  453.        * lineloops, etc).  The tables are indexed by the GL enum of the
  454.        * primitive to be rendered.  RenderTabVerts is used for non-indexed
  455.        * arrays of vertices.  RenderTabElts is used for indexed arrays of
  456.        * vertices.
  457.        */
  458.  
  459.       void (*ResetLineStipple)( GLcontext *ctx );
  460.       /* Reset the hardware's line stipple counter.
  461.        */
  462.  
  463.       setup_func BuildVertices;
  464.       /* This function is called whenever new vertices are required for
  465.        * rendering.  The vertices in question are those n such that start
  466.        * <= n < end.  The new_inputs parameter indicates those fields of
  467.        * the vertex which need to be updated, if only a partial repair of
  468.        * the vertex is required.
  469.        *
  470.        * This function is called only from _tnl_render_stage in tnl/t_render.c.
  471.        */
  472.       
  473.  
  474.       GLboolean (*Multipass)( GLcontext *ctx, GLuint passno );
  475.       /* Driver may request additional render passes by returning GL_TRUE
  476.        * when this function is called.  This function will be called
  477.        * after the first pass, and passes will be made until the function
  478.        * returns GL_FALSE.  If no function is registered, only one pass
  479.        * is made.
  480.        *
  481.        * This function will be first invoked with passno == 1.
  482.        */
  483.    } Render;
  484. };
  485.    
  486.  
  487. typedef struct {
  488.  
  489.    /* Driver interface.
  490.     */
  491.    struct tnl_device_driver Driver;
  492.  
  493.    /* Track whether the module is active.
  494.     */
  495.    GLboolean bound_exec;
  496.  
  497.    /* Display list extensions
  498.     */
  499.    GLuint opcode_vertex_cassette;
  500.  
  501.    /* Pipeline
  502.     */
  503.    struct gl_pipeline pipeline;
  504.    struct vertex_buffer vb;
  505.  
  506.    /* GLvectors for binding to vb:
  507.     */
  508.    struct vertex_arrays imm_inputs;
  509.    struct vertex_arrays array_inputs;
  510.    GLuint *tmp_primitive;
  511.    GLuint *tmp_primitive_length;
  512.  
  513.    /* Set when executing an internally generated begin/end object.  If
  514.     * such an object is encountered in a display list, it will be
  515.     * replayed only if the list is outside any existing begin/end
  516.     * objects.  
  517.     */
  518.    GLboolean ReplayHardBeginEnd;
  519.  
  520.    /* Note which vertices need copying over succesive immediates.
  521.     * Will add save versions to precompute vertex copying where
  522.     * possible.
  523.     */
  524.    struct immediate *ExecCopySource;
  525.    GLuint ExecCopyCount;
  526.    GLuint ExecCopyElts[IMM_MAX_COPIED_VERTS];
  527.    GLuint ExecCopyTexSize;
  528.    GLuint ExecParity;
  529.  
  530.    GLuint DlistPrimitive;
  531.    GLuint DlistPrimitiveLength;
  532.    GLuint DlistLastPrimitive;
  533.  
  534.    /* Cache a single free immediate (refcount == 0)
  535.     */
  536.    struct immediate *freed_immediate;   
  537.  
  538.    /* Probably need a better configuration mechanism:
  539.     */
  540.    GLboolean NeedNdcCoords;
  541.    GLboolean LoopbackDListCassettes;
  542.    GLboolean CalcDListNormalLengths;
  543.    GLboolean IsolateMaterials;
  544.  
  545.    /* Derived state and storage for _tnl_eval_vb:
  546.     */
  547.    struct tnl_eval_store eval;
  548.  
  549.    /* Functions to be plugged into dispatch when tnl is active.
  550.     */
  551.    GLvertexformat vtxfmt;
  552.    GLvertexformat save_vtxfmt;
  553.  
  554. } TNLcontext;
  555.  
  556.  
  557.  
  558. #define TNL_CONTEXT(ctx) ((TNLcontext *)(ctx->swtnl_context))
  559. #define TNL_CURRENT_IM(ctx) ((struct immediate *)(ctx->swtnl_im))
  560.  
  561.  
  562. #define TYPE_IDX(t) ((t) & 0xf)
  563. #define MAX_TYPES TYPE_IDX(GL_DOUBLE)+1      /* 0xa + 1 */
  564.  
  565. extern void _tnl_MakeCurrent( GLcontext *ctx,
  566.                   GLframebuffer *drawBuffer,
  567.                   GLframebuffer *readBuffer );
  568.  
  569.  
  570. /*
  571.  * Macros for fetching current input buffer.
  572.  */
  573. #ifdef THREADS
  574. #define GET_IMMEDIATE  struct immediate *IM = TNL_CURRENT_IM(((GLcontext *) (_glapi_Context ? _glapi_Context : _glapi_get_context())))
  575. #define SET_IMMEDIATE(ctx, im)  ctx->swtnl_im = (void *)im
  576. #else
  577. extern struct immediate *_tnl_CurrentInput;
  578. #define GET_IMMEDIATE struct immediate *IM = _tnl_CurrentInput
  579. #define SET_IMMEDIATE(ctx, im)            \
  580. do {                        \
  581.    ctx->swtnl_im = (void *)im;            \
  582.    _tnl_CurrentInput = im;            \
  583. } while (0)
  584. #endif
  585.  
  586.  
  587. #endif
  588.