Home | History | Annotate | Download | only in main
      1 /*
      2  * Mesa 3-D graphics library
      3  *
      4  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
      5  * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  * and/or sell copies of the Software, and to permit persons to whom the
     12  * Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included
     15  * in all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
     21  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     22  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     23  * OTHER DEALINGS IN THE SOFTWARE.
     24  */
     25 
     26 
     27 /**
     28  * \file dlist.c
     29  * Display lists management functions.
     30  */
     31 
     32 #include "c99_math.h"
     33 #include "glheader.h"
     34 #include "imports.h"
     35 #include "api_arrayelt.h"
     36 #include "api_exec.h"
     37 #include "api_loopback.h"
     38 #include "api_validate.h"
     39 #include "atifragshader.h"
     40 #include "config.h"
     41 #include "bufferobj.h"
     42 #include "arrayobj.h"
     43 #include "context.h"
     44 #include "dlist.h"
     45 #include "enums.h"
     46 #include "eval.h"
     47 #include "fbobject.h"
     48 #include "framebuffer.h"
     49 #include "glapi/glapi.h"
     50 #include "glformats.h"
     51 #include "hash.h"
     52 #include "image.h"
     53 #include "light.h"
     54 #include "macros.h"
     55 #include "pack.h"
     56 #include "pbo.h"
     57 #include "queryobj.h"
     58 #include "samplerobj.h"
     59 #include "shaderapi.h"
     60 #include "syncobj.h"
     61 #include "teximage.h"
     62 #include "texstorage.h"
     63 #include "mtypes.h"
     64 #include "varray.h"
     65 #include "arbprogram.h"
     66 #include "transformfeedback.h"
     67 
     68 #include "math/m_matrix.h"
     69 
     70 #include "main/dispatch.h"
     71 
     72 #include "vbo/vbo.h"
     73 
     74 
     75 #define USE_BITMAP_ATLAS 1
     76 
     77 
     78 
     79 /**
     80  * Other parts of Mesa (such as the VBO module) can plug into the display
     81  * list system.  This structure describes new display list instructions.
     82  */
     83 struct gl_list_instruction
     84 {
     85    GLuint Size;
     86    void (*Execute)( struct gl_context *ctx, void *data );
     87    void (*Destroy)( struct gl_context *ctx, void *data );
     88    void (*Print)( struct gl_context *ctx, void *data, FILE *f );
     89 };
     90 
     91 
     92 #define MAX_DLIST_EXT_OPCODES 16
     93 
     94 /**
     95  * Used by device drivers to hook new commands into display lists.
     96  */
     97 struct gl_list_extensions
     98 {
     99    struct gl_list_instruction Opcode[MAX_DLIST_EXT_OPCODES];
    100    GLuint NumOpcodes;
    101 };
    102 
    103 
    104 
    105 /**
    106  * Flush vertices.
    107  *
    108  * \param ctx GL context.
    109  *
    110  * Checks if dd_function_table::SaveNeedFlush is marked to flush
    111  * stored (save) vertices, and calls vbo_save_SaveFlushVertices if so.
    112  */
    113 #define SAVE_FLUSH_VERTICES(ctx)                     \
    114    do {                                              \
    115       if (ctx->Driver.SaveNeedFlush)                 \
    116          vbo_save_SaveFlushVertices(ctx);            \
    117    } while (0)
    118 
    119 
    120 /**
    121  * Macro to assert that the API call was made outside the
    122  * glBegin()/glEnd() pair, with return value.
    123  *
    124  * \param ctx GL context.
    125  * \param retval value to return value in case the assertion fails.
    126  */
    127 #define ASSERT_OUTSIDE_SAVE_BEGIN_END_WITH_RETVAL(ctx, retval)          \
    128    do {                                                                 \
    129       if (ctx->Driver.CurrentSavePrimitive <= PRIM_MAX) {               \
    130          _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glBegin/End" ); \
    131          return retval;                                                 \
    132       }                                                                 \
    133    } while (0)
    134 
    135 /**
    136  * Macro to assert that the API call was made outside the
    137  * glBegin()/glEnd() pair.
    138  *
    139  * \param ctx GL context.
    140  */
    141 #define ASSERT_OUTSIDE_SAVE_BEGIN_END(ctx)                              \
    142    do {                                                                 \
    143       if (ctx->Driver.CurrentSavePrimitive <= PRIM_MAX) {               \
    144          _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glBegin/End" ); \
    145          return;                                                        \
    146       }                                                                 \
    147    } while (0)
    148 
    149 /**
    150  * Macro to assert that the API call was made outside the
    151  * glBegin()/glEnd() pair and flush the vertices.
    152  *
    153  * \param ctx GL context.
    154  */
    155 #define ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx)                    \
    156    do {                                                                 \
    157       ASSERT_OUTSIDE_SAVE_BEGIN_END(ctx);                               \
    158       SAVE_FLUSH_VERTICES(ctx);                                         \
    159    } while (0)
    160 
    161 /**
    162  * Macro to assert that the API call was made outside the
    163  * glBegin()/glEnd() pair and flush the vertices, with return value.
    164  *
    165  * \param ctx GL context.
    166  * \param retval value to return value in case the assertion fails.
    167  */
    168 #define ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, retval) \
    169    do {                                                                 \
    170       ASSERT_OUTSIDE_SAVE_BEGIN_END_WITH_RETVAL(ctx, retval);           \
    171       SAVE_FLUSH_VERTICES(ctx);                                         \
    172    } while (0)
    173 
    174 
    175 /**
    176  * Display list opcodes.
    177  *
    178  * The fact that these identifiers are assigned consecutive
    179  * integer values starting at 0 is very important, see InstSize array usage)
    180  */
    181 typedef enum
    182 {
    183    OPCODE_INVALID = -1,         /* Force signed enum */
    184    OPCODE_ACCUM,
    185    OPCODE_ALPHA_FUNC,
    186    OPCODE_BIND_TEXTURE,
    187    OPCODE_BITMAP,
    188    OPCODE_BLEND_COLOR,
    189    OPCODE_BLEND_EQUATION,
    190    OPCODE_BLEND_EQUATION_SEPARATE,
    191    OPCODE_BLEND_FUNC_SEPARATE,
    192 
    193    OPCODE_BLEND_EQUATION_I,
    194    OPCODE_BLEND_EQUATION_SEPARATE_I,
    195    OPCODE_BLEND_FUNC_I,
    196    OPCODE_BLEND_FUNC_SEPARATE_I,
    197 
    198    OPCODE_CALL_LIST,
    199    OPCODE_CALL_LISTS,
    200    OPCODE_CLEAR,
    201    OPCODE_CLEAR_ACCUM,
    202    OPCODE_CLEAR_COLOR,
    203    OPCODE_CLEAR_DEPTH,
    204    OPCODE_CLEAR_INDEX,
    205    OPCODE_CLEAR_STENCIL,
    206    OPCODE_CLEAR_BUFFER_IV,
    207    OPCODE_CLEAR_BUFFER_UIV,
    208    OPCODE_CLEAR_BUFFER_FV,
    209    OPCODE_CLEAR_BUFFER_FI,
    210    OPCODE_CLIP_PLANE,
    211    OPCODE_COLOR_MASK,
    212    OPCODE_COLOR_MASK_INDEXED,
    213    OPCODE_COLOR_MATERIAL,
    214    OPCODE_COPY_PIXELS,
    215    OPCODE_COPY_TEX_IMAGE1D,
    216    OPCODE_COPY_TEX_IMAGE2D,
    217    OPCODE_COPY_TEX_SUB_IMAGE1D,
    218    OPCODE_COPY_TEX_SUB_IMAGE2D,
    219    OPCODE_COPY_TEX_SUB_IMAGE3D,
    220    OPCODE_CULL_FACE,
    221    OPCODE_DEPTH_FUNC,
    222    OPCODE_DEPTH_MASK,
    223    OPCODE_DEPTH_RANGE,
    224    OPCODE_DISABLE,
    225    OPCODE_DISABLE_INDEXED,
    226    OPCODE_DRAW_BUFFER,
    227    OPCODE_DRAW_PIXELS,
    228    OPCODE_ENABLE,
    229    OPCODE_ENABLE_INDEXED,
    230    OPCODE_EVALMESH1,
    231    OPCODE_EVALMESH2,
    232    OPCODE_FOG,
    233    OPCODE_FRONT_FACE,
    234    OPCODE_FRUSTUM,
    235    OPCODE_HINT,
    236    OPCODE_INDEX_MASK,
    237    OPCODE_INIT_NAMES,
    238    OPCODE_LIGHT,
    239    OPCODE_LIGHT_MODEL,
    240    OPCODE_LINE_STIPPLE,
    241    OPCODE_LINE_WIDTH,
    242    OPCODE_LIST_BASE,
    243    OPCODE_LOAD_IDENTITY,
    244    OPCODE_LOAD_MATRIX,
    245    OPCODE_LOAD_NAME,
    246    OPCODE_LOGIC_OP,
    247    OPCODE_MAP1,
    248    OPCODE_MAP2,
    249    OPCODE_MAPGRID1,
    250    OPCODE_MAPGRID2,
    251    OPCODE_MATRIX_MODE,
    252    OPCODE_MULT_MATRIX,
    253    OPCODE_ORTHO,
    254    OPCODE_PASSTHROUGH,
    255    OPCODE_PIXEL_MAP,
    256    OPCODE_PIXEL_TRANSFER,
    257    OPCODE_PIXEL_ZOOM,
    258    OPCODE_POINT_SIZE,
    259    OPCODE_POINT_PARAMETERS,
    260    OPCODE_POLYGON_MODE,
    261    OPCODE_POLYGON_STIPPLE,
    262    OPCODE_POLYGON_OFFSET,
    263    OPCODE_POP_ATTRIB,
    264    OPCODE_POP_MATRIX,
    265    OPCODE_POP_NAME,
    266    OPCODE_PRIORITIZE_TEXTURE,
    267    OPCODE_PUSH_ATTRIB,
    268    OPCODE_PUSH_MATRIX,
    269    OPCODE_PUSH_NAME,
    270    OPCODE_RASTER_POS,
    271    OPCODE_READ_BUFFER,
    272    OPCODE_ROTATE,
    273    OPCODE_SCALE,
    274    OPCODE_SCISSOR,
    275    OPCODE_SELECT_TEXTURE_SGIS,
    276    OPCODE_SELECT_TEXTURE_COORD_SET,
    277    OPCODE_SHADE_MODEL,
    278    OPCODE_STENCIL_FUNC,
    279    OPCODE_STENCIL_MASK,
    280    OPCODE_STENCIL_OP,
    281    OPCODE_TEXENV,
    282    OPCODE_TEXGEN,
    283    OPCODE_TEXPARAMETER,
    284    OPCODE_TEX_IMAGE1D,
    285    OPCODE_TEX_IMAGE2D,
    286    OPCODE_TEX_IMAGE3D,
    287    OPCODE_TEX_SUB_IMAGE1D,
    288    OPCODE_TEX_SUB_IMAGE2D,
    289    OPCODE_TEX_SUB_IMAGE3D,
    290    OPCODE_TRANSLATE,
    291    OPCODE_VIEWPORT,
    292    OPCODE_WINDOW_POS,
    293    /* GL_ARB_multitexture */
    294    OPCODE_ACTIVE_TEXTURE,
    295    /* GL_ARB_texture_compression */
    296    OPCODE_COMPRESSED_TEX_IMAGE_1D,
    297    OPCODE_COMPRESSED_TEX_IMAGE_2D,
    298    OPCODE_COMPRESSED_TEX_IMAGE_3D,
    299    OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D,
    300    OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D,
    301    OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D,
    302    /* GL_ARB_multisample */
    303    OPCODE_SAMPLE_COVERAGE,
    304    /* GL_ARB_window_pos */
    305    OPCODE_WINDOW_POS_ARB,
    306    /* GL_ARB_vertex_program */
    307    OPCODE_BIND_PROGRAM_ARB,
    308    OPCODE_PROGRAM_LOCAL_PARAMETER_ARB,
    309    /* GL_EXT_stencil_two_side */
    310    OPCODE_ACTIVE_STENCIL_FACE_EXT,
    311    /* GL_EXT_depth_bounds_test */
    312    OPCODE_DEPTH_BOUNDS_EXT,
    313    /* GL_ARB_vertex/fragment_program */
    314    OPCODE_PROGRAM_STRING_ARB,
    315    OPCODE_PROGRAM_ENV_PARAMETER_ARB,
    316    /* GL_ARB_occlusion_query */
    317    OPCODE_BEGIN_QUERY_ARB,
    318    OPCODE_END_QUERY_ARB,
    319    /* GL_ARB_draw_buffers */
    320    OPCODE_DRAW_BUFFERS_ARB,
    321    /* GL_ATI_fragment_shader */
    322    OPCODE_BIND_FRAGMENT_SHADER_ATI,
    323    OPCODE_SET_FRAGMENT_SHADER_CONSTANTS_ATI,
    324    /* OpenGL 2.0 */
    325    OPCODE_STENCIL_FUNC_SEPARATE,
    326    OPCODE_STENCIL_OP_SEPARATE,
    327    OPCODE_STENCIL_MASK_SEPARATE,
    328    /* GL_NV_primitive_restart */
    329    OPCODE_PRIMITIVE_RESTART_NV,
    330    /* GL_ARB_shader_objects */
    331    OPCODE_USE_PROGRAM,
    332    OPCODE_UNIFORM_1F,
    333    OPCODE_UNIFORM_2F,
    334    OPCODE_UNIFORM_3F,
    335    OPCODE_UNIFORM_4F,
    336    OPCODE_UNIFORM_1FV,
    337    OPCODE_UNIFORM_2FV,
    338    OPCODE_UNIFORM_3FV,
    339    OPCODE_UNIFORM_4FV,
    340    OPCODE_UNIFORM_1I,
    341    OPCODE_UNIFORM_2I,
    342    OPCODE_UNIFORM_3I,
    343    OPCODE_UNIFORM_4I,
    344    OPCODE_UNIFORM_1IV,
    345    OPCODE_UNIFORM_2IV,
    346    OPCODE_UNIFORM_3IV,
    347    OPCODE_UNIFORM_4IV,
    348    OPCODE_UNIFORM_MATRIX22,
    349    OPCODE_UNIFORM_MATRIX33,
    350    OPCODE_UNIFORM_MATRIX44,
    351    OPCODE_UNIFORM_MATRIX23,
    352    OPCODE_UNIFORM_MATRIX32,
    353    OPCODE_UNIFORM_MATRIX24,
    354    OPCODE_UNIFORM_MATRIX42,
    355    OPCODE_UNIFORM_MATRIX34,
    356    OPCODE_UNIFORM_MATRIX43,
    357 
    358    /* OpenGL 3.0 */
    359    OPCODE_UNIFORM_1UI,
    360    OPCODE_UNIFORM_2UI,
    361    OPCODE_UNIFORM_3UI,
    362    OPCODE_UNIFORM_4UI,
    363    OPCODE_UNIFORM_1UIV,
    364    OPCODE_UNIFORM_2UIV,
    365    OPCODE_UNIFORM_3UIV,
    366    OPCODE_UNIFORM_4UIV,
    367 
    368    /* OpenGL 4.2 / GL_ARB_separate_shader_objects */
    369    OPCODE_USE_PROGRAM_STAGES,
    370    OPCODE_PROGRAM_UNIFORM_1F,
    371    OPCODE_PROGRAM_UNIFORM_2F,
    372    OPCODE_PROGRAM_UNIFORM_3F,
    373    OPCODE_PROGRAM_UNIFORM_4F,
    374    OPCODE_PROGRAM_UNIFORM_1FV,
    375    OPCODE_PROGRAM_UNIFORM_2FV,
    376    OPCODE_PROGRAM_UNIFORM_3FV,
    377    OPCODE_PROGRAM_UNIFORM_4FV,
    378    OPCODE_PROGRAM_UNIFORM_1I,
    379    OPCODE_PROGRAM_UNIFORM_2I,
    380    OPCODE_PROGRAM_UNIFORM_3I,
    381    OPCODE_PROGRAM_UNIFORM_4I,
    382    OPCODE_PROGRAM_UNIFORM_1IV,
    383    OPCODE_PROGRAM_UNIFORM_2IV,
    384    OPCODE_PROGRAM_UNIFORM_3IV,
    385    OPCODE_PROGRAM_UNIFORM_4IV,
    386    OPCODE_PROGRAM_UNIFORM_1UI,
    387    OPCODE_PROGRAM_UNIFORM_2UI,
    388    OPCODE_PROGRAM_UNIFORM_3UI,
    389    OPCODE_PROGRAM_UNIFORM_4UI,
    390    OPCODE_PROGRAM_UNIFORM_1UIV,
    391    OPCODE_PROGRAM_UNIFORM_2UIV,
    392    OPCODE_PROGRAM_UNIFORM_3UIV,
    393    OPCODE_PROGRAM_UNIFORM_4UIV,
    394    OPCODE_PROGRAM_UNIFORM_MATRIX22F,
    395    OPCODE_PROGRAM_UNIFORM_MATRIX33F,
    396    OPCODE_PROGRAM_UNIFORM_MATRIX44F,
    397    OPCODE_PROGRAM_UNIFORM_MATRIX23F,
    398    OPCODE_PROGRAM_UNIFORM_MATRIX32F,
    399    OPCODE_PROGRAM_UNIFORM_MATRIX24F,
    400    OPCODE_PROGRAM_UNIFORM_MATRIX42F,
    401    OPCODE_PROGRAM_UNIFORM_MATRIX34F,
    402    OPCODE_PROGRAM_UNIFORM_MATRIX43F,
    403 
    404    /* GL_ARB_clip_control */
    405    OPCODE_CLIP_CONTROL,
    406 
    407    /* GL_ARB_color_buffer_float */
    408    OPCODE_CLAMP_COLOR,
    409 
    410    /* GL_EXT_framebuffer_blit */
    411    OPCODE_BLIT_FRAMEBUFFER,
    412 
    413    /* Vertex attributes -- fallback for when optimized display
    414     * list build isn't active.
    415     */
    416    OPCODE_ATTR_1F_NV,
    417    OPCODE_ATTR_2F_NV,
    418    OPCODE_ATTR_3F_NV,
    419    OPCODE_ATTR_4F_NV,
    420    OPCODE_ATTR_1F_ARB,
    421    OPCODE_ATTR_2F_ARB,
    422    OPCODE_ATTR_3F_ARB,
    423    OPCODE_ATTR_4F_ARB,
    424    OPCODE_MATERIAL,
    425    OPCODE_BEGIN,
    426    OPCODE_END,
    427    OPCODE_RECTF,
    428    OPCODE_EVAL_C1,
    429    OPCODE_EVAL_C2,
    430    OPCODE_EVAL_P1,
    431    OPCODE_EVAL_P2,
    432 
    433    /* GL_EXT_provoking_vertex */
    434    OPCODE_PROVOKING_VERTEX,
    435 
    436    /* GL_EXT_transform_feedback */
    437    OPCODE_BEGIN_TRANSFORM_FEEDBACK,
    438    OPCODE_END_TRANSFORM_FEEDBACK,
    439    OPCODE_BIND_TRANSFORM_FEEDBACK,
    440    OPCODE_PAUSE_TRANSFORM_FEEDBACK,
    441    OPCODE_RESUME_TRANSFORM_FEEDBACK,
    442    OPCODE_DRAW_TRANSFORM_FEEDBACK,
    443 
    444    /* GL_EXT_texture_integer */
    445    OPCODE_CLEARCOLOR_I,
    446    OPCODE_CLEARCOLOR_UI,
    447    OPCODE_TEXPARAMETER_I,
    448    OPCODE_TEXPARAMETER_UI,
    449 
    450    /* GL_ARB_instanced_arrays */
    451    OPCODE_VERTEX_ATTRIB_DIVISOR,
    452 
    453    /* GL_NV_texture_barrier */
    454    OPCODE_TEXTURE_BARRIER_NV,
    455 
    456    /* GL_ARB_sampler_object */
    457    OPCODE_BIND_SAMPLER,
    458    OPCODE_SAMPLER_PARAMETERIV,
    459    OPCODE_SAMPLER_PARAMETERFV,
    460    OPCODE_SAMPLER_PARAMETERIIV,
    461    OPCODE_SAMPLER_PARAMETERUIV,
    462 
    463    /* GL_ARB_sync */
    464    OPCODE_WAIT_SYNC,
    465 
    466    /* GL_NV_conditional_render */
    467    OPCODE_BEGIN_CONDITIONAL_RENDER,
    468    OPCODE_END_CONDITIONAL_RENDER,
    469 
    470    /* ARB_timer_query */
    471    OPCODE_QUERY_COUNTER,
    472 
    473    /* ARB_transform_feedback3 */
    474    OPCODE_BEGIN_QUERY_INDEXED,
    475    OPCODE_END_QUERY_INDEXED,
    476    OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM,
    477 
    478    /* ARB_transform_feedback_instanced */
    479    OPCODE_DRAW_TRANSFORM_FEEDBACK_INSTANCED,
    480    OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM_INSTANCED,
    481 
    482    /* ARB_uniform_buffer_object */
    483    OPCODE_UNIFORM_BLOCK_BINDING,
    484 
    485    /* EXT_polygon_offset_clamp */
    486    OPCODE_POLYGON_OFFSET_CLAMP,
    487 
    488    /* EXT_window_rectangles */
    489    OPCODE_WINDOW_RECTANGLES,
    490 
    491    /* The following three are meta instructions */
    492    OPCODE_ERROR,                /* raise compiled-in error */
    493    OPCODE_CONTINUE,
    494    OPCODE_NOP,                  /* No-op (used for 8-byte alignment */
    495    OPCODE_END_OF_LIST,
    496    OPCODE_EXT_0
    497 } OpCode;
    498 
    499 
    500 
    501 /**
    502  * Display list node.
    503  *
    504  * Display list instructions are stored as sequences of "nodes".  Nodes
    505  * are allocated in blocks.  Each block has BLOCK_SIZE nodes.  Blocks
    506  * are linked together with a pointer.
    507  *
    508  * Each instruction in the display list is stored as a sequence of
    509  * contiguous nodes in memory.
    510  * Each node is the union of a variety of data types.
    511  *
    512  * Note, all of these members should be 4 bytes in size or less for the
    513  * sake of compact display lists.  We store 8-byte pointers in a pair of
    514  * these nodes using the save/get_pointer() functions below.
    515  */
    516 union gl_dlist_node
    517 {
    518    OpCode opcode;
    519    GLboolean b;
    520    GLbitfield bf;
    521    GLubyte ub;
    522    GLshort s;
    523    GLushort us;
    524    GLint i;
    525    GLuint ui;
    526    GLenum e;
    527    GLfloat f;
    528    GLsizei si;
    529 };
    530 
    531 
    532 typedef union gl_dlist_node Node;
    533 
    534 
    535 /** How many 4-byte dwords to store a pointer */
    536 #define POINTER_DWORDS (sizeof(void *) / 4)
    537 
    538 /* We want to keep sizeof(union gl_dlist_node) == 4 to minimize
    539  * space for display lists.  The following types and functions are
    540  * used to help store 4- and 8-byte pointers in 1 or 2 dlist_nodes.
    541  */
    542 union pointer
    543 {
    544    void *ptr;
    545    GLuint dwords[POINTER_DWORDS];
    546 };
    547 
    548 
    549 /**
    550  * Save a 4 or 8-byte pointer at dest (and dest+1).
    551  */
    552 static inline void
    553 save_pointer(Node *dest, void *src)
    554 {
    555    union pointer p;
    556    unsigned i;
    557 
    558    STATIC_ASSERT(POINTER_DWORDS == 1 || POINTER_DWORDS == 2);
    559    STATIC_ASSERT(sizeof(Node) == 4);
    560 
    561    p.ptr = src;
    562 
    563    for (i = 0; i < POINTER_DWORDS; i++)
    564       dest[i].ui = p.dwords[i];
    565 }
    566 
    567 
    568 /**
    569  * Retrieve a 4 or 8-byte pointer from node (node+1).
    570  */
    571 static inline void *
    572 get_pointer(const Node *node)
    573 {
    574    union pointer p;
    575    unsigned i;
    576 
    577    for (i = 0; i < POINTER_DWORDS; i++)
    578       p.dwords[i] = node[i].ui;
    579 
    580    return p.ptr;
    581 }
    582 
    583 
    584 /**
    585  * Used to store a 64-bit uint in a pair of "Nodes" for the sake of 32-bit
    586  * environment.
    587  */
    588 union uint64_pair
    589 {
    590    GLuint64 uint64;
    591    GLuint uint32[2];
    592 };
    593 
    594 
    595 /**
    596  * How many nodes to allocate at a time.  Note that bulk vertex data
    597  * from glBegin/glVertex/glEnd primitives will typically wind up in
    598  * a VBO, and not directly in the display list itself.
    599  */
    600 #define BLOCK_SIZE 256
    601 
    602 
    603 
    604 /**
    605  * Number of nodes of storage needed for each instruction.
    606  * Sizes for dynamically allocated opcodes are stored in the context struct.
    607  */
    608 static GLuint InstSize[OPCODE_END_OF_LIST + 1];
    609 
    610 
    611 void mesa_print_display_list(GLuint list);
    612 
    613 
    614 /**
    615  * Does the given display list only contain a single glBitmap call?
    616  */
    617 static bool
    618 is_bitmap_list(const struct gl_display_list *dlist)
    619 {
    620    const Node *n = dlist->Head;
    621    if (n[0].opcode == OPCODE_BITMAP) {
    622       n += InstSize[OPCODE_BITMAP];
    623       if (n[0].opcode == OPCODE_END_OF_LIST)
    624          return true;
    625    }
    626    return false;
    627 }
    628 
    629 
    630 /**
    631  * Is the given display list an empty list?
    632  */
    633 static bool
    634 is_empty_list(const struct gl_display_list *dlist)
    635 {
    636    const Node *n = dlist->Head;
    637    return n[0].opcode == OPCODE_END_OF_LIST;
    638 }
    639 
    640 
    641 /**
    642  * Delete/free a gl_bitmap_atlas.  Called during context tear-down.
    643  */
    644 void
    645 _mesa_delete_bitmap_atlas(struct gl_context *ctx, struct gl_bitmap_atlas *atlas)
    646 {
    647    if (atlas->texObj) {
    648       ctx->Driver.DeleteTexture(ctx, atlas->texObj);
    649    }
    650    free(atlas->glyphs);
    651 }
    652 
    653 
    654 /**
    655  * Lookup a gl_bitmap_atlas by listBase ID.
    656  */
    657 static struct gl_bitmap_atlas *
    658 lookup_bitmap_atlas(struct gl_context *ctx, GLuint listBase)
    659 {
    660    struct gl_bitmap_atlas *atlas;
    661 
    662    assert(listBase > 0);
    663    atlas = _mesa_HashLookup(ctx->Shared->BitmapAtlas, listBase);
    664    return atlas;
    665 }
    666 
    667 
    668 /**
    669  * Create new bitmap atlas and insert into hash table.
    670  */
    671 static struct gl_bitmap_atlas *
    672 alloc_bitmap_atlas(struct gl_context *ctx, GLuint listBase)
    673 {
    674    struct gl_bitmap_atlas *atlas;
    675 
    676    assert(listBase > 0);
    677    assert(_mesa_HashLookup(ctx->Shared->BitmapAtlas, listBase) == NULL);
    678 
    679    atlas = calloc(1, sizeof(*atlas));
    680    if (atlas) {
    681       _mesa_HashInsert(ctx->Shared->BitmapAtlas, listBase, atlas);
    682    }
    683 
    684    return atlas;
    685 }
    686 
    687 
    688 /**
    689  * Try to build a bitmap atlas.  This involves examining a sequence of
    690  * display lists which contain glBitmap commands and putting the bitmap
    691  * images into a texture map (the atlas).
    692  * If we succeed, gl_bitmap_atlas::complete will be set to true.
    693  * If we fail, gl_bitmap_atlas::incomplete will be set to true.
    694  */
    695 static void
    696 build_bitmap_atlas(struct gl_context *ctx, struct gl_bitmap_atlas *atlas,
    697                    GLuint listBase)
    698 {
    699    unsigned i, row_height = 0, xpos = 0, ypos = 0;
    700    GLubyte *map;
    701    GLint map_stride;
    702 
    703    assert(atlas);
    704    assert(!atlas->complete);
    705    assert(atlas->numBitmaps > 0);
    706 
    707    /* We use a rectangle texture (non-normalized coords) for the atlas */
    708    assert(ctx->Extensions.NV_texture_rectangle);
    709    assert(ctx->Const.MaxTextureRectSize >= 1024);
    710 
    711    atlas->texWidth = 1024;
    712    atlas->texHeight = 0;  /* determined below */
    713 
    714    atlas->glyphs = malloc(atlas->numBitmaps * sizeof(atlas->glyphs[0]));
    715    if (!atlas->glyphs) {
    716       /* give up */
    717       atlas->incomplete = true;
    718       return;
    719    }
    720 
    721    /* Loop over the display lists.  They should all contain a single glBitmap
    722     * call.  If not, bail out.  Also, compute the position and sizes of each
    723     * bitmap in the atlas to determine the texture atlas size.
    724     */
    725    for (i = 0; i < atlas->numBitmaps; i++) {
    726       const struct gl_display_list *list = _mesa_lookup_list(ctx, listBase + i);
    727       const Node *n;
    728       struct gl_bitmap_glyph *g = &atlas->glyphs[i];
    729       unsigned bitmap_width, bitmap_height;
    730       float bitmap_xmove, bitmap_ymove, bitmap_xorig, bitmap_yorig;
    731 
    732       if (!list || is_empty_list(list)) {
    733          /* stop here */
    734          atlas->numBitmaps = i;
    735          break;
    736       }
    737 
    738       if (!is_bitmap_list(list)) {
    739          /* This list does not contain exactly one glBitmap command. Give up. */
    740          atlas->incomplete = true;
    741          return;
    742       }
    743 
    744       /* get bitmap info from the display list command */
    745       n = list->Head;
    746       assert(n[0].opcode == OPCODE_BITMAP);
    747       bitmap_width = n[1].i;
    748       bitmap_height = n[2].i;
    749       bitmap_xorig = n[3].f;
    750       bitmap_yorig = n[4].f;
    751       bitmap_xmove = n[5].f;
    752       bitmap_ymove = n[6].f;
    753 
    754       if (xpos + bitmap_width > atlas->texWidth) {
    755          /* advance to the next row of the texture */
    756          xpos = 0;
    757          ypos += row_height;
    758          row_height = 0;
    759       }
    760 
    761       /* save the bitmap's position in the atlas */
    762       g->x = xpos;
    763       g->y = ypos;
    764       g->w = bitmap_width;
    765       g->h = bitmap_height;
    766       g->xorig = bitmap_xorig;
    767       g->yorig = bitmap_yorig;
    768       g->xmove = bitmap_xmove;
    769       g->ymove = bitmap_ymove;
    770 
    771       xpos += bitmap_width;
    772 
    773       /* keep track of tallest bitmap in the row */
    774       row_height = MAX2(row_height, bitmap_height);
    775    }
    776 
    777    /* Now we know the texture height */
    778    atlas->texHeight = ypos + row_height;
    779 
    780    if (atlas->texHeight == 0) {
    781       /* no glyphs found, give up */
    782       goto fail;
    783    }
    784    else if (atlas->texHeight > ctx->Const.MaxTextureRectSize) {
    785       /* too large, give up */
    786       goto fail;
    787    }
    788 
    789    /* Create atlas texture (texture ID is irrelevant) */
    790    atlas->texObj = ctx->Driver.NewTextureObject(ctx, 999, GL_TEXTURE_RECTANGLE);
    791    if (!atlas->texObj) {
    792       goto out_of_memory;
    793    }
    794 
    795    atlas->texObj->Sampler.MinFilter = GL_NEAREST;
    796    atlas->texObj->Sampler.MagFilter = GL_NEAREST;
    797    atlas->texObj->MaxLevel = 0;
    798    atlas->texObj->Immutable = GL_TRUE;
    799 
    800    atlas->texImage = _mesa_get_tex_image(ctx, atlas->texObj,
    801                                          GL_TEXTURE_RECTANGLE, 0);
    802    if (!atlas->texImage) {
    803       goto out_of_memory;
    804    }
    805 
    806    _mesa_init_teximage_fields(ctx, atlas->texImage,
    807                               atlas->texWidth, atlas->texHeight, 1, 0,
    808                               GL_ALPHA, MESA_FORMAT_A_UNORM8);
    809 
    810    /* alloc image storage */
    811    if (!ctx->Driver.AllocTextureImageBuffer(ctx, atlas->texImage)) {
    812       goto out_of_memory;
    813    }
    814 
    815    /* map teximage, load with bitmap glyphs */
    816    ctx->Driver.MapTextureImage(ctx, atlas->texImage, 0,
    817                                0, 0, atlas->texWidth, atlas->texHeight,
    818                                GL_MAP_WRITE_BIT, &map, &map_stride);
    819    if (!map) {
    820       goto out_of_memory;
    821    }
    822 
    823    /* Background/clear pixels are 0xff, foreground/set pixels are 0x0 */
    824    memset(map, 0xff, map_stride * atlas->texHeight);
    825 
    826    for (i = 0; i < atlas->numBitmaps; i++) {
    827       const struct gl_display_list *list = _mesa_lookup_list(ctx, listBase + i);
    828       const Node *n = list->Head;
    829 
    830       assert(n[0].opcode == OPCODE_BITMAP ||
    831              n[0].opcode == OPCODE_END_OF_LIST);
    832 
    833       if (n[0].opcode == OPCODE_BITMAP) {
    834          unsigned bitmap_width = n[1].i;
    835          unsigned bitmap_height = n[2].i;
    836          unsigned xpos = atlas->glyphs[i].x;
    837          unsigned ypos = atlas->glyphs[i].y;
    838          const void *bitmap_image = get_pointer(&n[7]);
    839 
    840          assert(atlas->glyphs[i].w == bitmap_width);
    841          assert(atlas->glyphs[i].h == bitmap_height);
    842 
    843          /* put the bitmap image into the texture image */
    844          _mesa_expand_bitmap(bitmap_width, bitmap_height,
    845                              &ctx->DefaultPacking, bitmap_image,
    846                              map + map_stride * ypos + xpos, /* dest addr */
    847                              map_stride, 0x0);
    848       }
    849    }
    850 
    851    ctx->Driver.UnmapTextureImage(ctx, atlas->texImage, 0);
    852 
    853    atlas->complete = true;
    854 
    855    return;
    856 
    857 out_of_memory:
    858    _mesa_error(ctx, GL_OUT_OF_MEMORY, "Display list bitmap atlas");
    859 fail:
    860    if (atlas->texObj) {
    861       ctx->Driver.DeleteTexture(ctx, atlas->texObj);
    862    }
    863    free(atlas->glyphs);
    864    atlas->glyphs = NULL;
    865    atlas->incomplete = true;
    866 }
    867 
    868 
    869 /**
    870  * Allocate a gl_display_list object with an initial block of storage.
    871  * \param count  how many display list nodes/tokens to allocate
    872  */
    873 static struct gl_display_list *
    874 make_list(GLuint name, GLuint count)
    875 {
    876    struct gl_display_list *dlist = CALLOC_STRUCT(gl_display_list);
    877    dlist->Name = name;
    878    dlist->Head = malloc(sizeof(Node) * count);
    879    dlist->Head[0].opcode = OPCODE_END_OF_LIST;
    880    return dlist;
    881 }
    882 
    883 
    884 /**
    885  * Lookup function to just encapsulate casting.
    886  */
    887 struct gl_display_list *
    888 _mesa_lookup_list(struct gl_context *ctx, GLuint list)
    889 {
    890    return (struct gl_display_list *)
    891       _mesa_HashLookup(ctx->Shared->DisplayList, list);
    892 }
    893 
    894 
    895 /** Is the given opcode an extension code? */
    896 static inline GLboolean
    897 is_ext_opcode(OpCode opcode)
    898 {
    899    return (opcode >= OPCODE_EXT_0);
    900 }
    901 
    902 
    903 /** Destroy an extended opcode instruction */
    904 static GLint
    905 ext_opcode_destroy(struct gl_context *ctx, Node *node)
    906 {
    907    const GLint i = node[0].opcode - OPCODE_EXT_0;
    908    GLint step;
    909    ctx->ListExt->Opcode[i].Destroy(ctx, &node[1]);
    910    step = ctx->ListExt->Opcode[i].Size;
    911    return step;
    912 }
    913 
    914 
    915 /** Execute an extended opcode instruction */
    916 static GLint
    917 ext_opcode_execute(struct gl_context *ctx, Node *node)
    918 {
    919    const GLint i = node[0].opcode - OPCODE_EXT_0;
    920    GLint step;
    921    ctx->ListExt->Opcode[i].Execute(ctx, &node[1]);
    922    step = ctx->ListExt->Opcode[i].Size;
    923    return step;
    924 }
    925 
    926 
    927 /** Print an extended opcode instruction */
    928 static GLint
    929 ext_opcode_print(struct gl_context *ctx, Node *node, FILE *f)
    930 {
    931    const GLint i = node[0].opcode - OPCODE_EXT_0;
    932    GLint step;
    933    ctx->ListExt->Opcode[i].Print(ctx, &node[1], f);
    934    step = ctx->ListExt->Opcode[i].Size;
    935    return step;
    936 }
    937 
    938 
    939 /**
    940  * Delete the named display list, but don't remove from hash table.
    941  * \param dlist - display list pointer
    942  */
    943 void
    944 _mesa_delete_list(struct gl_context *ctx, struct gl_display_list *dlist)
    945 {
    946    Node *n, *block;
    947    GLboolean done;
    948 
    949    n = block = dlist->Head;
    950 
    951    done = block ? GL_FALSE : GL_TRUE;
    952    while (!done) {
    953       const OpCode opcode = n[0].opcode;
    954 
    955       /* check for extension opcodes first */
    956       if (is_ext_opcode(opcode)) {
    957          n += ext_opcode_destroy(ctx, n);
    958       }
    959       else {
    960          switch (opcode) {
    961             /* for some commands, we need to free malloc'd memory */
    962          case OPCODE_MAP1:
    963             free(get_pointer(&n[6]));
    964             n += InstSize[n[0].opcode];
    965             break;
    966          case OPCODE_MAP2:
    967             free(get_pointer(&n[10]));
    968             n += InstSize[n[0].opcode];
    969             break;
    970          case OPCODE_CALL_LISTS:
    971             free(get_pointer(&n[3]));
    972             n += InstSize[n[0].opcode];
    973             break;
    974          case OPCODE_DRAW_PIXELS:
    975             free(get_pointer(&n[5]));
    976             n += InstSize[n[0].opcode];
    977             break;
    978          case OPCODE_BITMAP:
    979             free(get_pointer(&n[7]));
    980             n += InstSize[n[0].opcode];
    981             break;
    982          case OPCODE_POLYGON_STIPPLE:
    983             free(get_pointer(&n[1]));
    984             n += InstSize[n[0].opcode];
    985             break;
    986          case OPCODE_TEX_IMAGE1D:
    987             free(get_pointer(&n[8]));
    988             n += InstSize[n[0].opcode];
    989             break;
    990          case OPCODE_TEX_IMAGE2D:
    991             free(get_pointer(&n[9]));
    992             n += InstSize[n[0].opcode];
    993             break;
    994          case OPCODE_TEX_IMAGE3D:
    995             free(get_pointer(&n[10]));
    996             n += InstSize[n[0].opcode];
    997             break;
    998          case OPCODE_TEX_SUB_IMAGE1D:
    999             free(get_pointer(&n[7]));
   1000             n += InstSize[n[0].opcode];
   1001             break;
   1002          case OPCODE_TEX_SUB_IMAGE2D:
   1003             free(get_pointer(&n[9]));
   1004             n += InstSize[n[0].opcode];
   1005             break;
   1006          case OPCODE_TEX_SUB_IMAGE3D:
   1007             free(get_pointer(&n[11]));
   1008             n += InstSize[n[0].opcode];
   1009             break;
   1010          case OPCODE_COMPRESSED_TEX_IMAGE_1D:
   1011             free(get_pointer(&n[7]));
   1012             n += InstSize[n[0].opcode];
   1013             break;
   1014          case OPCODE_COMPRESSED_TEX_IMAGE_2D:
   1015             free(get_pointer(&n[8]));
   1016             n += InstSize[n[0].opcode];
   1017             break;
   1018          case OPCODE_COMPRESSED_TEX_IMAGE_3D:
   1019             free(get_pointer(&n[9]));
   1020             n += InstSize[n[0].opcode];
   1021             break;
   1022          case OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D:
   1023             free(get_pointer(&n[7]));
   1024             n += InstSize[n[0].opcode];
   1025             break;
   1026          case OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D:
   1027             free(get_pointer(&n[9]));
   1028             n += InstSize[n[0].opcode];
   1029             break;
   1030          case OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D:
   1031             free(get_pointer(&n[11]));
   1032             n += InstSize[n[0].opcode];
   1033             break;
   1034          case OPCODE_PROGRAM_STRING_ARB:
   1035             free(get_pointer(&n[4]));      /* program string */
   1036             n += InstSize[n[0].opcode];
   1037             break;
   1038          case OPCODE_UNIFORM_1FV:
   1039          case OPCODE_UNIFORM_2FV:
   1040          case OPCODE_UNIFORM_3FV:
   1041          case OPCODE_UNIFORM_4FV:
   1042          case OPCODE_UNIFORM_1IV:
   1043          case OPCODE_UNIFORM_2IV:
   1044          case OPCODE_UNIFORM_3IV:
   1045          case OPCODE_UNIFORM_4IV:
   1046          case OPCODE_UNIFORM_1UIV:
   1047          case OPCODE_UNIFORM_2UIV:
   1048          case OPCODE_UNIFORM_3UIV:
   1049          case OPCODE_UNIFORM_4UIV:
   1050             free(get_pointer(&n[3]));
   1051             n += InstSize[n[0].opcode];
   1052             break;
   1053          case OPCODE_UNIFORM_MATRIX22:
   1054          case OPCODE_UNIFORM_MATRIX33:
   1055          case OPCODE_UNIFORM_MATRIX44:
   1056          case OPCODE_UNIFORM_MATRIX24:
   1057          case OPCODE_UNIFORM_MATRIX42:
   1058          case OPCODE_UNIFORM_MATRIX23:
   1059          case OPCODE_UNIFORM_MATRIX32:
   1060          case OPCODE_UNIFORM_MATRIX34:
   1061          case OPCODE_UNIFORM_MATRIX43:
   1062             free(get_pointer(&n[4]));
   1063             n += InstSize[n[0].opcode];
   1064             break;
   1065          case OPCODE_PROGRAM_UNIFORM_1FV:
   1066          case OPCODE_PROGRAM_UNIFORM_2FV:
   1067          case OPCODE_PROGRAM_UNIFORM_3FV:
   1068          case OPCODE_PROGRAM_UNIFORM_4FV:
   1069          case OPCODE_PROGRAM_UNIFORM_1IV:
   1070          case OPCODE_PROGRAM_UNIFORM_2IV:
   1071          case OPCODE_PROGRAM_UNIFORM_3IV:
   1072          case OPCODE_PROGRAM_UNIFORM_4IV:
   1073          case OPCODE_PROGRAM_UNIFORM_1UIV:
   1074          case OPCODE_PROGRAM_UNIFORM_2UIV:
   1075          case OPCODE_PROGRAM_UNIFORM_3UIV:
   1076          case OPCODE_PROGRAM_UNIFORM_4UIV:
   1077             free(get_pointer(&n[4]));
   1078             n += InstSize[n[0].opcode];
   1079             break;
   1080          case OPCODE_PROGRAM_UNIFORM_MATRIX22F:
   1081          case OPCODE_PROGRAM_UNIFORM_MATRIX33F:
   1082          case OPCODE_PROGRAM_UNIFORM_MATRIX44F:
   1083          case OPCODE_PROGRAM_UNIFORM_MATRIX24F:
   1084          case OPCODE_PROGRAM_UNIFORM_MATRIX42F:
   1085          case OPCODE_PROGRAM_UNIFORM_MATRIX23F:
   1086          case OPCODE_PROGRAM_UNIFORM_MATRIX32F:
   1087          case OPCODE_PROGRAM_UNIFORM_MATRIX34F:
   1088          case OPCODE_PROGRAM_UNIFORM_MATRIX43F:
   1089             free(get_pointer(&n[5]));
   1090             n += InstSize[n[0].opcode];
   1091             break;
   1092          case OPCODE_PIXEL_MAP:
   1093             free(get_pointer(&n[3]));
   1094             n += InstSize[n[0].opcode];
   1095             break;
   1096          case OPCODE_WINDOW_RECTANGLES:
   1097             free(get_pointer(&n[3]));
   1098             n += InstSize[n[0].opcode];
   1099             break;
   1100          case OPCODE_CONTINUE:
   1101             n = (Node *) get_pointer(&n[1]);
   1102             free(block);
   1103             block = n;
   1104             break;
   1105          case OPCODE_END_OF_LIST:
   1106             free(block);
   1107             done = GL_TRUE;
   1108             break;
   1109          default:
   1110             /* Most frequent case */
   1111             n += InstSize[n[0].opcode];
   1112             break;
   1113          }
   1114       }
   1115    }
   1116 
   1117    free(dlist->Label);
   1118    free(dlist);
   1119 }
   1120 
   1121 
   1122 /**
   1123  * Called by _mesa_HashWalk() to check if a display list which is being
   1124  * deleted belongs to a bitmap texture atlas.
   1125  */
   1126 static void
   1127 check_atlas_for_deleted_list(GLuint atlas_id, void *data, void *userData)
   1128 {
   1129    struct gl_bitmap_atlas *atlas = (struct gl_bitmap_atlas *) data;
   1130    GLuint list_id = *((GLuint *) userData);  /* the list being deleted */
   1131 
   1132    /* See if the list_id falls in the range contained in this texture atlas */
   1133    if (atlas->complete &&
   1134        list_id >= atlas_id &&
   1135        list_id < atlas_id + atlas->numBitmaps) {
   1136       /* Mark the atlas as incomplete so it doesn't get used.  But don't
   1137        * delete it yet since we don't want to try to recreate it in the next
   1138        * glCallLists.
   1139        */
   1140       atlas->complete = false;
   1141       atlas->incomplete = true;
   1142    }
   1143 }
   1144 
   1145 
   1146 /**
   1147  * Destroy a display list and remove from hash table.
   1148  * \param list - display list number
   1149  */
   1150 static void
   1151 destroy_list(struct gl_context *ctx, GLuint list)
   1152 {
   1153    struct gl_display_list *dlist;
   1154 
   1155    if (list == 0)
   1156       return;
   1157 
   1158    dlist = _mesa_lookup_list(ctx, list);
   1159    if (!dlist)
   1160       return;
   1161 
   1162    if (is_bitmap_list(dlist)) {
   1163       /* If we're destroying a simple glBitmap display list, there's a
   1164        * chance that we're destroying a bitmap image that's in a texture
   1165        * atlas.  Examine all atlases to see if that's the case.  There's
   1166        * usually few (if any) atlases so this isn't expensive.
   1167        */
   1168       _mesa_HashWalk(ctx->Shared->BitmapAtlas,
   1169                      check_atlas_for_deleted_list, &list);
   1170    }
   1171 
   1172    _mesa_delete_list(ctx, dlist);
   1173    _mesa_HashRemove(ctx->Shared->DisplayList, list);
   1174 }
   1175 
   1176 
   1177 /*
   1178  * Translate the nth element of list from <type> to GLint.
   1179  */
   1180 static GLint
   1181 translate_id(GLsizei n, GLenum type, const GLvoid * list)
   1182 {
   1183    GLbyte *bptr;
   1184    GLubyte *ubptr;
   1185    GLshort *sptr;
   1186    GLushort *usptr;
   1187    GLint *iptr;
   1188    GLuint *uiptr;
   1189    GLfloat *fptr;
   1190 
   1191    switch (type) {
   1192    case GL_BYTE:
   1193       bptr = (GLbyte *) list;
   1194       return (GLint) bptr[n];
   1195    case GL_UNSIGNED_BYTE:
   1196       ubptr = (GLubyte *) list;
   1197       return (GLint) ubptr[n];
   1198    case GL_SHORT:
   1199       sptr = (GLshort *) list;
   1200       return (GLint) sptr[n];
   1201    case GL_UNSIGNED_SHORT:
   1202       usptr = (GLushort *) list;
   1203       return (GLint) usptr[n];
   1204    case GL_INT:
   1205       iptr = (GLint *) list;
   1206       return iptr[n];
   1207    case GL_UNSIGNED_INT:
   1208       uiptr = (GLuint *) list;
   1209       return (GLint) uiptr[n];
   1210    case GL_FLOAT:
   1211       fptr = (GLfloat *) list;
   1212       return (GLint) floorf(fptr[n]);
   1213    case GL_2_BYTES:
   1214       ubptr = ((GLubyte *) list) + 2 * n;
   1215       return (GLint) ubptr[0] * 256
   1216            + (GLint) ubptr[1];
   1217    case GL_3_BYTES:
   1218       ubptr = ((GLubyte *) list) + 3 * n;
   1219       return (GLint) ubptr[0] * 65536
   1220            + (GLint) ubptr[1] * 256
   1221            + (GLint) ubptr[2];
   1222    case GL_4_BYTES:
   1223       ubptr = ((GLubyte *) list) + 4 * n;
   1224       return (GLint) ubptr[0] * 16777216
   1225            + (GLint) ubptr[1] * 65536
   1226            + (GLint) ubptr[2] * 256
   1227            + (GLint) ubptr[3];
   1228    default:
   1229       return 0;
   1230    }
   1231 }
   1232 
   1233 
   1234 /**
   1235  * Wrapper for _mesa_unpack_image/bitmap() that handles pixel buffer objects.
   1236  * If width < 0 or height < 0 or format or type are invalid we'll just
   1237  * return NULL.  We will not generate an error since OpenGL command
   1238  * arguments aren't error-checked until the command is actually executed
   1239  * (not when they're compiled).
   1240  * But if we run out of memory, GL_OUT_OF_MEMORY will be recorded.
   1241  */
   1242 static GLvoid *
   1243 unpack_image(struct gl_context *ctx, GLuint dimensions,
   1244              GLsizei width, GLsizei height, GLsizei depth,
   1245              GLenum format, GLenum type, const GLvoid * pixels,
   1246              const struct gl_pixelstore_attrib *unpack)
   1247 {
   1248    if (width <= 0 || height <= 0) {
   1249       return NULL;
   1250    }
   1251 
   1252    if (_mesa_bytes_per_pixel(format, type) < 0) {
   1253       /* bad format and/or type */
   1254       return NULL;
   1255    }
   1256 
   1257    if (!_mesa_is_bufferobj(unpack->BufferObj)) {
   1258       /* no PBO */
   1259       GLvoid *image;
   1260 
   1261       image = _mesa_unpack_image(dimensions, width, height, depth,
   1262                                  format, type, pixels, unpack);
   1263       if (pixels && !image) {
   1264          _mesa_error(ctx, GL_OUT_OF_MEMORY, "display list construction");
   1265       }
   1266       return image;
   1267    }
   1268    else if (_mesa_validate_pbo_access(dimensions, unpack, width, height,
   1269                                       depth, format, type, INT_MAX, pixels)) {
   1270       const GLubyte *map, *src;
   1271       GLvoid *image;
   1272 
   1273       map = (GLubyte *)
   1274          ctx->Driver.MapBufferRange(ctx, 0, unpack->BufferObj->Size,
   1275                                     GL_MAP_READ_BIT, unpack->BufferObj,
   1276                                     MAP_INTERNAL);
   1277       if (!map) {
   1278          /* unable to map src buffer! */
   1279          _mesa_error(ctx, GL_INVALID_OPERATION, "unable to map PBO");
   1280          return NULL;
   1281       }
   1282 
   1283       src = ADD_POINTERS(map, pixels);
   1284       image = _mesa_unpack_image(dimensions, width, height, depth,
   1285                                  format, type, src, unpack);
   1286 
   1287       ctx->Driver.UnmapBuffer(ctx, unpack->BufferObj, MAP_INTERNAL);
   1288 
   1289       if (!image) {
   1290          _mesa_error(ctx, GL_OUT_OF_MEMORY, "display list construction");
   1291       }
   1292       return image;
   1293    }
   1294 
   1295    /* bad access! */
   1296    _mesa_error(ctx, GL_INVALID_OPERATION, "invalid PBO access");
   1297    return NULL;
   1298 }
   1299 
   1300 
   1301 /** Return copy of memory */
   1302 static void *
   1303 memdup(const void *src, GLsizei bytes)
   1304 {
   1305    void *b = bytes >= 0 ? malloc(bytes) : NULL;
   1306    if (b)
   1307       memcpy(b, src, bytes);
   1308    return b;
   1309 }
   1310 
   1311 
   1312 /**
   1313  * Allocate space for a display list instruction (opcode + payload space).
   1314  * \param opcode  the instruction opcode (OPCODE_* value)
   1315  * \param bytes   instruction payload size (not counting opcode)
   1316  * \param align8  does the payload need to be 8-byte aligned?
   1317  *                This is only relevant in 64-bit environments.
   1318  * \return pointer to allocated memory (the payload will be at pointer+1)
   1319  */
   1320 static Node *
   1321 dlist_alloc(struct gl_context *ctx, OpCode opcode, GLuint bytes, bool align8)
   1322 {
   1323    const GLuint numNodes = 1 + (bytes + sizeof(Node) - 1) / sizeof(Node);
   1324    const GLuint contNodes = 1 + POINTER_DWORDS;  /* size of continue info */
   1325    GLuint nopNode;
   1326    Node *n;
   1327 
   1328    if (opcode < OPCODE_EXT_0) {
   1329       if (InstSize[opcode] == 0) {
   1330          /* save instruction size now */
   1331          InstSize[opcode] = numNodes;
   1332       }
   1333       else {
   1334          /* make sure instruction size agrees */
   1335          assert(numNodes == InstSize[opcode]);
   1336       }
   1337    }
   1338 
   1339    if (sizeof(void *) > sizeof(Node) && align8
   1340        && ctx->ListState.CurrentPos % 2 == 0) {
   1341       /* The opcode would get placed at node[0] and the payload would start
   1342        * at node[1].  But the payload needs to be at an even offset (8-byte
   1343        * multiple).
   1344        */
   1345       nopNode = 1;
   1346    }
   1347    else {
   1348       nopNode = 0;
   1349    }
   1350 
   1351    if (ctx->ListState.CurrentPos + nopNode + numNodes + contNodes
   1352        > BLOCK_SIZE) {
   1353       /* This block is full.  Allocate a new block and chain to it */
   1354       Node *newblock;
   1355       n = ctx->ListState.CurrentBlock + ctx->ListState.CurrentPos;
   1356       n[0].opcode = OPCODE_CONTINUE;
   1357       newblock = malloc(sizeof(Node) * BLOCK_SIZE);
   1358       if (!newblock) {
   1359          _mesa_error(ctx, GL_OUT_OF_MEMORY, "Building display list");
   1360          return NULL;
   1361       }
   1362 
   1363       /* a fresh block should be 8-byte aligned on 64-bit systems */
   1364       assert(((GLintptr) newblock) % sizeof(void *) == 0);
   1365 
   1366       save_pointer(&n[1], newblock);
   1367       ctx->ListState.CurrentBlock = newblock;
   1368       ctx->ListState.CurrentPos = 0;
   1369 
   1370       /* Display list nodes are always 4 bytes.  If we need 8-byte alignment
   1371        * we have to insert a NOP so that the payload of the real opcode lands
   1372        * on an even location:
   1373        *   node[0] = OPCODE_NOP
   1374        *   node[1] = OPCODE_x;
   1375        *   node[2] = start of payload
   1376        */
   1377       nopNode = sizeof(void *) > sizeof(Node) && align8;
   1378    }
   1379 
   1380    n = ctx->ListState.CurrentBlock + ctx->ListState.CurrentPos;
   1381    if (nopNode) {
   1382       assert(ctx->ListState.CurrentPos % 2 == 0); /* even value */
   1383       n[0].opcode = OPCODE_NOP;
   1384       n++;
   1385       /* The "real" opcode will now be at an odd location and the payload
   1386        * will be at an even location.
   1387        */
   1388    }
   1389    ctx->ListState.CurrentPos += nopNode + numNodes;
   1390 
   1391    n[0].opcode = opcode;
   1392 
   1393    return n;
   1394 }
   1395 
   1396 
   1397 
   1398 /**
   1399  * Allocate space for a display list instruction.  Used by callers outside
   1400  * this file for things like VBO vertex data.
   1401  *
   1402  * \param opcode  the instruction opcode (OPCODE_* value)
   1403  * \param bytes   instruction size in bytes, not counting opcode.
   1404  * \return pointer to the usable data area (not including the internal
   1405  *         opcode).
   1406  */
   1407 void *
   1408 _mesa_dlist_alloc(struct gl_context *ctx, GLuint opcode, GLuint bytes)
   1409 {
   1410    Node *n = dlist_alloc(ctx, (OpCode) opcode, bytes, false);
   1411    if (n)
   1412       return n + 1;  /* return pointer to payload area, after opcode */
   1413    else
   1414       return NULL;
   1415 }
   1416 
   1417 
   1418 /**
   1419  * Same as _mesa_dlist_alloc(), but return a pointer which is 8-byte
   1420  * aligned in 64-bit environments, 4-byte aligned otherwise.
   1421  */
   1422 void *
   1423 _mesa_dlist_alloc_aligned(struct gl_context *ctx, GLuint opcode, GLuint bytes)
   1424 {
   1425    Node *n = dlist_alloc(ctx, (OpCode) opcode, bytes, true);
   1426    if (n)
   1427       return n + 1;  /* return pointer to payload area, after opcode */
   1428    else
   1429       return NULL;
   1430 }
   1431 
   1432 
   1433 /**
   1434  * This function allows modules and drivers to get their own opcodes
   1435  * for extending display list functionality.
   1436  * \param ctx  the rendering context
   1437  * \param size  number of bytes for storing the new display list command
   1438  * \param execute  function to execute the new display list command
   1439  * \param destroy  function to destroy the new display list command
   1440  * \param print  function to print the new display list command
   1441  * \return  the new opcode number or -1 if error
   1442  */
   1443 GLint
   1444 _mesa_dlist_alloc_opcode(struct gl_context *ctx,
   1445                          GLuint size,
   1446                          void (*execute) (struct gl_context *, void *),
   1447                          void (*destroy) (struct gl_context *, void *),
   1448                          void (*print) (struct gl_context *, void *, FILE *))
   1449 {
   1450    if (ctx->ListExt->NumOpcodes < MAX_DLIST_EXT_OPCODES) {
   1451       const GLuint i = ctx->ListExt->NumOpcodes++;
   1452       ctx->ListExt->Opcode[i].Size =
   1453          1 + (size + sizeof(Node) - 1) / sizeof(Node);
   1454       ctx->ListExt->Opcode[i].Execute = execute;
   1455       ctx->ListExt->Opcode[i].Destroy = destroy;
   1456       ctx->ListExt->Opcode[i].Print = print;
   1457       return i + OPCODE_EXT_0;
   1458    }
   1459    return -1;
   1460 }
   1461 
   1462 
   1463 /**
   1464  * Allocate space for a display list instruction.  The space is basically
   1465  * an array of Nodes where node[0] holds the opcode, node[1] is the first
   1466  * function parameter, node[2] is the second parameter, etc.
   1467  *
   1468  * \param opcode  one of OPCODE_x
   1469  * \param nparams  number of function parameters
   1470  * \return  pointer to start of instruction space
   1471  */
   1472 static inline Node *
   1473 alloc_instruction(struct gl_context *ctx, OpCode opcode, GLuint nparams)
   1474 {
   1475    return dlist_alloc(ctx, opcode, nparams * sizeof(Node), false);
   1476 }
   1477 
   1478 
   1479 /**
   1480  * Called by EndList to try to reduce memory used for the list.
   1481  */
   1482 static void
   1483 trim_list(struct gl_context *ctx)
   1484 {
   1485    /* If the list we're ending only has one allocated block of nodes/tokens
   1486     * and its size isn't a full block size, realloc the block to use less
   1487     * memory.  This is important for apps that create many small display
   1488     * lists and apps that use glXUseXFont (many lists each containing one
   1489     * glBitmap call).
   1490     * Note: we currently only trim display lists that allocated one block
   1491     * of tokens.  That hits the short list case which is what we're mainly
   1492     * concerned with.  Trimming longer lists would involve traversing the
   1493     * linked list of blocks.
   1494     */
   1495    struct gl_dlist_state *list = &ctx->ListState;
   1496 
   1497    if ((list->CurrentList->Head == list->CurrentBlock) &&
   1498        (list->CurrentPos < BLOCK_SIZE)) {
   1499       /* There's only one block and it's not full, so realloc */
   1500       GLuint newSize = list->CurrentPos * sizeof(Node);
   1501       list->CurrentList->Head =
   1502       list->CurrentBlock = realloc(list->CurrentBlock, newSize);
   1503       if (!list->CurrentBlock) {
   1504          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glEndList");
   1505       }
   1506    }
   1507 }
   1508 
   1509 
   1510 
   1511 /*
   1512  * Display List compilation functions
   1513  */
   1514 static void GLAPIENTRY
   1515 save_Accum(GLenum op, GLfloat value)
   1516 {
   1517    GET_CURRENT_CONTEXT(ctx);
   1518    Node *n;
   1519    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1520    n = alloc_instruction(ctx, OPCODE_ACCUM, 2);
   1521    if (n) {
   1522       n[1].e = op;
   1523       n[2].f = value;
   1524    }
   1525    if (ctx->ExecuteFlag) {
   1526       CALL_Accum(ctx->Exec, (op, value));
   1527    }
   1528 }
   1529 
   1530 
   1531 static void GLAPIENTRY
   1532 save_AlphaFunc(GLenum func, GLclampf ref)
   1533 {
   1534    GET_CURRENT_CONTEXT(ctx);
   1535    Node *n;
   1536    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1537    n = alloc_instruction(ctx, OPCODE_ALPHA_FUNC, 2);
   1538    if (n) {
   1539       n[1].e = func;
   1540       n[2].f = (GLfloat) ref;
   1541    }
   1542    if (ctx->ExecuteFlag) {
   1543       CALL_AlphaFunc(ctx->Exec, (func, ref));
   1544    }
   1545 }
   1546 
   1547 
   1548 static void GLAPIENTRY
   1549 save_BindTexture(GLenum target, GLuint texture)
   1550 {
   1551    GET_CURRENT_CONTEXT(ctx);
   1552    Node *n;
   1553    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1554    n = alloc_instruction(ctx, OPCODE_BIND_TEXTURE, 2);
   1555    if (n) {
   1556       n[1].e = target;
   1557       n[2].ui = texture;
   1558    }
   1559    if (ctx->ExecuteFlag) {
   1560       CALL_BindTexture(ctx->Exec, (target, texture));
   1561    }
   1562 }
   1563 
   1564 
   1565 static void GLAPIENTRY
   1566 save_Bitmap(GLsizei width, GLsizei height,
   1567             GLfloat xorig, GLfloat yorig,
   1568             GLfloat xmove, GLfloat ymove, const GLubyte * pixels)
   1569 {
   1570    GET_CURRENT_CONTEXT(ctx);
   1571    Node *n;
   1572    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1573    n = alloc_instruction(ctx, OPCODE_BITMAP, 6 + POINTER_DWORDS);
   1574    if (n) {
   1575       n[1].i = (GLint) width;
   1576       n[2].i = (GLint) height;
   1577       n[3].f = xorig;
   1578       n[4].f = yorig;
   1579       n[5].f = xmove;
   1580       n[6].f = ymove;
   1581       save_pointer(&n[7],
   1582                    unpack_image(ctx, 2, width, height, 1, GL_COLOR_INDEX,
   1583                                 GL_BITMAP, pixels, &ctx->Unpack));
   1584    }
   1585    if (ctx->ExecuteFlag) {
   1586       CALL_Bitmap(ctx->Exec, (width, height,
   1587                               xorig, yorig, xmove, ymove, pixels));
   1588    }
   1589 }
   1590 
   1591 
   1592 static void GLAPIENTRY
   1593 save_BlendEquation(GLenum mode)
   1594 {
   1595    GET_CURRENT_CONTEXT(ctx);
   1596    Node *n;
   1597    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1598    n = alloc_instruction(ctx, OPCODE_BLEND_EQUATION, 1);
   1599    if (n) {
   1600       n[1].e = mode;
   1601    }
   1602    if (ctx->ExecuteFlag) {
   1603       CALL_BlendEquation(ctx->Exec, (mode));
   1604    }
   1605 }
   1606 
   1607 
   1608 static void GLAPIENTRY
   1609 save_BlendEquationSeparateEXT(GLenum modeRGB, GLenum modeA)
   1610 {
   1611    GET_CURRENT_CONTEXT(ctx);
   1612    Node *n;
   1613    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1614    n = alloc_instruction(ctx, OPCODE_BLEND_EQUATION_SEPARATE, 2);
   1615    if (n) {
   1616       n[1].e = modeRGB;
   1617       n[2].e = modeA;
   1618    }
   1619    if (ctx->ExecuteFlag) {
   1620       CALL_BlendEquationSeparate(ctx->Exec, (modeRGB, modeA));
   1621    }
   1622 }
   1623 
   1624 
   1625 static void GLAPIENTRY
   1626 save_BlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB,
   1627                           GLenum sfactorA, GLenum dfactorA)
   1628 {
   1629    GET_CURRENT_CONTEXT(ctx);
   1630    Node *n;
   1631    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1632    n = alloc_instruction(ctx, OPCODE_BLEND_FUNC_SEPARATE, 4);
   1633    if (n) {
   1634       n[1].e = sfactorRGB;
   1635       n[2].e = dfactorRGB;
   1636       n[3].e = sfactorA;
   1637       n[4].e = dfactorA;
   1638    }
   1639    if (ctx->ExecuteFlag) {
   1640       CALL_BlendFuncSeparate(ctx->Exec,
   1641                                 (sfactorRGB, dfactorRGB, sfactorA, dfactorA));
   1642    }
   1643 }
   1644 
   1645 
   1646 static void GLAPIENTRY
   1647 save_BlendFunc(GLenum srcfactor, GLenum dstfactor)
   1648 {
   1649    save_BlendFuncSeparateEXT(srcfactor, dstfactor, srcfactor, dstfactor);
   1650 }
   1651 
   1652 
   1653 static void GLAPIENTRY
   1654 save_BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
   1655 {
   1656    GET_CURRENT_CONTEXT(ctx);
   1657    Node *n;
   1658    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1659    n = alloc_instruction(ctx, OPCODE_BLEND_COLOR, 4);
   1660    if (n) {
   1661       n[1].f = red;
   1662       n[2].f = green;
   1663       n[3].f = blue;
   1664       n[4].f = alpha;
   1665    }
   1666    if (ctx->ExecuteFlag) {
   1667       CALL_BlendColor(ctx->Exec, (red, green, blue, alpha));
   1668    }
   1669 }
   1670 
   1671 /* GL_ARB_draw_buffers_blend */
   1672 static void GLAPIENTRY
   1673 save_BlendFuncSeparatei(GLuint buf, GLenum sfactorRGB, GLenum dfactorRGB,
   1674                         GLenum sfactorA, GLenum dfactorA)
   1675 {
   1676    GET_CURRENT_CONTEXT(ctx);
   1677    Node *n;
   1678    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1679    n = alloc_instruction(ctx, OPCODE_BLEND_FUNC_SEPARATE_I, 5);
   1680    if (n) {
   1681       n[1].ui = buf;
   1682       n[2].e = sfactorRGB;
   1683       n[3].e = dfactorRGB;
   1684       n[4].e = sfactorA;
   1685       n[5].e = dfactorA;
   1686    }
   1687    if (ctx->ExecuteFlag) {
   1688       CALL_BlendFuncSeparateiARB(ctx->Exec, (buf, sfactorRGB, dfactorRGB,
   1689                                              sfactorA, dfactorA));
   1690    }
   1691 }
   1692 
   1693 /* GL_ARB_draw_buffers_blend */
   1694 static void GLAPIENTRY
   1695 save_BlendFunci(GLuint buf, GLenum sfactor, GLenum dfactor)
   1696 {
   1697    GET_CURRENT_CONTEXT(ctx);
   1698    Node *n;
   1699    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1700    n = alloc_instruction(ctx, OPCODE_BLEND_FUNC_I, 3);
   1701    if (n) {
   1702       n[1].ui = buf;
   1703       n[2].e = sfactor;
   1704       n[3].e = dfactor;
   1705    }
   1706    if (ctx->ExecuteFlag) {
   1707       CALL_BlendFunciARB(ctx->Exec, (buf, sfactor, dfactor));
   1708    }
   1709 }
   1710 
   1711 /* GL_ARB_draw_buffers_blend */
   1712 static void GLAPIENTRY
   1713 save_BlendEquationi(GLuint buf, GLenum mode)
   1714 {
   1715    GET_CURRENT_CONTEXT(ctx);
   1716    Node *n;
   1717    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1718    n = alloc_instruction(ctx, OPCODE_BLEND_EQUATION_I, 2);
   1719    if (n) {
   1720       n[1].ui = buf;
   1721       n[2].e = mode;
   1722    }
   1723    if (ctx->ExecuteFlag) {
   1724       CALL_BlendEquationiARB(ctx->Exec, (buf, mode));
   1725    }
   1726 }
   1727 
   1728 /* GL_ARB_draw_buffers_blend */
   1729 static void GLAPIENTRY
   1730 save_BlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeA)
   1731 {
   1732    GET_CURRENT_CONTEXT(ctx);
   1733    Node *n;
   1734    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1735    n = alloc_instruction(ctx, OPCODE_BLEND_EQUATION_SEPARATE_I, 3);
   1736    if (n) {
   1737       n[1].ui = buf;
   1738       n[2].e = modeRGB;
   1739       n[3].e = modeA;
   1740    }
   1741    if (ctx->ExecuteFlag) {
   1742       CALL_BlendEquationSeparateiARB(ctx->Exec, (buf, modeRGB, modeA));
   1743    }
   1744 }
   1745 
   1746 
   1747 /* GL_ARB_draw_instanced. */
   1748 static void GLAPIENTRY
   1749 save_DrawArraysInstancedARB(UNUSED GLenum mode,
   1750                             UNUSED GLint first,
   1751                             UNUSED GLsizei count,
   1752                             UNUSED GLsizei primcount)
   1753 {
   1754    GET_CURRENT_CONTEXT(ctx);
   1755    _mesa_error(ctx, GL_INVALID_OPERATION,
   1756                "glDrawArraysInstanced() during display list compile");
   1757 }
   1758 
   1759 static void GLAPIENTRY
   1760 save_DrawElementsInstancedARB(UNUSED GLenum mode,
   1761                               UNUSED GLsizei count,
   1762                               UNUSED GLenum type,
   1763                               UNUSED const GLvoid *indices,
   1764                               UNUSED GLsizei primcount)
   1765 {
   1766    GET_CURRENT_CONTEXT(ctx);
   1767    _mesa_error(ctx, GL_INVALID_OPERATION,
   1768                "glDrawElementsInstanced() during display list compile");
   1769 }
   1770 
   1771 static void GLAPIENTRY
   1772 save_DrawElementsInstancedBaseVertexARB(UNUSED GLenum mode,
   1773                                         UNUSED GLsizei count,
   1774                                         UNUSED GLenum type,
   1775                                         UNUSED const GLvoid *indices,
   1776                                         UNUSED GLsizei primcount,
   1777                                         UNUSED GLint basevertex)
   1778 {
   1779    GET_CURRENT_CONTEXT(ctx);
   1780    _mesa_error(ctx, GL_INVALID_OPERATION,
   1781                "glDrawElementsInstancedBaseVertex() during display list compile");
   1782 }
   1783 
   1784 /* GL_ARB_base_instance. */
   1785 static void GLAPIENTRY
   1786 save_DrawArraysInstancedBaseInstance(UNUSED GLenum mode,
   1787                                      UNUSED GLint first,
   1788                                      UNUSED GLsizei count,
   1789                                      UNUSED GLsizei primcount,
   1790                                      UNUSED GLuint baseinstance)
   1791 {
   1792    GET_CURRENT_CONTEXT(ctx);
   1793    _mesa_error(ctx, GL_INVALID_OPERATION,
   1794                "glDrawArraysInstancedBaseInstance() during display list compile");
   1795 }
   1796 
   1797 static void APIENTRY
   1798 save_DrawElementsInstancedBaseInstance(UNUSED GLenum mode,
   1799                                        UNUSED GLsizei count,
   1800                                        UNUSED GLenum type,
   1801                                        UNUSED const void *indices,
   1802                                        UNUSED GLsizei primcount,
   1803                                        UNUSED GLuint baseinstance)
   1804 {
   1805    GET_CURRENT_CONTEXT(ctx);
   1806    _mesa_error(ctx, GL_INVALID_OPERATION,
   1807                "glDrawElementsInstancedBaseInstance() during display list compile");
   1808 }
   1809 
   1810 static void APIENTRY
   1811 save_DrawElementsInstancedBaseVertexBaseInstance(UNUSED GLenum mode,
   1812                                                  UNUSED GLsizei count,
   1813                                                  UNUSED GLenum type,
   1814                                                  UNUSED const void *indices,
   1815                                                  UNUSED GLsizei primcount,
   1816                                                  UNUSED GLint basevertex,
   1817                                                  UNUSED GLuint baseinstance)
   1818 {
   1819    GET_CURRENT_CONTEXT(ctx);
   1820    _mesa_error(ctx, GL_INVALID_OPERATION,
   1821                "glDrawElementsInstancedBaseVertexBaseInstance() during display list compile");
   1822 }
   1823 
   1824 
   1825 /**
   1826  * While building a display list we cache some OpenGL state.
   1827  * Under some circumstances we need to invalidate that state (immediately
   1828  * when we start compiling a list, or after glCallList(s)).
   1829  */
   1830 static void
   1831 invalidate_saved_current_state(struct gl_context *ctx)
   1832 {
   1833    GLint i;
   1834 
   1835    for (i = 0; i < VERT_ATTRIB_MAX; i++)
   1836       ctx->ListState.ActiveAttribSize[i] = 0;
   1837 
   1838    for (i = 0; i < MAT_ATTRIB_MAX; i++)
   1839       ctx->ListState.ActiveMaterialSize[i] = 0;
   1840 
   1841    memset(&ctx->ListState.Current, 0, sizeof ctx->ListState.Current);
   1842 
   1843    ctx->Driver.CurrentSavePrimitive = PRIM_UNKNOWN;
   1844 }
   1845 
   1846 
   1847 static void GLAPIENTRY
   1848 save_CallList(GLuint list)
   1849 {
   1850    GET_CURRENT_CONTEXT(ctx);
   1851    Node *n;
   1852    SAVE_FLUSH_VERTICES(ctx);
   1853 
   1854    n = alloc_instruction(ctx, OPCODE_CALL_LIST, 1);
   1855    if (n) {
   1856       n[1].ui = list;
   1857    }
   1858 
   1859    /* After this, we don't know what state we're in.  Invalidate all
   1860     * cached information previously gathered:
   1861     */
   1862    invalidate_saved_current_state( ctx );
   1863 
   1864    if (ctx->ExecuteFlag) {
   1865       _mesa_CallList(list);
   1866    }
   1867 }
   1868 
   1869 
   1870 static void GLAPIENTRY
   1871 save_CallLists(GLsizei num, GLenum type, const GLvoid * lists)
   1872 {
   1873    GET_CURRENT_CONTEXT(ctx);
   1874    unsigned type_size;
   1875    Node *n;
   1876    void *lists_copy;
   1877 
   1878    SAVE_FLUSH_VERTICES(ctx);
   1879 
   1880    switch (type) {
   1881    case GL_BYTE:
   1882    case GL_UNSIGNED_BYTE:
   1883       type_size = 1;
   1884       break;
   1885    case GL_SHORT:
   1886    case GL_UNSIGNED_SHORT:
   1887    case GL_2_BYTES:
   1888       type_size = 2;
   1889       break;
   1890    case GL_3_BYTES:
   1891       type_size = 3;
   1892       break;
   1893    case GL_INT:
   1894    case GL_UNSIGNED_INT:
   1895    case GL_FLOAT:
   1896    case GL_4_BYTES:
   1897       type_size = 4;
   1898       break;
   1899    default:
   1900       type_size = 0;
   1901    }
   1902 
   1903    if (num > 0 && type_size > 0) {
   1904       /* create a copy of the array of list IDs to save in the display list */
   1905       lists_copy = memdup(lists, num * type_size);
   1906    } else {
   1907       lists_copy = NULL;
   1908    }
   1909 
   1910    n = alloc_instruction(ctx, OPCODE_CALL_LISTS, 2 + POINTER_DWORDS);
   1911    if (n) {
   1912       n[1].i = num;
   1913       n[2].e = type;
   1914       save_pointer(&n[3], lists_copy);
   1915    }
   1916 
   1917    /* After this, we don't know what state we're in.  Invalidate all
   1918     * cached information previously gathered:
   1919     */
   1920    invalidate_saved_current_state( ctx );
   1921 
   1922    if (ctx->ExecuteFlag) {
   1923       CALL_CallLists(ctx->Exec, (num, type, lists));
   1924    }
   1925 }
   1926 
   1927 
   1928 static void GLAPIENTRY
   1929 save_Clear(GLbitfield mask)
   1930 {
   1931    GET_CURRENT_CONTEXT(ctx);
   1932    Node *n;
   1933    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1934    n = alloc_instruction(ctx, OPCODE_CLEAR, 1);
   1935    if (n) {
   1936       n[1].bf = mask;
   1937    }
   1938    if (ctx->ExecuteFlag) {
   1939       CALL_Clear(ctx->Exec, (mask));
   1940    }
   1941 }
   1942 
   1943 
   1944 static void GLAPIENTRY
   1945 save_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
   1946 {
   1947    GET_CURRENT_CONTEXT(ctx);
   1948    Node *n;
   1949    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1950    n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_IV, 6);
   1951    if (n) {
   1952       n[1].e = buffer;
   1953       n[2].i = drawbuffer;
   1954       n[3].i = value[0];
   1955       if (buffer == GL_COLOR) {
   1956          n[4].i = value[1];
   1957          n[5].i = value[2];
   1958          n[6].i = value[3];
   1959       }
   1960       else {
   1961          n[4].i = 0;
   1962          n[5].i = 0;
   1963          n[6].i = 0;
   1964       }
   1965    }
   1966    if (ctx->ExecuteFlag) {
   1967       CALL_ClearBufferiv(ctx->Exec, (buffer, drawbuffer, value));
   1968    }
   1969 }
   1970 
   1971 
   1972 static void GLAPIENTRY
   1973 save_ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
   1974 {
   1975    GET_CURRENT_CONTEXT(ctx);
   1976    Node *n;
   1977    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   1978    n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_UIV, 6);
   1979    if (n) {
   1980       n[1].e = buffer;
   1981       n[2].i = drawbuffer;
   1982       n[3].ui = value[0];
   1983       if (buffer == GL_COLOR) {
   1984          n[4].ui = value[1];
   1985          n[5].ui = value[2];
   1986          n[6].ui = value[3];
   1987       }
   1988       else {
   1989          n[4].ui = 0;
   1990          n[5].ui = 0;
   1991          n[6].ui = 0;
   1992       }
   1993    }
   1994    if (ctx->ExecuteFlag) {
   1995       CALL_ClearBufferuiv(ctx->Exec, (buffer, drawbuffer, value));
   1996    }
   1997 }
   1998 
   1999 
   2000 static void GLAPIENTRY
   2001 save_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
   2002 {
   2003    GET_CURRENT_CONTEXT(ctx);
   2004    Node *n;
   2005    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2006    n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_FV, 6);
   2007    if (n) {
   2008       n[1].e = buffer;
   2009       n[2].i = drawbuffer;
   2010       n[3].f = value[0];
   2011       if (buffer == GL_COLOR) {
   2012          n[4].f = value[1];
   2013          n[5].f = value[2];
   2014          n[6].f = value[3];
   2015       }
   2016       else {
   2017          n[4].f = 0.0F;
   2018          n[5].f = 0.0F;
   2019          n[6].f = 0.0F;
   2020       }
   2021    }
   2022    if (ctx->ExecuteFlag) {
   2023       CALL_ClearBufferfv(ctx->Exec, (buffer, drawbuffer, value));
   2024    }
   2025 }
   2026 
   2027 
   2028 static void GLAPIENTRY
   2029 save_ClearBufferfi(GLenum buffer, GLint drawbuffer,
   2030                    GLfloat depth, GLint stencil)
   2031 {
   2032    GET_CURRENT_CONTEXT(ctx);
   2033    Node *n;
   2034    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2035    n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_FI, 4);
   2036    if (n) {
   2037       n[1].e = buffer;
   2038       n[2].i = drawbuffer;
   2039       n[3].f = depth;
   2040       n[4].i = stencil;
   2041    }
   2042    if (ctx->ExecuteFlag) {
   2043       CALL_ClearBufferfi(ctx->Exec, (buffer, drawbuffer, depth, stencil));
   2044    }
   2045 }
   2046 
   2047 
   2048 static void GLAPIENTRY
   2049 save_ClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
   2050 {
   2051    GET_CURRENT_CONTEXT(ctx);
   2052    Node *n;
   2053    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2054    n = alloc_instruction(ctx, OPCODE_CLEAR_ACCUM, 4);
   2055    if (n) {
   2056       n[1].f = red;
   2057       n[2].f = green;
   2058       n[3].f = blue;
   2059       n[4].f = alpha;
   2060    }
   2061    if (ctx->ExecuteFlag) {
   2062       CALL_ClearAccum(ctx->Exec, (red, green, blue, alpha));
   2063    }
   2064 }
   2065 
   2066 
   2067 static void GLAPIENTRY
   2068 save_ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
   2069 {
   2070    GET_CURRENT_CONTEXT(ctx);
   2071    Node *n;
   2072    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2073    n = alloc_instruction(ctx, OPCODE_CLEAR_COLOR, 4);
   2074    if (n) {
   2075       n[1].f = red;
   2076       n[2].f = green;
   2077       n[3].f = blue;
   2078       n[4].f = alpha;
   2079    }
   2080    if (ctx->ExecuteFlag) {
   2081       CALL_ClearColor(ctx->Exec, (red, green, blue, alpha));
   2082    }
   2083 }
   2084 
   2085 
   2086 static void GLAPIENTRY
   2087 save_ClearDepth(GLclampd depth)
   2088 {
   2089    GET_CURRENT_CONTEXT(ctx);
   2090    Node *n;
   2091    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2092    n = alloc_instruction(ctx, OPCODE_CLEAR_DEPTH, 1);
   2093    if (n) {
   2094       n[1].f = (GLfloat) depth;
   2095    }
   2096    if (ctx->ExecuteFlag) {
   2097       CALL_ClearDepth(ctx->Exec, (depth));
   2098    }
   2099 }
   2100 
   2101 
   2102 static void GLAPIENTRY
   2103 save_ClearIndex(GLfloat c)
   2104 {
   2105    GET_CURRENT_CONTEXT(ctx);
   2106    Node *n;
   2107    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2108    n = alloc_instruction(ctx, OPCODE_CLEAR_INDEX, 1);
   2109    if (n) {
   2110       n[1].f = c;
   2111    }
   2112    if (ctx->ExecuteFlag) {
   2113       CALL_ClearIndex(ctx->Exec, (c));
   2114    }
   2115 }
   2116 
   2117 
   2118 static void GLAPIENTRY
   2119 save_ClearStencil(GLint s)
   2120 {
   2121    GET_CURRENT_CONTEXT(ctx);
   2122    Node *n;
   2123    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2124    n = alloc_instruction(ctx, OPCODE_CLEAR_STENCIL, 1);
   2125    if (n) {
   2126       n[1].i = s;
   2127    }
   2128    if (ctx->ExecuteFlag) {
   2129       CALL_ClearStencil(ctx->Exec, (s));
   2130    }
   2131 }
   2132 
   2133 
   2134 static void GLAPIENTRY
   2135 save_ClipPlane(GLenum plane, const GLdouble * equ)
   2136 {
   2137    GET_CURRENT_CONTEXT(ctx);
   2138    Node *n;
   2139    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2140    n = alloc_instruction(ctx, OPCODE_CLIP_PLANE, 5);
   2141    if (n) {
   2142       n[1].e = plane;
   2143       n[2].f = (GLfloat) equ[0];
   2144       n[3].f = (GLfloat) equ[1];
   2145       n[4].f = (GLfloat) equ[2];
   2146       n[5].f = (GLfloat) equ[3];
   2147    }
   2148    if (ctx->ExecuteFlag) {
   2149       CALL_ClipPlane(ctx->Exec, (plane, equ));
   2150    }
   2151 }
   2152 
   2153 
   2154 
   2155 static void GLAPIENTRY
   2156 save_ColorMask(GLboolean red, GLboolean green,
   2157                GLboolean blue, GLboolean alpha)
   2158 {
   2159    GET_CURRENT_CONTEXT(ctx);
   2160    Node *n;
   2161    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2162    n = alloc_instruction(ctx, OPCODE_COLOR_MASK, 4);
   2163    if (n) {
   2164       n[1].b = red;
   2165       n[2].b = green;
   2166       n[3].b = blue;
   2167       n[4].b = alpha;
   2168    }
   2169    if (ctx->ExecuteFlag) {
   2170       CALL_ColorMask(ctx->Exec, (red, green, blue, alpha));
   2171    }
   2172 }
   2173 
   2174 
   2175 static void GLAPIENTRY
   2176 save_ColorMaskIndexed(GLuint buf, GLboolean red, GLboolean green,
   2177                       GLboolean blue, GLboolean alpha)
   2178 {
   2179    GET_CURRENT_CONTEXT(ctx);
   2180    Node *n;
   2181    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2182    n = alloc_instruction(ctx, OPCODE_COLOR_MASK_INDEXED, 5);
   2183    if (n) {
   2184       n[1].ui = buf;
   2185       n[2].b = red;
   2186       n[3].b = green;
   2187       n[4].b = blue;
   2188       n[5].b = alpha;
   2189    }
   2190    if (ctx->ExecuteFlag) {
   2191       /*CALL_ColorMaski(ctx->Exec, (buf, red, green, blue, alpha));*/
   2192    }
   2193 }
   2194 
   2195 
   2196 static void GLAPIENTRY
   2197 save_ColorMaterial(GLenum face, GLenum mode)
   2198 {
   2199    GET_CURRENT_CONTEXT(ctx);
   2200    Node *n;
   2201    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2202 
   2203    n = alloc_instruction(ctx, OPCODE_COLOR_MATERIAL, 2);
   2204    if (n) {
   2205       n[1].e = face;
   2206       n[2].e = mode;
   2207    }
   2208    if (ctx->ExecuteFlag) {
   2209       CALL_ColorMaterial(ctx->Exec, (face, mode));
   2210    }
   2211 }
   2212 
   2213 
   2214 static void GLAPIENTRY
   2215 save_CopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
   2216 {
   2217    GET_CURRENT_CONTEXT(ctx);
   2218    Node *n;
   2219    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2220    n = alloc_instruction(ctx, OPCODE_COPY_PIXELS, 5);
   2221    if (n) {
   2222       n[1].i = x;
   2223       n[2].i = y;
   2224       n[3].i = (GLint) width;
   2225       n[4].i = (GLint) height;
   2226       n[5].e = type;
   2227    }
   2228    if (ctx->ExecuteFlag) {
   2229       CALL_CopyPixels(ctx->Exec, (x, y, width, height, type));
   2230    }
   2231 }
   2232 
   2233 
   2234 
   2235 static void GLAPIENTRY
   2236 save_CopyTexImage1D(GLenum target, GLint level, GLenum internalformat,
   2237                     GLint x, GLint y, GLsizei width, GLint border)
   2238 {
   2239    GET_CURRENT_CONTEXT(ctx);
   2240    Node *n;
   2241    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2242    n = alloc_instruction(ctx, OPCODE_COPY_TEX_IMAGE1D, 7);
   2243    if (n) {
   2244       n[1].e = target;
   2245       n[2].i = level;
   2246       n[3].e = internalformat;
   2247       n[4].i = x;
   2248       n[5].i = y;
   2249       n[6].i = width;
   2250       n[7].i = border;
   2251    }
   2252    if (ctx->ExecuteFlag) {
   2253       CALL_CopyTexImage1D(ctx->Exec, (target, level, internalformat,
   2254                                       x, y, width, border));
   2255    }
   2256 }
   2257 
   2258 
   2259 static void GLAPIENTRY
   2260 save_CopyTexImage2D(GLenum target, GLint level,
   2261                     GLenum internalformat,
   2262                     GLint x, GLint y, GLsizei width,
   2263                     GLsizei height, GLint border)
   2264 {
   2265    GET_CURRENT_CONTEXT(ctx);
   2266    Node *n;
   2267    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2268    n = alloc_instruction(ctx, OPCODE_COPY_TEX_IMAGE2D, 8);
   2269    if (n) {
   2270       n[1].e = target;
   2271       n[2].i = level;
   2272       n[3].e = internalformat;
   2273       n[4].i = x;
   2274       n[5].i = y;
   2275       n[6].i = width;
   2276       n[7].i = height;
   2277       n[8].i = border;
   2278    }
   2279    if (ctx->ExecuteFlag) {
   2280       CALL_CopyTexImage2D(ctx->Exec, (target, level, internalformat,
   2281                                       x, y, width, height, border));
   2282    }
   2283 }
   2284 
   2285 
   2286 
   2287 static void GLAPIENTRY
   2288 save_CopyTexSubImage1D(GLenum target, GLint level,
   2289                        GLint xoffset, GLint x, GLint y, GLsizei width)
   2290 {
   2291    GET_CURRENT_CONTEXT(ctx);
   2292    Node *n;
   2293    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2294    n = alloc_instruction(ctx, OPCODE_COPY_TEX_SUB_IMAGE1D, 6);
   2295    if (n) {
   2296       n[1].e = target;
   2297       n[2].i = level;
   2298       n[3].i = xoffset;
   2299       n[4].i = x;
   2300       n[5].i = y;
   2301       n[6].i = width;
   2302    }
   2303    if (ctx->ExecuteFlag) {
   2304       CALL_CopyTexSubImage1D(ctx->Exec,
   2305                              (target, level, xoffset, x, y, width));
   2306    }
   2307 }
   2308 
   2309 
   2310 static void GLAPIENTRY
   2311 save_CopyTexSubImage2D(GLenum target, GLint level,
   2312                        GLint xoffset, GLint yoffset,
   2313                        GLint x, GLint y, GLsizei width, GLint height)
   2314 {
   2315    GET_CURRENT_CONTEXT(ctx);
   2316    Node *n;
   2317    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2318    n = alloc_instruction(ctx, OPCODE_COPY_TEX_SUB_IMAGE2D, 8);
   2319    if (n) {
   2320       n[1].e = target;
   2321       n[2].i = level;
   2322       n[3].i = xoffset;
   2323       n[4].i = yoffset;
   2324       n[5].i = x;
   2325       n[6].i = y;
   2326       n[7].i = width;
   2327       n[8].i = height;
   2328    }
   2329    if (ctx->ExecuteFlag) {
   2330       CALL_CopyTexSubImage2D(ctx->Exec, (target, level, xoffset, yoffset,
   2331                                          x, y, width, height));
   2332    }
   2333 }
   2334 
   2335 
   2336 static void GLAPIENTRY
   2337 save_CopyTexSubImage3D(GLenum target, GLint level,
   2338                        GLint xoffset, GLint yoffset, GLint zoffset,
   2339                        GLint x, GLint y, GLsizei width, GLint height)
   2340 {
   2341    GET_CURRENT_CONTEXT(ctx);
   2342    Node *n;
   2343    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2344    n = alloc_instruction(ctx, OPCODE_COPY_TEX_SUB_IMAGE3D, 9);
   2345    if (n) {
   2346       n[1].e = target;
   2347       n[2].i = level;
   2348       n[3].i = xoffset;
   2349       n[4].i = yoffset;
   2350       n[5].i = zoffset;
   2351       n[6].i = x;
   2352       n[7].i = y;
   2353       n[8].i = width;
   2354       n[9].i = height;
   2355    }
   2356    if (ctx->ExecuteFlag) {
   2357       CALL_CopyTexSubImage3D(ctx->Exec, (target, level,
   2358                                          xoffset, yoffset, zoffset,
   2359                                          x, y, width, height));
   2360    }
   2361 }
   2362 
   2363 
   2364 static void GLAPIENTRY
   2365 save_CullFace(GLenum mode)
   2366 {
   2367    GET_CURRENT_CONTEXT(ctx);
   2368    Node *n;
   2369    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2370    n = alloc_instruction(ctx, OPCODE_CULL_FACE, 1);
   2371    if (n) {
   2372       n[1].e = mode;
   2373    }
   2374    if (ctx->ExecuteFlag) {
   2375       CALL_CullFace(ctx->Exec, (mode));
   2376    }
   2377 }
   2378 
   2379 
   2380 static void GLAPIENTRY
   2381 save_DepthFunc(GLenum func)
   2382 {
   2383    GET_CURRENT_CONTEXT(ctx);
   2384    Node *n;
   2385    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2386    n = alloc_instruction(ctx, OPCODE_DEPTH_FUNC, 1);
   2387    if (n) {
   2388       n[1].e = func;
   2389    }
   2390    if (ctx->ExecuteFlag) {
   2391       CALL_DepthFunc(ctx->Exec, (func));
   2392    }
   2393 }
   2394 
   2395 
   2396 static void GLAPIENTRY
   2397 save_DepthMask(GLboolean mask)
   2398 {
   2399    GET_CURRENT_CONTEXT(ctx);
   2400    Node *n;
   2401    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2402    n = alloc_instruction(ctx, OPCODE_DEPTH_MASK, 1);
   2403    if (n) {
   2404       n[1].b = mask;
   2405    }
   2406    if (ctx->ExecuteFlag) {
   2407       CALL_DepthMask(ctx->Exec, (mask));
   2408    }
   2409 }
   2410 
   2411 
   2412 static void GLAPIENTRY
   2413 save_DepthRange(GLclampd nearval, GLclampd farval)
   2414 {
   2415    GET_CURRENT_CONTEXT(ctx);
   2416    Node *n;
   2417    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2418    n = alloc_instruction(ctx, OPCODE_DEPTH_RANGE, 2);
   2419    if (n) {
   2420       n[1].f = (GLfloat) nearval;
   2421       n[2].f = (GLfloat) farval;
   2422    }
   2423    if (ctx->ExecuteFlag) {
   2424       CALL_DepthRange(ctx->Exec, (nearval, farval));
   2425    }
   2426 }
   2427 
   2428 
   2429 static void GLAPIENTRY
   2430 save_Disable(GLenum cap)
   2431 {
   2432    GET_CURRENT_CONTEXT(ctx);
   2433    Node *n;
   2434    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2435    n = alloc_instruction(ctx, OPCODE_DISABLE, 1);
   2436    if (n) {
   2437       n[1].e = cap;
   2438    }
   2439    if (ctx->ExecuteFlag) {
   2440       CALL_Disable(ctx->Exec, (cap));
   2441    }
   2442 }
   2443 
   2444 
   2445 static void GLAPIENTRY
   2446 save_DisableIndexed(GLuint index, GLenum cap)
   2447 {
   2448    GET_CURRENT_CONTEXT(ctx);
   2449    Node *n;
   2450    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2451    n = alloc_instruction(ctx, OPCODE_DISABLE_INDEXED, 2);
   2452    if (n) {
   2453       n[1].ui = index;
   2454       n[2].e = cap;
   2455    }
   2456    if (ctx->ExecuteFlag) {
   2457       CALL_Disablei(ctx->Exec, (index, cap));
   2458    }
   2459 }
   2460 
   2461 
   2462 static void GLAPIENTRY
   2463 save_DrawBuffer(GLenum mode)
   2464 {
   2465    GET_CURRENT_CONTEXT(ctx);
   2466    Node *n;
   2467    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2468    n = alloc_instruction(ctx, OPCODE_DRAW_BUFFER, 1);
   2469    if (n) {
   2470       n[1].e = mode;
   2471    }
   2472    if (ctx->ExecuteFlag) {
   2473       CALL_DrawBuffer(ctx->Exec, (mode));
   2474    }
   2475 }
   2476 
   2477 
   2478 static void GLAPIENTRY
   2479 save_DrawPixels(GLsizei width, GLsizei height,
   2480                 GLenum format, GLenum type, const GLvoid * pixels)
   2481 {
   2482    GET_CURRENT_CONTEXT(ctx);
   2483    Node *n;
   2484 
   2485    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2486 
   2487    n = alloc_instruction(ctx, OPCODE_DRAW_PIXELS, 4 + POINTER_DWORDS);
   2488    if (n) {
   2489       n[1].i = width;
   2490       n[2].i = height;
   2491       n[3].e = format;
   2492       n[4].e = type;
   2493       save_pointer(&n[5],
   2494                    unpack_image(ctx, 2, width, height, 1, format, type,
   2495                                 pixels, &ctx->Unpack));
   2496    }
   2497    if (ctx->ExecuteFlag) {
   2498       CALL_DrawPixels(ctx->Exec, (width, height, format, type, pixels));
   2499    }
   2500 }
   2501 
   2502 
   2503 
   2504 static void GLAPIENTRY
   2505 save_Enable(GLenum cap)
   2506 {
   2507    GET_CURRENT_CONTEXT(ctx);
   2508    Node *n;
   2509    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2510    n = alloc_instruction(ctx, OPCODE_ENABLE, 1);
   2511    if (n) {
   2512       n[1].e = cap;
   2513    }
   2514    if (ctx->ExecuteFlag) {
   2515       CALL_Enable(ctx->Exec, (cap));
   2516    }
   2517 }
   2518 
   2519 
   2520 
   2521 static void GLAPIENTRY
   2522 save_EnableIndexed(GLuint index, GLenum cap)
   2523 {
   2524    GET_CURRENT_CONTEXT(ctx);
   2525    Node *n;
   2526    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2527    n = alloc_instruction(ctx, OPCODE_ENABLE_INDEXED, 2);
   2528    if (n) {
   2529       n[1].ui = index;
   2530       n[2].e = cap;
   2531    }
   2532    if (ctx->ExecuteFlag) {
   2533       CALL_Enablei(ctx->Exec, (index, cap));
   2534    }
   2535 }
   2536 
   2537 
   2538 
   2539 static void GLAPIENTRY
   2540 save_EvalMesh1(GLenum mode, GLint i1, GLint i2)
   2541 {
   2542    GET_CURRENT_CONTEXT(ctx);
   2543    Node *n;
   2544    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2545    n = alloc_instruction(ctx, OPCODE_EVALMESH1, 3);
   2546    if (n) {
   2547       n[1].e = mode;
   2548       n[2].i = i1;
   2549       n[3].i = i2;
   2550    }
   2551    if (ctx->ExecuteFlag) {
   2552       CALL_EvalMesh1(ctx->Exec, (mode, i1, i2));
   2553    }
   2554 }
   2555 
   2556 
   2557 static void GLAPIENTRY
   2558 save_EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
   2559 {
   2560    GET_CURRENT_CONTEXT(ctx);
   2561    Node *n;
   2562    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2563    n = alloc_instruction(ctx, OPCODE_EVALMESH2, 5);
   2564    if (n) {
   2565       n[1].e = mode;
   2566       n[2].i = i1;
   2567       n[3].i = i2;
   2568       n[4].i = j1;
   2569       n[5].i = j2;
   2570    }
   2571    if (ctx->ExecuteFlag) {
   2572       CALL_EvalMesh2(ctx->Exec, (mode, i1, i2, j1, j2));
   2573    }
   2574 }
   2575 
   2576 
   2577 
   2578 
   2579 static void GLAPIENTRY
   2580 save_Fogfv(GLenum pname, const GLfloat *params)
   2581 {
   2582    GET_CURRENT_CONTEXT(ctx);
   2583    Node *n;
   2584    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2585    n = alloc_instruction(ctx, OPCODE_FOG, 5);
   2586    if (n) {
   2587       n[1].e = pname;
   2588       n[2].f = params[0];
   2589       n[3].f = params[1];
   2590       n[4].f = params[2];
   2591       n[5].f = params[3];
   2592    }
   2593    if (ctx->ExecuteFlag) {
   2594       CALL_Fogfv(ctx->Exec, (pname, params));
   2595    }
   2596 }
   2597 
   2598 
   2599 static void GLAPIENTRY
   2600 save_Fogf(GLenum pname, GLfloat param)
   2601 {
   2602    GLfloat parray[4];
   2603    parray[0] = param;
   2604    parray[1] = parray[2] = parray[3] = 0.0F;
   2605    save_Fogfv(pname, parray);
   2606 }
   2607 
   2608 
   2609 static void GLAPIENTRY
   2610 save_Fogiv(GLenum pname, const GLint *params)
   2611 {
   2612    GLfloat p[4];
   2613    switch (pname) {
   2614    case GL_FOG_MODE:
   2615    case GL_FOG_DENSITY:
   2616    case GL_FOG_START:
   2617    case GL_FOG_END:
   2618    case GL_FOG_INDEX:
   2619       p[0] = (GLfloat) *params;
   2620       p[1] = 0.0f;
   2621       p[2] = 0.0f;
   2622       p[3] = 0.0f;
   2623       break;
   2624    case GL_FOG_COLOR:
   2625       p[0] = INT_TO_FLOAT(params[0]);
   2626       p[1] = INT_TO_FLOAT(params[1]);
   2627       p[2] = INT_TO_FLOAT(params[2]);
   2628       p[3] = INT_TO_FLOAT(params[3]);
   2629       break;
   2630    default:
   2631       /* Error will be caught later in gl_Fogfv */
   2632       ASSIGN_4V(p, 0.0F, 0.0F, 0.0F, 0.0F);
   2633    }
   2634    save_Fogfv(pname, p);
   2635 }
   2636 
   2637 
   2638 static void GLAPIENTRY
   2639 save_Fogi(GLenum pname, GLint param)
   2640 {
   2641    GLint parray[4];
   2642    parray[0] = param;
   2643    parray[1] = parray[2] = parray[3] = 0;
   2644    save_Fogiv(pname, parray);
   2645 }
   2646 
   2647 
   2648 static void GLAPIENTRY
   2649 save_FrontFace(GLenum mode)
   2650 {
   2651    GET_CURRENT_CONTEXT(ctx);
   2652    Node *n;
   2653    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2654    n = alloc_instruction(ctx, OPCODE_FRONT_FACE, 1);
   2655    if (n) {
   2656       n[1].e = mode;
   2657    }
   2658    if (ctx->ExecuteFlag) {
   2659       CALL_FrontFace(ctx->Exec, (mode));
   2660    }
   2661 }
   2662 
   2663 
   2664 static void GLAPIENTRY
   2665 save_Frustum(GLdouble left, GLdouble right,
   2666              GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval)
   2667 {
   2668    GET_CURRENT_CONTEXT(ctx);
   2669    Node *n;
   2670    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2671    n = alloc_instruction(ctx, OPCODE_FRUSTUM, 6);
   2672    if (n) {
   2673       n[1].f = (GLfloat) left;
   2674       n[2].f = (GLfloat) right;
   2675       n[3].f = (GLfloat) bottom;
   2676       n[4].f = (GLfloat) top;
   2677       n[5].f = (GLfloat) nearval;
   2678       n[6].f = (GLfloat) farval;
   2679    }
   2680    if (ctx->ExecuteFlag) {
   2681       CALL_Frustum(ctx->Exec, (left, right, bottom, top, nearval, farval));
   2682    }
   2683 }
   2684 
   2685 
   2686 static void GLAPIENTRY
   2687 save_Hint(GLenum target, GLenum mode)
   2688 {
   2689    GET_CURRENT_CONTEXT(ctx);
   2690    Node *n;
   2691    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2692    n = alloc_instruction(ctx, OPCODE_HINT, 2);
   2693    if (n) {
   2694       n[1].e = target;
   2695       n[2].e = mode;
   2696    }
   2697    if (ctx->ExecuteFlag) {
   2698       CALL_Hint(ctx->Exec, (target, mode));
   2699    }
   2700 }
   2701 
   2702 
   2703 static void GLAPIENTRY
   2704 save_IndexMask(GLuint mask)
   2705 {
   2706    GET_CURRENT_CONTEXT(ctx);
   2707    Node *n;
   2708    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2709    n = alloc_instruction(ctx, OPCODE_INDEX_MASK, 1);
   2710    if (n) {
   2711       n[1].ui = mask;
   2712    }
   2713    if (ctx->ExecuteFlag) {
   2714       CALL_IndexMask(ctx->Exec, (mask));
   2715    }
   2716 }
   2717 
   2718 
   2719 static void GLAPIENTRY
   2720 save_InitNames(void)
   2721 {
   2722    GET_CURRENT_CONTEXT(ctx);
   2723    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2724    (void) alloc_instruction(ctx, OPCODE_INIT_NAMES, 0);
   2725    if (ctx->ExecuteFlag) {
   2726       CALL_InitNames(ctx->Exec, ());
   2727    }
   2728 }
   2729 
   2730 
   2731 static void GLAPIENTRY
   2732 save_Lightfv(GLenum light, GLenum pname, const GLfloat *params)
   2733 {
   2734    GET_CURRENT_CONTEXT(ctx);
   2735    Node *n;
   2736    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2737    n = alloc_instruction(ctx, OPCODE_LIGHT, 6);
   2738    if (n) {
   2739       GLint i, nParams;
   2740       n[1].e = light;
   2741       n[2].e = pname;
   2742       switch (pname) {
   2743       case GL_AMBIENT:
   2744          nParams = 4;
   2745          break;
   2746       case GL_DIFFUSE:
   2747          nParams = 4;
   2748          break;
   2749       case GL_SPECULAR:
   2750          nParams = 4;
   2751          break;
   2752       case GL_POSITION:
   2753          nParams = 4;
   2754          break;
   2755       case GL_SPOT_DIRECTION:
   2756          nParams = 3;
   2757          break;
   2758       case GL_SPOT_EXPONENT:
   2759          nParams = 1;
   2760          break;
   2761       case GL_SPOT_CUTOFF:
   2762          nParams = 1;
   2763          break;
   2764       case GL_CONSTANT_ATTENUATION:
   2765          nParams = 1;
   2766          break;
   2767       case GL_LINEAR_ATTENUATION:
   2768          nParams = 1;
   2769          break;
   2770       case GL_QUADRATIC_ATTENUATION:
   2771          nParams = 1;
   2772          break;
   2773       default:
   2774          nParams = 0;
   2775       }
   2776       for (i = 0; i < nParams; i++) {
   2777          n[3 + i].f = params[i];
   2778       }
   2779    }
   2780    if (ctx->ExecuteFlag) {
   2781       CALL_Lightfv(ctx->Exec, (light, pname, params));
   2782    }
   2783 }
   2784 
   2785 
   2786 static void GLAPIENTRY
   2787 save_Lightf(GLenum light, GLenum pname, GLfloat param)
   2788 {
   2789    GLfloat parray[4];
   2790    parray[0] = param;
   2791    parray[1] = parray[2] = parray[3] = 0.0F;
   2792    save_Lightfv(light, pname, parray);
   2793 }
   2794 
   2795 
   2796 static void GLAPIENTRY
   2797 save_Lightiv(GLenum light, GLenum pname, const GLint *params)
   2798 {
   2799    GLfloat fparam[4];
   2800    switch (pname) {
   2801    case GL_AMBIENT:
   2802    case GL_DIFFUSE:
   2803    case GL_SPECULAR:
   2804       fparam[0] = INT_TO_FLOAT(params[0]);
   2805       fparam[1] = INT_TO_FLOAT(params[1]);
   2806       fparam[2] = INT_TO_FLOAT(params[2]);
   2807       fparam[3] = INT_TO_FLOAT(params[3]);
   2808       break;
   2809    case GL_POSITION:
   2810       fparam[0] = (GLfloat) params[0];
   2811       fparam[1] = (GLfloat) params[1];
   2812       fparam[2] = (GLfloat) params[2];
   2813       fparam[3] = (GLfloat) params[3];
   2814       break;
   2815    case GL_SPOT_DIRECTION:
   2816       fparam[0] = (GLfloat) params[0];
   2817       fparam[1] = (GLfloat) params[1];
   2818       fparam[2] = (GLfloat) params[2];
   2819       break;
   2820    case GL_SPOT_EXPONENT:
   2821    case GL_SPOT_CUTOFF:
   2822    case GL_CONSTANT_ATTENUATION:
   2823    case GL_LINEAR_ATTENUATION:
   2824    case GL_QUADRATIC_ATTENUATION:
   2825       fparam[0] = (GLfloat) params[0];
   2826       break;
   2827    default:
   2828       /* error will be caught later in gl_Lightfv */
   2829       ;
   2830    }
   2831    save_Lightfv(light, pname, fparam);
   2832 }
   2833 
   2834 
   2835 static void GLAPIENTRY
   2836 save_Lighti(GLenum light, GLenum pname, GLint param)
   2837 {
   2838    GLint parray[4];
   2839    parray[0] = param;
   2840    parray[1] = parray[2] = parray[3] = 0;
   2841    save_Lightiv(light, pname, parray);
   2842 }
   2843 
   2844 
   2845 static void GLAPIENTRY
   2846 save_LightModelfv(GLenum pname, const GLfloat *params)
   2847 {
   2848    GET_CURRENT_CONTEXT(ctx);
   2849    Node *n;
   2850    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2851    n = alloc_instruction(ctx, OPCODE_LIGHT_MODEL, 5);
   2852    if (n) {
   2853       n[1].e = pname;
   2854       n[2].f = params[0];
   2855       n[3].f = params[1];
   2856       n[4].f = params[2];
   2857       n[5].f = params[3];
   2858    }
   2859    if (ctx->ExecuteFlag) {
   2860       CALL_LightModelfv(ctx->Exec, (pname, params));
   2861    }
   2862 }
   2863 
   2864 
   2865 static void GLAPIENTRY
   2866 save_LightModelf(GLenum pname, GLfloat param)
   2867 {
   2868    GLfloat parray[4];
   2869    parray[0] = param;
   2870    parray[1] = parray[2] = parray[3] = 0.0F;
   2871    save_LightModelfv(pname, parray);
   2872 }
   2873 
   2874 
   2875 static void GLAPIENTRY
   2876 save_LightModeliv(GLenum pname, const GLint *params)
   2877 {
   2878    GLfloat fparam[4];
   2879    switch (pname) {
   2880    case GL_LIGHT_MODEL_AMBIENT:
   2881       fparam[0] = INT_TO_FLOAT(params[0]);
   2882       fparam[1] = INT_TO_FLOAT(params[1]);
   2883       fparam[2] = INT_TO_FLOAT(params[2]);
   2884       fparam[3] = INT_TO_FLOAT(params[3]);
   2885       break;
   2886    case GL_LIGHT_MODEL_LOCAL_VIEWER:
   2887    case GL_LIGHT_MODEL_TWO_SIDE:
   2888    case GL_LIGHT_MODEL_COLOR_CONTROL:
   2889       fparam[0] = (GLfloat) params[0];
   2890       fparam[1] = 0.0F;
   2891       fparam[2] = 0.0F;
   2892       fparam[3] = 0.0F;
   2893       break;
   2894    default:
   2895       /* Error will be caught later in gl_LightModelfv */
   2896       ASSIGN_4V(fparam, 0.0F, 0.0F, 0.0F, 0.0F);
   2897    }
   2898    save_LightModelfv(pname, fparam);
   2899 }
   2900 
   2901 
   2902 static void GLAPIENTRY
   2903 save_LightModeli(GLenum pname, GLint param)
   2904 {
   2905    GLint parray[4];
   2906    parray[0] = param;
   2907    parray[1] = parray[2] = parray[3] = 0;
   2908    save_LightModeliv(pname, parray);
   2909 }
   2910 
   2911 
   2912 static void GLAPIENTRY
   2913 save_LineStipple(GLint factor, GLushort pattern)
   2914 {
   2915    GET_CURRENT_CONTEXT(ctx);
   2916    Node *n;
   2917    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2918    n = alloc_instruction(ctx, OPCODE_LINE_STIPPLE, 2);
   2919    if (n) {
   2920       n[1].i = factor;
   2921       n[2].us = pattern;
   2922    }
   2923    if (ctx->ExecuteFlag) {
   2924       CALL_LineStipple(ctx->Exec, (factor, pattern));
   2925    }
   2926 }
   2927 
   2928 
   2929 static void GLAPIENTRY
   2930 save_LineWidth(GLfloat width)
   2931 {
   2932    GET_CURRENT_CONTEXT(ctx);
   2933    Node *n;
   2934    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2935    n = alloc_instruction(ctx, OPCODE_LINE_WIDTH, 1);
   2936    if (n) {
   2937       n[1].f = width;
   2938    }
   2939    if (ctx->ExecuteFlag) {
   2940       CALL_LineWidth(ctx->Exec, (width));
   2941    }
   2942 }
   2943 
   2944 
   2945 static void GLAPIENTRY
   2946 save_ListBase(GLuint base)
   2947 {
   2948    GET_CURRENT_CONTEXT(ctx);
   2949    Node *n;
   2950    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2951    n = alloc_instruction(ctx, OPCODE_LIST_BASE, 1);
   2952    if (n) {
   2953       n[1].ui = base;
   2954    }
   2955    if (ctx->ExecuteFlag) {
   2956       CALL_ListBase(ctx->Exec, (base));
   2957    }
   2958 }
   2959 
   2960 
   2961 static void GLAPIENTRY
   2962 save_LoadIdentity(void)
   2963 {
   2964    GET_CURRENT_CONTEXT(ctx);
   2965    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2966    (void) alloc_instruction(ctx, OPCODE_LOAD_IDENTITY, 0);
   2967    if (ctx->ExecuteFlag) {
   2968       CALL_LoadIdentity(ctx->Exec, ());
   2969    }
   2970 }
   2971 
   2972 
   2973 static void GLAPIENTRY
   2974 save_LoadMatrixf(const GLfloat * m)
   2975 {
   2976    GET_CURRENT_CONTEXT(ctx);
   2977    Node *n;
   2978    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   2979    n = alloc_instruction(ctx, OPCODE_LOAD_MATRIX, 16);
   2980    if (n) {
   2981       GLuint i;
   2982       for (i = 0; i < 16; i++) {
   2983          n[1 + i].f = m[i];
   2984       }
   2985    }
   2986    if (ctx->ExecuteFlag) {
   2987       CALL_LoadMatrixf(ctx->Exec, (m));
   2988    }
   2989 }
   2990 
   2991 
   2992 static void GLAPIENTRY
   2993 save_LoadMatrixd(const GLdouble * m)
   2994 {
   2995    GLfloat f[16];
   2996    GLint i;
   2997    for (i = 0; i < 16; i++) {
   2998       f[i] = (GLfloat) m[i];
   2999    }
   3000    save_LoadMatrixf(f);
   3001 }
   3002 
   3003 
   3004 static void GLAPIENTRY
   3005 save_LoadName(GLuint name)
   3006 {
   3007    GET_CURRENT_CONTEXT(ctx);
   3008    Node *n;
   3009    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3010    n = alloc_instruction(ctx, OPCODE_LOAD_NAME, 1);
   3011    if (n) {
   3012       n[1].ui = name;
   3013    }
   3014    if (ctx->ExecuteFlag) {
   3015       CALL_LoadName(ctx->Exec, (name));
   3016    }
   3017 }
   3018 
   3019 
   3020 static void GLAPIENTRY
   3021 save_LogicOp(GLenum opcode)
   3022 {
   3023    GET_CURRENT_CONTEXT(ctx);
   3024    Node *n;
   3025    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3026    n = alloc_instruction(ctx, OPCODE_LOGIC_OP, 1);
   3027    if (n) {
   3028       n[1].e = opcode;
   3029    }
   3030    if (ctx->ExecuteFlag) {
   3031       CALL_LogicOp(ctx->Exec, (opcode));
   3032    }
   3033 }
   3034 
   3035 
   3036 static void GLAPIENTRY
   3037 save_Map1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride,
   3038            GLint order, const GLdouble * points)
   3039 {
   3040    GET_CURRENT_CONTEXT(ctx);
   3041    Node *n;
   3042    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3043    n = alloc_instruction(ctx, OPCODE_MAP1, 5 + POINTER_DWORDS);
   3044    if (n) {
   3045       GLfloat *pnts = _mesa_copy_map_points1d(target, stride, order, points);
   3046       n[1].e = target;
   3047       n[2].f = (GLfloat) u1;
   3048       n[3].f = (GLfloat) u2;
   3049       n[4].i = _mesa_evaluator_components(target);      /* stride */
   3050       n[5].i = order;
   3051       save_pointer(&n[6], pnts);
   3052    }
   3053    if (ctx->ExecuteFlag) {
   3054       CALL_Map1d(ctx->Exec, (target, u1, u2, stride, order, points));
   3055    }
   3056 }
   3057 
   3058 static void GLAPIENTRY
   3059 save_Map1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride,
   3060            GLint order, const GLfloat * points)
   3061 {
   3062    GET_CURRENT_CONTEXT(ctx);
   3063    Node *n;
   3064    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3065    n = alloc_instruction(ctx, OPCODE_MAP1, 5 + POINTER_DWORDS);
   3066    if (n) {
   3067       GLfloat *pnts = _mesa_copy_map_points1f(target, stride, order, points);
   3068       n[1].e = target;
   3069       n[2].f = u1;
   3070       n[3].f = u2;
   3071       n[4].i = _mesa_evaluator_components(target);      /* stride */
   3072       n[5].i = order;
   3073       save_pointer(&n[6], pnts);
   3074    }
   3075    if (ctx->ExecuteFlag) {
   3076       CALL_Map1f(ctx->Exec, (target, u1, u2, stride, order, points));
   3077    }
   3078 }
   3079 
   3080 
   3081 static void GLAPIENTRY
   3082 save_Map2d(GLenum target,
   3083            GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
   3084            GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
   3085            const GLdouble * points)
   3086 {
   3087    GET_CURRENT_CONTEXT(ctx);
   3088    Node *n;
   3089    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3090    n = alloc_instruction(ctx, OPCODE_MAP2, 9 + POINTER_DWORDS);
   3091    if (n) {
   3092       GLfloat *pnts = _mesa_copy_map_points2d(target, ustride, uorder,
   3093                                               vstride, vorder, points);
   3094       n[1].e = target;
   3095       n[2].f = (GLfloat) u1;
   3096       n[3].f = (GLfloat) u2;
   3097       n[4].f = (GLfloat) v1;
   3098       n[5].f = (GLfloat) v2;
   3099       /* XXX verify these strides are correct */
   3100       n[6].i = _mesa_evaluator_components(target) * vorder;     /*ustride */
   3101       n[7].i = _mesa_evaluator_components(target);      /*vstride */
   3102       n[8].i = uorder;
   3103       n[9].i = vorder;
   3104       save_pointer(&n[10], pnts);
   3105    }
   3106    if (ctx->ExecuteFlag) {
   3107       CALL_Map2d(ctx->Exec, (target,
   3108                              u1, u2, ustride, uorder,
   3109                              v1, v2, vstride, vorder, points));
   3110    }
   3111 }
   3112 
   3113 
   3114 static void GLAPIENTRY
   3115 save_Map2f(GLenum target,
   3116            GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
   3117            GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
   3118            const GLfloat * points)
   3119 {
   3120    GET_CURRENT_CONTEXT(ctx);
   3121    Node *n;
   3122    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3123    n = alloc_instruction(ctx, OPCODE_MAP2, 9 + POINTER_DWORDS);
   3124    if (n) {
   3125       GLfloat *pnts = _mesa_copy_map_points2f(target, ustride, uorder,
   3126                                               vstride, vorder, points);
   3127       n[1].e = target;
   3128       n[2].f = u1;
   3129       n[3].f = u2;
   3130       n[4].f = v1;
   3131       n[5].f = v2;
   3132       /* XXX verify these strides are correct */
   3133       n[6].i = _mesa_evaluator_components(target) * vorder;     /*ustride */
   3134       n[7].i = _mesa_evaluator_components(target);      /*vstride */
   3135       n[8].i = uorder;
   3136       n[9].i = vorder;
   3137       save_pointer(&n[10], pnts);
   3138    }
   3139    if (ctx->ExecuteFlag) {
   3140       CALL_Map2f(ctx->Exec, (target, u1, u2, ustride, uorder,
   3141                              v1, v2, vstride, vorder, points));
   3142    }
   3143 }
   3144 
   3145 
   3146 static void GLAPIENTRY
   3147 save_MapGrid1f(GLint un, GLfloat u1, GLfloat u2)
   3148 {
   3149    GET_CURRENT_CONTEXT(ctx);
   3150    Node *n;
   3151    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3152    n = alloc_instruction(ctx, OPCODE_MAPGRID1, 3);
   3153    if (n) {
   3154       n[1].i = un;
   3155       n[2].f = u1;
   3156       n[3].f = u2;
   3157    }
   3158    if (ctx->ExecuteFlag) {
   3159       CALL_MapGrid1f(ctx->Exec, (un, u1, u2));
   3160    }
   3161 }
   3162 
   3163 
   3164 static void GLAPIENTRY
   3165 save_MapGrid1d(GLint un, GLdouble u1, GLdouble u2)
   3166 {
   3167    save_MapGrid1f(un, (GLfloat) u1, (GLfloat) u2);
   3168 }
   3169 
   3170 
   3171 static void GLAPIENTRY
   3172 save_MapGrid2f(GLint un, GLfloat u1, GLfloat u2,
   3173                GLint vn, GLfloat v1, GLfloat v2)
   3174 {
   3175    GET_CURRENT_CONTEXT(ctx);
   3176    Node *n;
   3177    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3178    n = alloc_instruction(ctx, OPCODE_MAPGRID2, 6);
   3179    if (n) {
   3180       n[1].i = un;
   3181       n[2].f = u1;
   3182       n[3].f = u2;
   3183       n[4].i = vn;
   3184       n[5].f = v1;
   3185       n[6].f = v2;
   3186    }
   3187    if (ctx->ExecuteFlag) {
   3188       CALL_MapGrid2f(ctx->Exec, (un, u1, u2, vn, v1, v2));
   3189    }
   3190 }
   3191 
   3192 
   3193 
   3194 static void GLAPIENTRY
   3195 save_MapGrid2d(GLint un, GLdouble u1, GLdouble u2,
   3196                GLint vn, GLdouble v1, GLdouble v2)
   3197 {
   3198    save_MapGrid2f(un, (GLfloat) u1, (GLfloat) u2,
   3199                   vn, (GLfloat) v1, (GLfloat) v2);
   3200 }
   3201 
   3202 
   3203 static void GLAPIENTRY
   3204 save_MatrixMode(GLenum mode)
   3205 {
   3206    GET_CURRENT_CONTEXT(ctx);
   3207    Node *n;
   3208    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3209    n = alloc_instruction(ctx, OPCODE_MATRIX_MODE, 1);
   3210    if (n) {
   3211       n[1].e = mode;
   3212    }
   3213    if (ctx->ExecuteFlag) {
   3214       CALL_MatrixMode(ctx->Exec, (mode));
   3215    }
   3216 }
   3217 
   3218 
   3219 static void GLAPIENTRY
   3220 save_MultMatrixf(const GLfloat * m)
   3221 {
   3222    GET_CURRENT_CONTEXT(ctx);
   3223    Node *n;
   3224    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3225    n = alloc_instruction(ctx, OPCODE_MULT_MATRIX, 16);
   3226    if (n) {
   3227       GLuint i;
   3228       for (i = 0; i < 16; i++) {
   3229          n[1 + i].f = m[i];
   3230       }
   3231    }
   3232    if (ctx->ExecuteFlag) {
   3233       CALL_MultMatrixf(ctx->Exec, (m));
   3234    }
   3235 }
   3236 
   3237 
   3238 static void GLAPIENTRY
   3239 save_MultMatrixd(const GLdouble * m)
   3240 {
   3241    GLfloat f[16];
   3242    GLint i;
   3243    for (i = 0; i < 16; i++) {
   3244       f[i] = (GLfloat) m[i];
   3245    }
   3246    save_MultMatrixf(f);
   3247 }
   3248 
   3249 
   3250 static void GLAPIENTRY
   3251 save_NewList(GLuint name, GLenum mode)
   3252 {
   3253    GET_CURRENT_CONTEXT(ctx);
   3254    /* It's an error to call this function while building a display list */
   3255    _mesa_error(ctx, GL_INVALID_OPERATION, "glNewList");
   3256    (void) name;
   3257    (void) mode;
   3258 }
   3259 
   3260 
   3261 
   3262 static void GLAPIENTRY
   3263 save_Ortho(GLdouble left, GLdouble right,
   3264            GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval)
   3265 {
   3266    GET_CURRENT_CONTEXT(ctx);
   3267    Node *n;
   3268    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3269    n = alloc_instruction(ctx, OPCODE_ORTHO, 6);
   3270    if (n) {
   3271       n[1].f = (GLfloat) left;
   3272       n[2].f = (GLfloat) right;
   3273       n[3].f = (GLfloat) bottom;
   3274       n[4].f = (GLfloat) top;
   3275       n[5].f = (GLfloat) nearval;
   3276       n[6].f = (GLfloat) farval;
   3277    }
   3278    if (ctx->ExecuteFlag) {
   3279       CALL_Ortho(ctx->Exec, (left, right, bottom, top, nearval, farval));
   3280    }
   3281 }
   3282 
   3283 
   3284 static void GLAPIENTRY
   3285 save_PixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
   3286 {
   3287    GET_CURRENT_CONTEXT(ctx);
   3288    Node *n;
   3289    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3290    n = alloc_instruction(ctx, OPCODE_PIXEL_MAP, 2 + POINTER_DWORDS);
   3291    if (n) {
   3292       n[1].e = map;
   3293       n[2].i = mapsize;
   3294       save_pointer(&n[3], memdup(values, mapsize * sizeof(GLfloat)));
   3295    }
   3296    if (ctx->ExecuteFlag) {
   3297       CALL_PixelMapfv(ctx->Exec, (map, mapsize, values));
   3298    }
   3299 }
   3300 
   3301 
   3302 static void GLAPIENTRY
   3303 save_PixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
   3304 {
   3305    GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
   3306    GLint i;
   3307    if (map == GL_PIXEL_MAP_I_TO_I || map == GL_PIXEL_MAP_S_TO_S) {
   3308       for (i = 0; i < mapsize; i++) {
   3309          fvalues[i] = (GLfloat) values[i];
   3310       }
   3311    }
   3312    else {
   3313       for (i = 0; i < mapsize; i++) {
   3314          fvalues[i] = UINT_TO_FLOAT(values[i]);
   3315       }
   3316    }
   3317    save_PixelMapfv(map, mapsize, fvalues);
   3318 }
   3319 
   3320 
   3321 static void GLAPIENTRY
   3322 save_PixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
   3323 {
   3324    GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
   3325    GLint i;
   3326    if (map == GL_PIXEL_MAP_I_TO_I || map == GL_PIXEL_MAP_S_TO_S) {
   3327       for (i = 0; i < mapsize; i++) {
   3328          fvalues[i] = (GLfloat) values[i];
   3329       }
   3330    }
   3331    else {
   3332       for (i = 0; i < mapsize; i++) {
   3333          fvalues[i] = USHORT_TO_FLOAT(values[i]);
   3334       }
   3335    }
   3336    save_PixelMapfv(map, mapsize, fvalues);
   3337 }
   3338 
   3339 
   3340 static void GLAPIENTRY
   3341 save_PixelTransferf(GLenum pname, GLfloat param)
   3342 {
   3343    GET_CURRENT_CONTEXT(ctx);
   3344    Node *n;
   3345    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3346    n = alloc_instruction(ctx, OPCODE_PIXEL_TRANSFER, 2);
   3347    if (n) {
   3348       n[1].e = pname;
   3349       n[2].f = param;
   3350    }
   3351    if (ctx->ExecuteFlag) {
   3352       CALL_PixelTransferf(ctx->Exec, (pname, param));
   3353    }
   3354 }
   3355 
   3356 
   3357 static void GLAPIENTRY
   3358 save_PixelTransferi(GLenum pname, GLint param)
   3359 {
   3360    save_PixelTransferf(pname, (GLfloat) param);
   3361 }
   3362 
   3363 
   3364 static void GLAPIENTRY
   3365 save_PixelZoom(GLfloat xfactor, GLfloat yfactor)
   3366 {
   3367    GET_CURRENT_CONTEXT(ctx);
   3368    Node *n;
   3369    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3370    n = alloc_instruction(ctx, OPCODE_PIXEL_ZOOM, 2);
   3371    if (n) {
   3372       n[1].f = xfactor;
   3373       n[2].f = yfactor;
   3374    }
   3375    if (ctx->ExecuteFlag) {
   3376       CALL_PixelZoom(ctx->Exec, (xfactor, yfactor));
   3377    }
   3378 }
   3379 
   3380 
   3381 static void GLAPIENTRY
   3382 save_PointParameterfvEXT(GLenum pname, const GLfloat *params)
   3383 {
   3384    GET_CURRENT_CONTEXT(ctx);
   3385    Node *n;
   3386    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3387    n = alloc_instruction(ctx, OPCODE_POINT_PARAMETERS, 4);
   3388    if (n) {
   3389       n[1].e = pname;
   3390       n[2].f = params[0];
   3391       n[3].f = params[1];
   3392       n[4].f = params[2];
   3393    }
   3394    if (ctx->ExecuteFlag) {
   3395       CALL_PointParameterfv(ctx->Exec, (pname, params));
   3396    }
   3397 }
   3398 
   3399 
   3400 static void GLAPIENTRY
   3401 save_PointParameterfEXT(GLenum pname, GLfloat param)
   3402 {
   3403    GLfloat parray[3];
   3404    parray[0] = param;
   3405    parray[1] = parray[2] = 0.0F;
   3406    save_PointParameterfvEXT(pname, parray);
   3407 }
   3408 
   3409 static void GLAPIENTRY
   3410 save_PointParameteriNV(GLenum pname, GLint param)
   3411 {
   3412    GLfloat parray[3];
   3413    parray[0] = (GLfloat) param;
   3414    parray[1] = parray[2] = 0.0F;
   3415    save_PointParameterfvEXT(pname, parray);
   3416 }
   3417 
   3418 static void GLAPIENTRY
   3419 save_PointParameterivNV(GLenum pname, const GLint * param)
   3420 {
   3421    GLfloat parray[3];
   3422    parray[0] = (GLfloat) param[0];
   3423    parray[1] = parray[2] = 0.0F;
   3424    save_PointParameterfvEXT(pname, parray);
   3425 }
   3426 
   3427 
   3428 static void GLAPIENTRY
   3429 save_PointSize(GLfloat size)
   3430 {
   3431    GET_CURRENT_CONTEXT(ctx);
   3432    Node *n;
   3433    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3434    n = alloc_instruction(ctx, OPCODE_POINT_SIZE, 1);
   3435    if (n) {
   3436       n[1].f = size;
   3437    }
   3438    if (ctx->ExecuteFlag) {
   3439       CALL_PointSize(ctx->Exec, (size));
   3440    }
   3441 }
   3442 
   3443 
   3444 static void GLAPIENTRY
   3445 save_PolygonMode(GLenum face, GLenum mode)
   3446 {
   3447    GET_CURRENT_CONTEXT(ctx);
   3448    Node *n;
   3449    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3450    n = alloc_instruction(ctx, OPCODE_POLYGON_MODE, 2);
   3451    if (n) {
   3452       n[1].e = face;
   3453       n[2].e = mode;
   3454    }
   3455    if (ctx->ExecuteFlag) {
   3456       CALL_PolygonMode(ctx->Exec, (face, mode));
   3457    }
   3458 }
   3459 
   3460 
   3461 static void GLAPIENTRY
   3462 save_PolygonStipple(const GLubyte * pattern)
   3463 {
   3464    GET_CURRENT_CONTEXT(ctx);
   3465    Node *n;
   3466 
   3467    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3468 
   3469    n = alloc_instruction(ctx, OPCODE_POLYGON_STIPPLE, POINTER_DWORDS);
   3470    if (n) {
   3471       save_pointer(&n[1],
   3472                    unpack_image(ctx, 2, 32, 32, 1, GL_COLOR_INDEX, GL_BITMAP,
   3473                                 pattern, &ctx->Unpack));
   3474    }
   3475    if (ctx->ExecuteFlag) {
   3476       CALL_PolygonStipple(ctx->Exec, ((GLubyte *) pattern));
   3477    }
   3478 }
   3479 
   3480 
   3481 static void GLAPIENTRY
   3482 save_PolygonOffset(GLfloat factor, GLfloat units)
   3483 {
   3484    GET_CURRENT_CONTEXT(ctx);
   3485    Node *n;
   3486    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3487    n = alloc_instruction(ctx, OPCODE_POLYGON_OFFSET, 2);
   3488    if (n) {
   3489       n[1].f = factor;
   3490       n[2].f = units;
   3491    }
   3492    if (ctx->ExecuteFlag) {
   3493       CALL_PolygonOffset(ctx->Exec, (factor, units));
   3494    }
   3495 }
   3496 
   3497 
   3498 static void GLAPIENTRY
   3499 save_PolygonOffsetEXT(GLfloat factor, GLfloat bias)
   3500 {
   3501    GET_CURRENT_CONTEXT(ctx);
   3502    /* XXX mult by DepthMaxF here??? */
   3503    save_PolygonOffset(factor, ctx->DrawBuffer->_DepthMaxF * bias);
   3504 }
   3505 
   3506 static void GLAPIENTRY
   3507 save_PolygonOffsetClampEXT(GLfloat factor, GLfloat units, GLfloat clamp)
   3508 {
   3509    GET_CURRENT_CONTEXT(ctx);
   3510    Node *n;
   3511    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3512    n = alloc_instruction(ctx, OPCODE_POLYGON_OFFSET_CLAMP, 3);
   3513    if (n) {
   3514       n[1].f = factor;
   3515       n[2].f = units;
   3516       n[3].f = clamp;
   3517    }
   3518    if (ctx->ExecuteFlag) {
   3519       CALL_PolygonOffsetClampEXT(ctx->Exec, (factor, units, clamp));
   3520    }
   3521 }
   3522 
   3523 static void GLAPIENTRY
   3524 save_PopAttrib(void)
   3525 {
   3526    GET_CURRENT_CONTEXT(ctx);
   3527    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3528    (void) alloc_instruction(ctx, OPCODE_POP_ATTRIB, 0);
   3529    if (ctx->ExecuteFlag) {
   3530       CALL_PopAttrib(ctx->Exec, ());
   3531    }
   3532 }
   3533 
   3534 
   3535 static void GLAPIENTRY
   3536 save_PopMatrix(void)
   3537 {
   3538    GET_CURRENT_CONTEXT(ctx);
   3539    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3540    (void) alloc_instruction(ctx, OPCODE_POP_MATRIX, 0);
   3541    if (ctx->ExecuteFlag) {
   3542       CALL_PopMatrix(ctx->Exec, ());
   3543    }
   3544 }
   3545 
   3546 
   3547 static void GLAPIENTRY
   3548 save_PopName(void)
   3549 {
   3550    GET_CURRENT_CONTEXT(ctx);
   3551    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3552    (void) alloc_instruction(ctx, OPCODE_POP_NAME, 0);
   3553    if (ctx->ExecuteFlag) {
   3554       CALL_PopName(ctx->Exec, ());
   3555    }
   3556 }
   3557 
   3558 
   3559 static void GLAPIENTRY
   3560 save_PrioritizeTextures(GLsizei num, const GLuint * textures,
   3561                         const GLclampf * priorities)
   3562 {
   3563    GET_CURRENT_CONTEXT(ctx);
   3564    GLint i;
   3565    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3566 
   3567    for (i = 0; i < num; i++) {
   3568       Node *n;
   3569       n = alloc_instruction(ctx, OPCODE_PRIORITIZE_TEXTURE, 2);
   3570       if (n) {
   3571          n[1].ui = textures[i];
   3572          n[2].f = priorities[i];
   3573       }
   3574    }
   3575    if (ctx->ExecuteFlag) {
   3576       CALL_PrioritizeTextures(ctx->Exec, (num, textures, priorities));
   3577    }
   3578 }
   3579 
   3580 
   3581 static void GLAPIENTRY
   3582 save_PushAttrib(GLbitfield mask)
   3583 {
   3584    GET_CURRENT_CONTEXT(ctx);
   3585    Node *n;
   3586    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3587    n = alloc_instruction(ctx, OPCODE_PUSH_ATTRIB, 1);
   3588    if (n) {
   3589       n[1].bf = mask;
   3590    }
   3591    if (ctx->ExecuteFlag) {
   3592       CALL_PushAttrib(ctx->Exec, (mask));
   3593    }
   3594 }
   3595 
   3596 
   3597 static void GLAPIENTRY
   3598 save_PushMatrix(void)
   3599 {
   3600    GET_CURRENT_CONTEXT(ctx);
   3601    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3602    (void) alloc_instruction(ctx, OPCODE_PUSH_MATRIX, 0);
   3603    if (ctx->ExecuteFlag) {
   3604       CALL_PushMatrix(ctx->Exec, ());
   3605    }
   3606 }
   3607 
   3608 
   3609 static void GLAPIENTRY
   3610 save_PushName(GLuint name)
   3611 {
   3612    GET_CURRENT_CONTEXT(ctx);
   3613    Node *n;
   3614    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3615    n = alloc_instruction(ctx, OPCODE_PUSH_NAME, 1);
   3616    if (n) {
   3617       n[1].ui = name;
   3618    }
   3619    if (ctx->ExecuteFlag) {
   3620       CALL_PushName(ctx->Exec, (name));
   3621    }
   3622 }
   3623 
   3624 
   3625 static void GLAPIENTRY
   3626 save_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
   3627 {
   3628    GET_CURRENT_CONTEXT(ctx);
   3629    Node *n;
   3630    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3631    n = alloc_instruction(ctx, OPCODE_RASTER_POS, 4);
   3632    if (n) {
   3633       n[1].f = x;
   3634       n[2].f = y;
   3635       n[3].f = z;
   3636       n[4].f = w;
   3637    }
   3638    if (ctx->ExecuteFlag) {
   3639       CALL_RasterPos4f(ctx->Exec, (x, y, z, w));
   3640    }
   3641 }
   3642 
   3643 static void GLAPIENTRY
   3644 save_RasterPos2d(GLdouble x, GLdouble y)
   3645 {
   3646    save_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
   3647 }
   3648 
   3649 static void GLAPIENTRY
   3650 save_RasterPos2f(GLfloat x, GLfloat y)
   3651 {
   3652    save_RasterPos4f(x, y, 0.0F, 1.0F);
   3653 }
   3654 
   3655 static void GLAPIENTRY
   3656 save_RasterPos2i(GLint x, GLint y)
   3657 {
   3658    save_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
   3659 }
   3660 
   3661 static void GLAPIENTRY
   3662 save_RasterPos2s(GLshort x, GLshort y)
   3663 {
   3664    save_RasterPos4f(x, y, 0.0F, 1.0F);
   3665 }
   3666 
   3667 static void GLAPIENTRY
   3668 save_RasterPos3d(GLdouble x, GLdouble y, GLdouble z)
   3669 {
   3670    save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
   3671 }
   3672 
   3673 static void GLAPIENTRY
   3674 save_RasterPos3f(GLfloat x, GLfloat y, GLfloat z)
   3675 {
   3676    save_RasterPos4f(x, y, z, 1.0F);
   3677 }
   3678 
   3679 static void GLAPIENTRY
   3680 save_RasterPos3i(GLint x, GLint y, GLint z)
   3681 {
   3682    save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
   3683 }
   3684 
   3685 static void GLAPIENTRY
   3686 save_RasterPos3s(GLshort x, GLshort y, GLshort z)
   3687 {
   3688    save_RasterPos4f(x, y, z, 1.0F);
   3689 }
   3690 
   3691 static void GLAPIENTRY
   3692 save_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
   3693 {
   3694    save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
   3695 }
   3696 
   3697 static void GLAPIENTRY
   3698 save_RasterPos4i(GLint x, GLint y, GLint z, GLint w)
   3699 {
   3700    save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
   3701 }
   3702 
   3703 static void GLAPIENTRY
   3704 save_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
   3705 {
   3706    save_RasterPos4f(x, y, z, w);
   3707 }
   3708 
   3709 static void GLAPIENTRY
   3710 save_RasterPos2dv(const GLdouble * v)
   3711 {
   3712    save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
   3713 }
   3714 
   3715 static void GLAPIENTRY
   3716 save_RasterPos2fv(const GLfloat * v)
   3717 {
   3718    save_RasterPos4f(v[0], v[1], 0.0F, 1.0F);
   3719 }
   3720 
   3721 static void GLAPIENTRY
   3722 save_RasterPos2iv(const GLint * v)
   3723 {
   3724    save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
   3725 }
   3726 
   3727 static void GLAPIENTRY
   3728 save_RasterPos2sv(const GLshort * v)
   3729 {
   3730    save_RasterPos4f(v[0], v[1], 0.0F, 1.0F);
   3731 }
   3732 
   3733 static void GLAPIENTRY
   3734 save_RasterPos3dv(const GLdouble * v)
   3735 {
   3736    save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
   3737 }
   3738 
   3739 static void GLAPIENTRY
   3740 save_RasterPos3fv(const GLfloat * v)
   3741 {
   3742    save_RasterPos4f(v[0], v[1], v[2], 1.0F);
   3743 }
   3744 
   3745 static void GLAPIENTRY
   3746 save_RasterPos3iv(const GLint * v)
   3747 {
   3748    save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
   3749 }
   3750 
   3751 static void GLAPIENTRY
   3752 save_RasterPos3sv(const GLshort * v)
   3753 {
   3754    save_RasterPos4f(v[0], v[1], v[2], 1.0F);
   3755 }
   3756 
   3757 static void GLAPIENTRY
   3758 save_RasterPos4dv(const GLdouble * v)
   3759 {
   3760    save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1],
   3761                     (GLfloat) v[2], (GLfloat) v[3]);
   3762 }
   3763 
   3764 static void GLAPIENTRY
   3765 save_RasterPos4fv(const GLfloat * v)
   3766 {
   3767    save_RasterPos4f(v[0], v[1], v[2], v[3]);
   3768 }
   3769 
   3770 static void GLAPIENTRY
   3771 save_RasterPos4iv(const GLint * v)
   3772 {
   3773    save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1],
   3774                     (GLfloat) v[2], (GLfloat) v[3]);
   3775 }
   3776 
   3777 static void GLAPIENTRY
   3778 save_RasterPos4sv(const GLshort * v)
   3779 {
   3780    save_RasterPos4f(v[0], v[1], v[2], v[3]);
   3781 }
   3782 
   3783 
   3784 static void GLAPIENTRY
   3785 save_PassThrough(GLfloat token)
   3786 {
   3787    GET_CURRENT_CONTEXT(ctx);
   3788    Node *n;
   3789    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3790    n = alloc_instruction(ctx, OPCODE_PASSTHROUGH, 1);
   3791    if (n) {
   3792       n[1].f = token;
   3793    }
   3794    if (ctx->ExecuteFlag) {
   3795       CALL_PassThrough(ctx->Exec, (token));
   3796    }
   3797 }
   3798 
   3799 
   3800 static void GLAPIENTRY
   3801 save_ReadBuffer(GLenum mode)
   3802 {
   3803    GET_CURRENT_CONTEXT(ctx);
   3804    Node *n;
   3805    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3806    n = alloc_instruction(ctx, OPCODE_READ_BUFFER, 1);
   3807    if (n) {
   3808       n[1].e = mode;
   3809    }
   3810    if (ctx->ExecuteFlag) {
   3811       CALL_ReadBuffer(ctx->Exec, (mode));
   3812    }
   3813 }
   3814 
   3815 
   3816 static void GLAPIENTRY
   3817 save_Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
   3818 {
   3819    GET_CURRENT_CONTEXT(ctx);
   3820    Node *n;
   3821    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3822    n = alloc_instruction(ctx, OPCODE_ROTATE, 4);
   3823    if (n) {
   3824       n[1].f = angle;
   3825       n[2].f = x;
   3826       n[3].f = y;
   3827       n[4].f = z;
   3828    }
   3829    if (ctx->ExecuteFlag) {
   3830       CALL_Rotatef(ctx->Exec, (angle, x, y, z));
   3831    }
   3832 }
   3833 
   3834 
   3835 static void GLAPIENTRY
   3836 save_Rotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
   3837 {
   3838    save_Rotatef((GLfloat) angle, (GLfloat) x, (GLfloat) y, (GLfloat) z);
   3839 }
   3840 
   3841 
   3842 static void GLAPIENTRY
   3843 save_Scalef(GLfloat x, GLfloat y, GLfloat z)
   3844 {
   3845    GET_CURRENT_CONTEXT(ctx);
   3846    Node *n;
   3847    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3848    n = alloc_instruction(ctx, OPCODE_SCALE, 3);
   3849    if (n) {
   3850       n[1].f = x;
   3851       n[2].f = y;
   3852       n[3].f = z;
   3853    }
   3854    if (ctx->ExecuteFlag) {
   3855       CALL_Scalef(ctx->Exec, (x, y, z));
   3856    }
   3857 }
   3858 
   3859 
   3860 static void GLAPIENTRY
   3861 save_Scaled(GLdouble x, GLdouble y, GLdouble z)
   3862 {
   3863    save_Scalef((GLfloat) x, (GLfloat) y, (GLfloat) z);
   3864 }
   3865 
   3866 
   3867 static void GLAPIENTRY
   3868 save_Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
   3869 {
   3870    GET_CURRENT_CONTEXT(ctx);
   3871    Node *n;
   3872    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3873    n = alloc_instruction(ctx, OPCODE_SCISSOR, 4);
   3874    if (n) {
   3875       n[1].i = x;
   3876       n[2].i = y;
   3877       n[3].i = width;
   3878       n[4].i = height;
   3879    }
   3880    if (ctx->ExecuteFlag) {
   3881       CALL_Scissor(ctx->Exec, (x, y, width, height));
   3882    }
   3883 }
   3884 
   3885 
   3886 static void GLAPIENTRY
   3887 save_ShadeModel(GLenum mode)
   3888 {
   3889    GET_CURRENT_CONTEXT(ctx);
   3890    Node *n;
   3891    ASSERT_OUTSIDE_SAVE_BEGIN_END(ctx);
   3892 
   3893    if (ctx->ExecuteFlag) {
   3894       CALL_ShadeModel(ctx->Exec, (mode));
   3895    }
   3896 
   3897    /* Don't compile this call if it's a no-op.
   3898     * By avoiding this state change we have a better chance of
   3899     * coalescing subsequent drawing commands into one batch.
   3900     */
   3901    if (ctx->ListState.Current.ShadeModel == mode)
   3902       return;
   3903 
   3904    SAVE_FLUSH_VERTICES(ctx);
   3905 
   3906    ctx->ListState.Current.ShadeModel = mode;
   3907 
   3908    n = alloc_instruction(ctx, OPCODE_SHADE_MODEL, 1);
   3909    if (n) {
   3910       n[1].e = mode;
   3911    }
   3912 }
   3913 
   3914 
   3915 static void GLAPIENTRY
   3916 save_StencilFunc(GLenum func, GLint ref, GLuint mask)
   3917 {
   3918    GET_CURRENT_CONTEXT(ctx);
   3919    Node *n;
   3920    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3921    n = alloc_instruction(ctx, OPCODE_STENCIL_FUNC, 3);
   3922    if (n) {
   3923       n[1].e = func;
   3924       n[2].i = ref;
   3925       n[3].ui = mask;
   3926    }
   3927    if (ctx->ExecuteFlag) {
   3928       CALL_StencilFunc(ctx->Exec, (func, ref, mask));
   3929    }
   3930 }
   3931 
   3932 
   3933 static void GLAPIENTRY
   3934 save_StencilMask(GLuint mask)
   3935 {
   3936    GET_CURRENT_CONTEXT(ctx);
   3937    Node *n;
   3938    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3939    n = alloc_instruction(ctx, OPCODE_STENCIL_MASK, 1);
   3940    if (n) {
   3941       n[1].ui = mask;
   3942    }
   3943    if (ctx->ExecuteFlag) {
   3944       CALL_StencilMask(ctx->Exec, (mask));
   3945    }
   3946 }
   3947 
   3948 
   3949 static void GLAPIENTRY
   3950 save_StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
   3951 {
   3952    GET_CURRENT_CONTEXT(ctx);
   3953    Node *n;
   3954    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3955    n = alloc_instruction(ctx, OPCODE_STENCIL_OP, 3);
   3956    if (n) {
   3957       n[1].e = fail;
   3958       n[2].e = zfail;
   3959       n[3].e = zpass;
   3960    }
   3961    if (ctx->ExecuteFlag) {
   3962       CALL_StencilOp(ctx->Exec, (fail, zfail, zpass));
   3963    }
   3964 }
   3965 
   3966 
   3967 static void GLAPIENTRY
   3968 save_StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
   3969 {
   3970    GET_CURRENT_CONTEXT(ctx);
   3971    Node *n;
   3972    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3973    n = alloc_instruction(ctx, OPCODE_STENCIL_FUNC_SEPARATE, 4);
   3974    if (n) {
   3975       n[1].e = face;
   3976       n[2].e = func;
   3977       n[3].i = ref;
   3978       n[4].ui = mask;
   3979    }
   3980    if (ctx->ExecuteFlag) {
   3981       CALL_StencilFuncSeparate(ctx->Exec, (face, func, ref, mask));
   3982    }
   3983 }
   3984 
   3985 
   3986 static void GLAPIENTRY
   3987 save_StencilFuncSeparateATI(GLenum frontfunc, GLenum backfunc, GLint ref,
   3988                             GLuint mask)
   3989 {
   3990    GET_CURRENT_CONTEXT(ctx);
   3991    Node *n;
   3992    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   3993    /* GL_FRONT */
   3994    n = alloc_instruction(ctx, OPCODE_STENCIL_FUNC_SEPARATE, 4);
   3995    if (n) {
   3996       n[1].e = GL_FRONT;
   3997       n[2].e = frontfunc;
   3998       n[3].i = ref;
   3999       n[4].ui = mask;
   4000    }
   4001    /* GL_BACK */
   4002    n = alloc_instruction(ctx, OPCODE_STENCIL_FUNC_SEPARATE, 4);
   4003    if (n) {
   4004       n[1].e = GL_BACK;
   4005       n[2].e = backfunc;
   4006       n[3].i = ref;
   4007       n[4].ui = mask;
   4008    }
   4009    if (ctx->ExecuteFlag) {
   4010       CALL_StencilFuncSeparate(ctx->Exec, (GL_FRONT, frontfunc, ref, mask));
   4011       CALL_StencilFuncSeparate(ctx->Exec, (GL_BACK, backfunc, ref, mask));
   4012    }
   4013 }
   4014 
   4015 
   4016 static void GLAPIENTRY
   4017 save_StencilMaskSeparate(GLenum face, GLuint mask)
   4018 {
   4019    GET_CURRENT_CONTEXT(ctx);
   4020    Node *n;
   4021    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4022    n = alloc_instruction(ctx, OPCODE_STENCIL_MASK_SEPARATE, 2);
   4023    if (n) {
   4024       n[1].e = face;
   4025       n[2].ui = mask;
   4026    }
   4027    if (ctx->ExecuteFlag) {
   4028       CALL_StencilMaskSeparate(ctx->Exec, (face, mask));
   4029    }
   4030 }
   4031 
   4032 
   4033 static void GLAPIENTRY
   4034 save_StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
   4035 {
   4036    GET_CURRENT_CONTEXT(ctx);
   4037    Node *n;
   4038    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4039    n = alloc_instruction(ctx, OPCODE_STENCIL_OP_SEPARATE, 4);
   4040    if (n) {
   4041       n[1].e = face;
   4042       n[2].e = fail;
   4043       n[3].e = zfail;
   4044       n[4].e = zpass;
   4045    }
   4046    if (ctx->ExecuteFlag) {
   4047       CALL_StencilOpSeparate(ctx->Exec, (face, fail, zfail, zpass));
   4048    }
   4049 }
   4050 
   4051 
   4052 static void GLAPIENTRY
   4053 save_TexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
   4054 {
   4055    GET_CURRENT_CONTEXT(ctx);
   4056    Node *n;
   4057    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4058    n = alloc_instruction(ctx, OPCODE_TEXENV, 6);
   4059    if (n) {
   4060       n[1].e = target;
   4061       n[2].e = pname;
   4062       if (pname == GL_TEXTURE_ENV_COLOR) {
   4063          n[3].f = params[0];
   4064          n[4].f = params[1];
   4065          n[5].f = params[2];
   4066          n[6].f = params[3];
   4067       }
   4068       else {
   4069          n[3].f = params[0];
   4070          n[4].f = n[5].f = n[6].f = 0.0F;
   4071       }
   4072    }
   4073    if (ctx->ExecuteFlag) {
   4074       CALL_TexEnvfv(ctx->Exec, (target, pname, params));
   4075    }
   4076 }
   4077 
   4078 
   4079 static void GLAPIENTRY
   4080 save_TexEnvf(GLenum target, GLenum pname, GLfloat param)
   4081 {
   4082    GLfloat parray[4];
   4083    parray[0] = (GLfloat) param;
   4084    parray[1] = parray[2] = parray[3] = 0.0F;
   4085    save_TexEnvfv(target, pname, parray);
   4086 }
   4087 
   4088 
   4089 static void GLAPIENTRY
   4090 save_TexEnvi(GLenum target, GLenum pname, GLint param)
   4091 {
   4092    GLfloat p[4];
   4093    p[0] = (GLfloat) param;
   4094    p[1] = p[2] = p[3] = 0.0F;
   4095    save_TexEnvfv(target, pname, p);
   4096 }
   4097 
   4098 
   4099 static void GLAPIENTRY
   4100 save_TexEnviv(GLenum target, GLenum pname, const GLint * param)
   4101 {
   4102    GLfloat p[4];
   4103    if (pname == GL_TEXTURE_ENV_COLOR) {
   4104       p[0] = INT_TO_FLOAT(param[0]);
   4105       p[1] = INT_TO_FLOAT(param[1]);
   4106       p[2] = INT_TO_FLOAT(param[2]);
   4107       p[3] = INT_TO_FLOAT(param[3]);
   4108    }
   4109    else {
   4110       p[0] = (GLfloat) param[0];
   4111       p[1] = p[2] = p[3] = 0.0F;
   4112    }
   4113    save_TexEnvfv(target, pname, p);
   4114 }
   4115 
   4116 
   4117 static void GLAPIENTRY
   4118 save_TexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
   4119 {
   4120    GET_CURRENT_CONTEXT(ctx);
   4121    Node *n;
   4122    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4123    n = alloc_instruction(ctx, OPCODE_TEXGEN, 6);
   4124    if (n) {
   4125       n[1].e = coord;
   4126       n[2].e = pname;
   4127       n[3].f = params[0];
   4128       n[4].f = params[1];
   4129       n[5].f = params[2];
   4130       n[6].f = params[3];
   4131    }
   4132    if (ctx->ExecuteFlag) {
   4133       CALL_TexGenfv(ctx->Exec, (coord, pname, params));
   4134    }
   4135 }
   4136 
   4137 
   4138 static void GLAPIENTRY
   4139 save_TexGeniv(GLenum coord, GLenum pname, const GLint *params)
   4140 {
   4141    GLfloat p[4];
   4142    p[0] = (GLfloat) params[0];
   4143    p[1] = (GLfloat) params[1];
   4144    p[2] = (GLfloat) params[2];
   4145    p[3] = (GLfloat) params[3];
   4146    save_TexGenfv(coord, pname, p);
   4147 }
   4148 
   4149 
   4150 static void GLAPIENTRY
   4151 save_TexGend(GLenum coord, GLenum pname, GLdouble param)
   4152 {
   4153    GLfloat parray[4];
   4154    parray[0] = (GLfloat) param;
   4155    parray[1] = parray[2] = parray[3] = 0.0F;
   4156    save_TexGenfv(coord, pname, parray);
   4157 }
   4158 
   4159 
   4160 static void GLAPIENTRY
   4161 save_TexGendv(GLenum coord, GLenum pname, const GLdouble *params)
   4162 {
   4163    GLfloat p[4];
   4164    p[0] = (GLfloat) params[0];
   4165    p[1] = (GLfloat) params[1];
   4166    p[2] = (GLfloat) params[2];
   4167    p[3] = (GLfloat) params[3];
   4168    save_TexGenfv(coord, pname, p);
   4169 }
   4170 
   4171 
   4172 static void GLAPIENTRY
   4173 save_TexGenf(GLenum coord, GLenum pname, GLfloat param)
   4174 {
   4175    GLfloat parray[4];
   4176    parray[0] = param;
   4177    parray[1] = parray[2] = parray[3] = 0.0F;
   4178    save_TexGenfv(coord, pname, parray);
   4179 }
   4180 
   4181 
   4182 static void GLAPIENTRY
   4183 save_TexGeni(GLenum coord, GLenum pname, GLint param)
   4184 {
   4185    GLint parray[4];
   4186    parray[0] = param;
   4187    parray[1] = parray[2] = parray[3] = 0;
   4188    save_TexGeniv(coord, pname, parray);
   4189 }
   4190 
   4191 
   4192 static void GLAPIENTRY
   4193 save_TexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
   4194 {
   4195    GET_CURRENT_CONTEXT(ctx);
   4196    Node *n;
   4197    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4198    n = alloc_instruction(ctx, OPCODE_TEXPARAMETER, 6);
   4199    if (n) {
   4200       n[1].e = target;
   4201       n[2].e = pname;
   4202       n[3].f = params[0];
   4203       n[4].f = params[1];
   4204       n[5].f = params[2];
   4205       n[6].f = params[3];
   4206    }
   4207    if (ctx->ExecuteFlag) {
   4208       CALL_TexParameterfv(ctx->Exec, (target, pname, params));
   4209    }
   4210 }
   4211 
   4212 
   4213 static void GLAPIENTRY
   4214 save_TexParameterf(GLenum target, GLenum pname, GLfloat param)
   4215 {
   4216    GLfloat parray[4];
   4217    parray[0] = param;
   4218    parray[1] = parray[2] = parray[3] = 0.0F;
   4219    save_TexParameterfv(target, pname, parray);
   4220 }
   4221 
   4222 
   4223 static void GLAPIENTRY
   4224 save_TexParameteri(GLenum target, GLenum pname, GLint param)
   4225 {
   4226    GLfloat fparam[4];
   4227    fparam[0] = (GLfloat) param;
   4228    fparam[1] = fparam[2] = fparam[3] = 0.0F;
   4229    save_TexParameterfv(target, pname, fparam);
   4230 }
   4231 
   4232 
   4233 static void GLAPIENTRY
   4234 save_TexParameteriv(GLenum target, GLenum pname, const GLint *params)
   4235 {
   4236    GLfloat fparam[4];
   4237    fparam[0] = (GLfloat) params[0];
   4238    fparam[1] = fparam[2] = fparam[3] = 0.0F;
   4239    save_TexParameterfv(target, pname, fparam);
   4240 }
   4241 
   4242 
   4243 static void GLAPIENTRY
   4244 save_TexImage1D(GLenum target,
   4245                 GLint level, GLint components,
   4246                 GLsizei width, GLint border,
   4247                 GLenum format, GLenum type, const GLvoid * pixels)
   4248 {
   4249    GET_CURRENT_CONTEXT(ctx);
   4250    if (target == GL_PROXY_TEXTURE_1D) {
   4251       /* don't compile, execute immediately */
   4252       CALL_TexImage1D(ctx->Exec, (target, level, components, width,
   4253                                   border, format, type, pixels));
   4254    }
   4255    else {
   4256       Node *n;
   4257       ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4258       n = alloc_instruction(ctx, OPCODE_TEX_IMAGE1D, 7 + POINTER_DWORDS);
   4259       if (n) {
   4260          n[1].e = target;
   4261          n[2].i = level;
   4262          n[3].i = components;
   4263          n[4].i = (GLint) width;
   4264          n[5].i = border;
   4265          n[6].e = format;
   4266          n[7].e = type;
   4267          save_pointer(&n[8],
   4268                       unpack_image(ctx, 1, width, 1, 1, format, type,
   4269                                    pixels, &ctx->Unpack));
   4270       }
   4271       if (ctx->ExecuteFlag) {
   4272          CALL_TexImage1D(ctx->Exec, (target, level, components, width,
   4273                                      border, format, type, pixels));
   4274       }
   4275    }
   4276 }
   4277 
   4278 
   4279 static void GLAPIENTRY
   4280 save_TexImage2D(GLenum target,
   4281                 GLint level, GLint components,
   4282                 GLsizei width, GLsizei height, GLint border,
   4283                 GLenum format, GLenum type, const GLvoid * pixels)
   4284 {
   4285    GET_CURRENT_CONTEXT(ctx);
   4286    if (target == GL_PROXY_TEXTURE_2D) {
   4287       /* don't compile, execute immediately */
   4288       CALL_TexImage2D(ctx->Exec, (target, level, components, width,
   4289                                   height, border, format, type, pixels));
   4290    }
   4291    else {
   4292       Node *n;
   4293       ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4294       n = alloc_instruction(ctx, OPCODE_TEX_IMAGE2D, 8 + POINTER_DWORDS);
   4295       if (n) {
   4296          n[1].e = target;
   4297          n[2].i = level;
   4298          n[3].i = components;
   4299          n[4].i = (GLint) width;
   4300          n[5].i = (GLint) height;
   4301          n[6].i = border;
   4302          n[7].e = format;
   4303          n[8].e = type;
   4304          save_pointer(&n[9],
   4305                       unpack_image(ctx, 2, width, height, 1, format, type,
   4306                                    pixels, &ctx->Unpack));
   4307       }
   4308       if (ctx->ExecuteFlag) {
   4309          CALL_TexImage2D(ctx->Exec, (target, level, components, width,
   4310                                      height, border, format, type, pixels));
   4311       }
   4312    }
   4313 }
   4314 
   4315 
   4316 static void GLAPIENTRY
   4317 save_TexImage3D(GLenum target,
   4318                 GLint level, GLint internalFormat,
   4319                 GLsizei width, GLsizei height, GLsizei depth,
   4320                 GLint border,
   4321                 GLenum format, GLenum type, const GLvoid * pixels)
   4322 {
   4323    GET_CURRENT_CONTEXT(ctx);
   4324    if (target == GL_PROXY_TEXTURE_3D) {
   4325       /* don't compile, execute immediately */
   4326       CALL_TexImage3D(ctx->Exec, (target, level, internalFormat, width,
   4327                                   height, depth, border, format, type,
   4328                                   pixels));
   4329    }
   4330    else {
   4331       Node *n;
   4332       ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4333       n = alloc_instruction(ctx, OPCODE_TEX_IMAGE3D, 9 + POINTER_DWORDS);
   4334       if (n) {
   4335          n[1].e = target;
   4336          n[2].i = level;
   4337          n[3].i = (GLint) internalFormat;
   4338          n[4].i = (GLint) width;
   4339          n[5].i = (GLint) height;
   4340          n[6].i = (GLint) depth;
   4341          n[7].i = border;
   4342          n[8].e = format;
   4343          n[9].e = type;
   4344          save_pointer(&n[10],
   4345                       unpack_image(ctx, 3, width, height, depth, format, type,
   4346                                    pixels, &ctx->Unpack));
   4347       }
   4348       if (ctx->ExecuteFlag) {
   4349          CALL_TexImage3D(ctx->Exec, (target, level, internalFormat, width,
   4350                                      height, depth, border, format, type,
   4351                                      pixels));
   4352       }
   4353    }
   4354 }
   4355 
   4356 
   4357 static void GLAPIENTRY
   4358 save_TexSubImage1D(GLenum target, GLint level, GLint xoffset,
   4359                    GLsizei width, GLenum format, GLenum type,
   4360                    const GLvoid * pixels)
   4361 {
   4362    GET_CURRENT_CONTEXT(ctx);
   4363    Node *n;
   4364 
   4365    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4366 
   4367    n = alloc_instruction(ctx, OPCODE_TEX_SUB_IMAGE1D, 6 + POINTER_DWORDS);
   4368    if (n) {
   4369       n[1].e = target;
   4370       n[2].i = level;
   4371       n[3].i = xoffset;
   4372       n[4].i = (GLint) width;
   4373       n[5].e = format;
   4374       n[6].e = type;
   4375       save_pointer(&n[7],
   4376                    unpack_image(ctx, 1, width, 1, 1, format, type,
   4377                                 pixels, &ctx->Unpack));
   4378    }
   4379    if (ctx->ExecuteFlag) {
   4380       CALL_TexSubImage1D(ctx->Exec, (target, level, xoffset, width,
   4381                                      format, type, pixels));
   4382    }
   4383 }
   4384 
   4385 
   4386 static void GLAPIENTRY
   4387 save_TexSubImage2D(GLenum target, GLint level,
   4388                    GLint xoffset, GLint yoffset,
   4389                    GLsizei width, GLsizei height,
   4390                    GLenum format, GLenum type, const GLvoid * pixels)
   4391 {
   4392    GET_CURRENT_CONTEXT(ctx);
   4393    Node *n;
   4394 
   4395    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4396 
   4397    n = alloc_instruction(ctx, OPCODE_TEX_SUB_IMAGE2D, 8 + POINTER_DWORDS);
   4398    if (n) {
   4399       n[1].e = target;
   4400       n[2].i = level;
   4401       n[3].i = xoffset;
   4402       n[4].i = yoffset;
   4403       n[5].i = (GLint) width;
   4404       n[6].i = (GLint) height;
   4405       n[7].e = format;
   4406       n[8].e = type;
   4407       save_pointer(&n[9],
   4408                    unpack_image(ctx, 2, width, height, 1, format, type,
   4409                                 pixels, &ctx->Unpack));
   4410    }
   4411    if (ctx->ExecuteFlag) {
   4412       CALL_TexSubImage2D(ctx->Exec, (target, level, xoffset, yoffset,
   4413                                      width, height, format, type, pixels));
   4414    }
   4415 }
   4416 
   4417 
   4418 static void GLAPIENTRY
   4419 save_TexSubImage3D(GLenum target, GLint level,
   4420                    GLint xoffset, GLint yoffset, GLint zoffset,
   4421                    GLsizei width, GLsizei height, GLsizei depth,
   4422                    GLenum format, GLenum type, const GLvoid * pixels)
   4423 {
   4424    GET_CURRENT_CONTEXT(ctx);
   4425    Node *n;
   4426 
   4427    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4428 
   4429    n = alloc_instruction(ctx, OPCODE_TEX_SUB_IMAGE3D, 10 + POINTER_DWORDS);
   4430    if (n) {
   4431       n[1].e = target;
   4432       n[2].i = level;
   4433       n[3].i = xoffset;
   4434       n[4].i = yoffset;
   4435       n[5].i = zoffset;
   4436       n[6].i = (GLint) width;
   4437       n[7].i = (GLint) height;
   4438       n[8].i = (GLint) depth;
   4439       n[9].e = format;
   4440       n[10].e = type;
   4441       save_pointer(&n[11],
   4442                    unpack_image(ctx, 3, width, height, depth, format, type,
   4443                                 pixels, &ctx->Unpack));
   4444    }
   4445    if (ctx->ExecuteFlag) {
   4446       CALL_TexSubImage3D(ctx->Exec, (target, level,
   4447                                      xoffset, yoffset, zoffset,
   4448                                      width, height, depth, format, type,
   4449                                      pixels));
   4450    }
   4451 }
   4452 
   4453 
   4454 static void GLAPIENTRY
   4455 save_Translatef(GLfloat x, GLfloat y, GLfloat z)
   4456 {
   4457    GET_CURRENT_CONTEXT(ctx);
   4458    Node *n;
   4459    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4460    n = alloc_instruction(ctx, OPCODE_TRANSLATE, 3);
   4461    if (n) {
   4462       n[1].f = x;
   4463       n[2].f = y;
   4464       n[3].f = z;
   4465    }
   4466    if (ctx->ExecuteFlag) {
   4467       CALL_Translatef(ctx->Exec, (x, y, z));
   4468    }
   4469 }
   4470 
   4471 
   4472 static void GLAPIENTRY
   4473 save_Translated(GLdouble x, GLdouble y, GLdouble z)
   4474 {
   4475    save_Translatef((GLfloat) x, (GLfloat) y, (GLfloat) z);
   4476 }
   4477 
   4478 
   4479 
   4480 static void GLAPIENTRY
   4481 save_Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
   4482 {
   4483    GET_CURRENT_CONTEXT(ctx);
   4484    Node *n;
   4485    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4486    n = alloc_instruction(ctx, OPCODE_VIEWPORT, 4);
   4487    if (n) {
   4488       n[1].i = x;
   4489       n[2].i = y;
   4490       n[3].i = (GLint) width;
   4491       n[4].i = (GLint) height;
   4492    }
   4493    if (ctx->ExecuteFlag) {
   4494       CALL_Viewport(ctx->Exec, (x, y, width, height));
   4495    }
   4496 }
   4497 
   4498 
   4499 static void GLAPIENTRY
   4500 save_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
   4501 {
   4502    GET_CURRENT_CONTEXT(ctx);
   4503    Node *n;
   4504    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4505    n = alloc_instruction(ctx, OPCODE_WINDOW_POS, 4);
   4506    if (n) {
   4507       n[1].f = x;
   4508       n[2].f = y;
   4509       n[3].f = z;
   4510       n[4].f = w;
   4511    }
   4512    if (ctx->ExecuteFlag) {
   4513       CALL_WindowPos4fMESA(ctx->Exec, (x, y, z, w));
   4514    }
   4515 }
   4516 
   4517 static void GLAPIENTRY
   4518 save_WindowPos2dMESA(GLdouble x, GLdouble y)
   4519 {
   4520    save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
   4521 }
   4522 
   4523 static void GLAPIENTRY
   4524 save_WindowPos2fMESA(GLfloat x, GLfloat y)
   4525 {
   4526    save_WindowPos4fMESA(x, y, 0.0F, 1.0F);
   4527 }
   4528 
   4529 static void GLAPIENTRY
   4530 save_WindowPos2iMESA(GLint x, GLint y)
   4531 {
   4532    save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
   4533 }
   4534 
   4535 static void GLAPIENTRY
   4536 save_WindowPos2sMESA(GLshort x, GLshort y)
   4537 {
   4538    save_WindowPos4fMESA(x, y, 0.0F, 1.0F);
   4539 }
   4540 
   4541 static void GLAPIENTRY
   4542 save_WindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z)
   4543 {
   4544    save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
   4545 }
   4546 
   4547 static void GLAPIENTRY
   4548 save_WindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z)
   4549 {
   4550    save_WindowPos4fMESA(x, y, z, 1.0F);
   4551 }
   4552 
   4553 static void GLAPIENTRY
   4554 save_WindowPos3iMESA(GLint x, GLint y, GLint z)
   4555 {
   4556    save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
   4557 }
   4558 
   4559 static void GLAPIENTRY
   4560 save_WindowPos3sMESA(GLshort x, GLshort y, GLshort z)
   4561 {
   4562    save_WindowPos4fMESA(x, y, z, 1.0F);
   4563 }
   4564 
   4565 static void GLAPIENTRY
   4566 save_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
   4567 {
   4568    save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
   4569 }
   4570 
   4571 static void GLAPIENTRY
   4572 save_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w)
   4573 {
   4574    save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
   4575 }
   4576 
   4577 static void GLAPIENTRY
   4578 save_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w)
   4579 {
   4580    save_WindowPos4fMESA(x, y, z, w);
   4581 }
   4582 
   4583 static void GLAPIENTRY
   4584 save_WindowPos2dvMESA(const GLdouble * v)
   4585 {
   4586    save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
   4587 }
   4588 
   4589 static void GLAPIENTRY
   4590 save_WindowPos2fvMESA(const GLfloat * v)
   4591 {
   4592    save_WindowPos4fMESA(v[0], v[1], 0.0F, 1.0F);
   4593 }
   4594 
   4595 static void GLAPIENTRY
   4596 save_WindowPos2ivMESA(const GLint * v)
   4597 {
   4598    save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
   4599 }
   4600 
   4601 static void GLAPIENTRY
   4602 save_WindowPos2svMESA(const GLshort * v)
   4603 {
   4604    save_WindowPos4fMESA(v[0], v[1], 0.0F, 1.0F);
   4605 }
   4606 
   4607 static void GLAPIENTRY
   4608 save_WindowPos3dvMESA(const GLdouble * v)
   4609 {
   4610    save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
   4611 }
   4612 
   4613 static void GLAPIENTRY
   4614 save_WindowPos3fvMESA(const GLfloat * v)
   4615 {
   4616    save_WindowPos4fMESA(v[0], v[1], v[2], 1.0F);
   4617 }
   4618 
   4619 static void GLAPIENTRY
   4620 save_WindowPos3ivMESA(const GLint * v)
   4621 {
   4622    save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
   4623 }
   4624 
   4625 static void GLAPIENTRY
   4626 save_WindowPos3svMESA(const GLshort * v)
   4627 {
   4628    save_WindowPos4fMESA(v[0], v[1], v[2], 1.0F);
   4629 }
   4630 
   4631 static void GLAPIENTRY
   4632 save_WindowPos4dvMESA(const GLdouble * v)
   4633 {
   4634    save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1],
   4635                         (GLfloat) v[2], (GLfloat) v[3]);
   4636 }
   4637 
   4638 static void GLAPIENTRY
   4639 save_WindowPos4fvMESA(const GLfloat * v)
   4640 {
   4641    save_WindowPos4fMESA(v[0], v[1], v[2], v[3]);
   4642 }
   4643 
   4644 static void GLAPIENTRY
   4645 save_WindowPos4ivMESA(const GLint * v)
   4646 {
   4647    save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1],
   4648                         (GLfloat) v[2], (GLfloat) v[3]);
   4649 }
   4650 
   4651 static void GLAPIENTRY
   4652 save_WindowPos4svMESA(const GLshort * v)
   4653 {
   4654    save_WindowPos4fMESA(v[0], v[1], v[2], v[3]);
   4655 }
   4656 
   4657 
   4658 
   4659 /* GL_ARB_multitexture */
   4660 static void GLAPIENTRY
   4661 save_ActiveTextureARB(GLenum target)
   4662 {
   4663    GET_CURRENT_CONTEXT(ctx);
   4664    Node *n;
   4665    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4666    n = alloc_instruction(ctx, OPCODE_ACTIVE_TEXTURE, 1);
   4667    if (n) {
   4668       n[1].e = target;
   4669    }
   4670    if (ctx->ExecuteFlag) {
   4671       CALL_ActiveTexture(ctx->Exec, (target));
   4672    }
   4673 }
   4674 
   4675 
   4676 /* GL_ARB_transpose_matrix */
   4677 
   4678 static void GLAPIENTRY
   4679 save_LoadTransposeMatrixdARB(const GLdouble m[16])
   4680 {
   4681    GLfloat tm[16];
   4682    _math_transposefd(tm, m);
   4683    save_LoadMatrixf(tm);
   4684 }
   4685 
   4686 
   4687 static void GLAPIENTRY
   4688 save_LoadTransposeMatrixfARB(const GLfloat m[16])
   4689 {
   4690    GLfloat tm[16];
   4691    _math_transposef(tm, m);
   4692    save_LoadMatrixf(tm);
   4693 }
   4694 
   4695 
   4696 static void GLAPIENTRY
   4697 save_MultTransposeMatrixdARB(const GLdouble m[16])
   4698 {
   4699    GLfloat tm[16];
   4700    _math_transposefd(tm, m);
   4701    save_MultMatrixf(tm);
   4702 }
   4703 
   4704 
   4705 static void GLAPIENTRY
   4706 save_MultTransposeMatrixfARB(const GLfloat m[16])
   4707 {
   4708    GLfloat tm[16];
   4709    _math_transposef(tm, m);
   4710    save_MultMatrixf(tm);
   4711 }
   4712 
   4713 static GLvoid *copy_data(const GLvoid *data, GLsizei size, const char *func)
   4714 {
   4715    GET_CURRENT_CONTEXT(ctx);
   4716    GLvoid *image;
   4717 
   4718    if (!data)
   4719       return NULL;
   4720 
   4721    image = malloc(size);
   4722    if (!image) {
   4723       _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func);
   4724       return NULL;
   4725    }
   4726    memcpy(image, data, size);
   4727 
   4728    return image;
   4729 }
   4730 
   4731 
   4732 /* GL_ARB_texture_compression */
   4733 static void GLAPIENTRY
   4734 save_CompressedTexImage1DARB(GLenum target, GLint level,
   4735                              GLenum internalFormat, GLsizei width,
   4736                              GLint border, GLsizei imageSize,
   4737                              const GLvoid * data)
   4738 {
   4739    GET_CURRENT_CONTEXT(ctx);
   4740    if (target == GL_PROXY_TEXTURE_1D) {
   4741       /* don't compile, execute immediately */
   4742       CALL_CompressedTexImage1D(ctx->Exec, (target, level, internalFormat,
   4743                                                width, border, imageSize,
   4744                                                data));
   4745    }
   4746    else {
   4747       Node *n;
   4748       ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4749 
   4750       n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_IMAGE_1D,
   4751                             6 + POINTER_DWORDS);
   4752       if (n) {
   4753          n[1].e = target;
   4754          n[2].i = level;
   4755          n[3].e = internalFormat;
   4756          n[4].i = (GLint) width;
   4757          n[5].i = border;
   4758          n[6].i = imageSize;
   4759          save_pointer(&n[7],
   4760                       copy_data(data, imageSize, "glCompressedTexImage1DARB"));
   4761       }
   4762       if (ctx->ExecuteFlag) {
   4763          CALL_CompressedTexImage1D(ctx->Exec,
   4764                                       (target, level, internalFormat, width,
   4765                                        border, imageSize, data));
   4766       }
   4767    }
   4768 }
   4769 
   4770 
   4771 static void GLAPIENTRY
   4772 save_CompressedTexImage2DARB(GLenum target, GLint level,
   4773                              GLenum internalFormat, GLsizei width,
   4774                              GLsizei height, GLint border, GLsizei imageSize,
   4775                              const GLvoid * data)
   4776 {
   4777    GET_CURRENT_CONTEXT(ctx);
   4778    if (target == GL_PROXY_TEXTURE_2D) {
   4779       /* don't compile, execute immediately */
   4780       CALL_CompressedTexImage2D(ctx->Exec, (target, level, internalFormat,
   4781                                                width, height, border,
   4782                                                imageSize, data));
   4783    }
   4784    else {
   4785       Node *n;
   4786       ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4787 
   4788       n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_IMAGE_2D,
   4789                             7 + POINTER_DWORDS);
   4790       if (n) {
   4791          n[1].e = target;
   4792          n[2].i = level;
   4793          n[3].e = internalFormat;
   4794          n[4].i = (GLint) width;
   4795          n[5].i = (GLint) height;
   4796          n[6].i = border;
   4797          n[7].i = imageSize;
   4798          save_pointer(&n[8],
   4799                       copy_data(data, imageSize, "glCompressedTexImage2DARB"));
   4800       }
   4801       if (ctx->ExecuteFlag) {
   4802          CALL_CompressedTexImage2D(ctx->Exec,
   4803                                       (target, level, internalFormat, width,
   4804                                        height, border, imageSize, data));
   4805       }
   4806    }
   4807 }
   4808 
   4809 
   4810 static void GLAPIENTRY
   4811 save_CompressedTexImage3DARB(GLenum target, GLint level,
   4812                              GLenum internalFormat, GLsizei width,
   4813                              GLsizei height, GLsizei depth, GLint border,
   4814                              GLsizei imageSize, const GLvoid * data)
   4815 {
   4816    GET_CURRENT_CONTEXT(ctx);
   4817    if (target == GL_PROXY_TEXTURE_3D) {
   4818       /* don't compile, execute immediately */
   4819       CALL_CompressedTexImage3D(ctx->Exec, (target, level, internalFormat,
   4820                                                width, height, depth, border,
   4821                                                imageSize, data));
   4822    }
   4823    else {
   4824       Node *n;
   4825       ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4826 
   4827       n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_IMAGE_3D,
   4828                             8 + POINTER_DWORDS);
   4829       if (n) {
   4830          n[1].e = target;
   4831          n[2].i = level;
   4832          n[3].e = internalFormat;
   4833          n[4].i = (GLint) width;
   4834          n[5].i = (GLint) height;
   4835          n[6].i = (GLint) depth;
   4836          n[7].i = border;
   4837          n[8].i = imageSize;
   4838          save_pointer(&n[9],
   4839                       copy_data(data, imageSize, "glCompressedTexImage3DARB"));
   4840       }
   4841       if (ctx->ExecuteFlag) {
   4842          CALL_CompressedTexImage3D(ctx->Exec,
   4843                                       (target, level, internalFormat, width,
   4844                                        height, depth, border, imageSize,
   4845                                        data));
   4846       }
   4847    }
   4848 }
   4849 
   4850 
   4851 static void GLAPIENTRY
   4852 save_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset,
   4853                                 GLsizei width, GLenum format,
   4854                                 GLsizei imageSize, const GLvoid * data)
   4855 {
   4856    Node *n;
   4857    GET_CURRENT_CONTEXT(ctx);
   4858    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4859 
   4860    n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D,
   4861                          6 + POINTER_DWORDS);
   4862    if (n) {
   4863       n[1].e = target;
   4864       n[2].i = level;
   4865       n[3].i = xoffset;
   4866       n[4].i = (GLint) width;
   4867       n[5].e = format;
   4868       n[6].i = imageSize;
   4869       save_pointer(&n[7],
   4870                    copy_data(data, imageSize, "glCompressedTexSubImage1DARB"));
   4871    }
   4872    if (ctx->ExecuteFlag) {
   4873       CALL_CompressedTexSubImage1D(ctx->Exec, (target, level, xoffset,
   4874                                                   width, format, imageSize,
   4875                                                   data));
   4876    }
   4877 }
   4878 
   4879 
   4880 static void GLAPIENTRY
   4881 save_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset,
   4882                                 GLint yoffset, GLsizei width, GLsizei height,
   4883                                 GLenum format, GLsizei imageSize,
   4884                                 const GLvoid * data)
   4885 {
   4886    Node *n;
   4887    GET_CURRENT_CONTEXT(ctx);
   4888    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4889 
   4890    n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D,
   4891                          8 + POINTER_DWORDS);
   4892    if (n) {
   4893       n[1].e = target;
   4894       n[2].i = level;
   4895       n[3].i = xoffset;
   4896       n[4].i = yoffset;
   4897       n[5].i = (GLint) width;
   4898       n[6].i = (GLint) height;
   4899       n[7].e = format;
   4900       n[8].i = imageSize;
   4901       save_pointer(&n[9],
   4902                    copy_data(data, imageSize, "glCompressedTexSubImage2DARB"));
   4903    }
   4904    if (ctx->ExecuteFlag) {
   4905       CALL_CompressedTexSubImage2D(ctx->Exec,
   4906                                       (target, level, xoffset, yoffset, width,
   4907                                        height, format, imageSize, data));
   4908    }
   4909 }
   4910 
   4911 
   4912 static void GLAPIENTRY
   4913 save_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset,
   4914                                 GLint yoffset, GLint zoffset, GLsizei width,
   4915                                 GLsizei height, GLsizei depth, GLenum format,
   4916                                 GLsizei imageSize, const GLvoid * data)
   4917 {
   4918    Node *n;
   4919    GET_CURRENT_CONTEXT(ctx);
   4920    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4921 
   4922    n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D,
   4923                          10 + POINTER_DWORDS);
   4924    if (n) {
   4925       n[1].e = target;
   4926       n[2].i = level;
   4927       n[3].i = xoffset;
   4928       n[4].i = yoffset;
   4929       n[5].i = zoffset;
   4930       n[6].i = (GLint) width;
   4931       n[7].i = (GLint) height;
   4932       n[8].i = (GLint) depth;
   4933       n[9].e = format;
   4934       n[10].i = imageSize;
   4935       save_pointer(&n[11],
   4936                    copy_data(data, imageSize, "glCompressedTexSubImage3DARB"));
   4937    }
   4938    if (ctx->ExecuteFlag) {
   4939       CALL_CompressedTexSubImage3D(ctx->Exec,
   4940                                       (target, level, xoffset, yoffset,
   4941                                        zoffset, width, height, depth, format,
   4942                                        imageSize, data));
   4943    }
   4944 }
   4945 
   4946 
   4947 /* GL_ARB_multisample */
   4948 static void GLAPIENTRY
   4949 save_SampleCoverageARB(GLclampf value, GLboolean invert)
   4950 {
   4951    GET_CURRENT_CONTEXT(ctx);
   4952    Node *n;
   4953    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4954    n = alloc_instruction(ctx, OPCODE_SAMPLE_COVERAGE, 2);
   4955    if (n) {
   4956       n[1].f = value;
   4957       n[2].b = invert;
   4958    }
   4959    if (ctx->ExecuteFlag) {
   4960       CALL_SampleCoverage(ctx->Exec, (value, invert));
   4961    }
   4962 }
   4963 
   4964 
   4965 /*
   4966  * GL_ARB_vertex_program
   4967  */
   4968 static void GLAPIENTRY
   4969 save_BindProgramARB(GLenum target, GLuint id)
   4970 {
   4971    GET_CURRENT_CONTEXT(ctx);
   4972    Node *n;
   4973    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4974    n = alloc_instruction(ctx, OPCODE_BIND_PROGRAM_ARB, 2);
   4975    if (n) {
   4976       n[1].e = target;
   4977       n[2].ui = id;
   4978    }
   4979    if (ctx->ExecuteFlag) {
   4980       CALL_BindProgramARB(ctx->Exec, (target, id));
   4981    }
   4982 }
   4983 
   4984 static void GLAPIENTRY
   4985 save_ProgramEnvParameter4fARB(GLenum target, GLuint index,
   4986                               GLfloat x, GLfloat y, GLfloat z, GLfloat w)
   4987 {
   4988    GET_CURRENT_CONTEXT(ctx);
   4989    Node *n;
   4990    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   4991    n = alloc_instruction(ctx, OPCODE_PROGRAM_ENV_PARAMETER_ARB, 6);
   4992    if (n) {
   4993       n[1].e = target;
   4994       n[2].ui = index;
   4995       n[3].f = x;
   4996       n[4].f = y;
   4997       n[5].f = z;
   4998       n[6].f = w;
   4999    }
   5000    if (ctx->ExecuteFlag) {
   5001       CALL_ProgramEnvParameter4fARB(ctx->Exec, (target, index, x, y, z, w));
   5002    }
   5003 }
   5004 
   5005 
   5006 static void GLAPIENTRY
   5007 save_ProgramEnvParameter4fvARB(GLenum target, GLuint index,
   5008                                const GLfloat *params)
   5009 {
   5010    save_ProgramEnvParameter4fARB(target, index, params[0], params[1],
   5011                                  params[2], params[3]);
   5012 }
   5013 
   5014 
   5015 static void GLAPIENTRY
   5016 save_ProgramEnvParameters4fvEXT(GLenum target, GLuint index, GLsizei count,
   5017                                 const GLfloat * params)
   5018 {
   5019    GET_CURRENT_CONTEXT(ctx);
   5020    Node *n;
   5021    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5022 
   5023    if (count > 0) {
   5024       GLint i;
   5025       const GLfloat * p = params;
   5026 
   5027       for (i = 0 ; i < count ; i++) {
   5028          n = alloc_instruction(ctx, OPCODE_PROGRAM_ENV_PARAMETER_ARB, 6);
   5029          if (n) {
   5030             n[1].e = target;
   5031             n[2].ui = index;
   5032             n[3].f = p[0];
   5033             n[4].f = p[1];
   5034             n[5].f = p[2];
   5035             n[6].f = p[3];
   5036             p += 4;
   5037          }
   5038       }
   5039    }
   5040 
   5041    if (ctx->ExecuteFlag) {
   5042       CALL_ProgramEnvParameters4fvEXT(ctx->Exec, (target, index, count, params));
   5043    }
   5044 }
   5045 
   5046 
   5047 static void GLAPIENTRY
   5048 save_ProgramEnvParameter4dARB(GLenum target, GLuint index,
   5049                               GLdouble x, GLdouble y, GLdouble z, GLdouble w)
   5050 {
   5051    save_ProgramEnvParameter4fARB(target, index,
   5052                                  (GLfloat) x,
   5053                                  (GLfloat) y, (GLfloat) z, (GLfloat) w);
   5054 }
   5055 
   5056 
   5057 static void GLAPIENTRY
   5058 save_ProgramEnvParameter4dvARB(GLenum target, GLuint index,
   5059                                const GLdouble *params)
   5060 {
   5061    save_ProgramEnvParameter4fARB(target, index,
   5062                                  (GLfloat) params[0],
   5063                                  (GLfloat) params[1],
   5064                                  (GLfloat) params[2], (GLfloat) params[3]);
   5065 }
   5066 
   5067 
   5068 static void GLAPIENTRY
   5069 save_ProgramLocalParameter4fARB(GLenum target, GLuint index,
   5070                                 GLfloat x, GLfloat y, GLfloat z, GLfloat w)
   5071 {
   5072    GET_CURRENT_CONTEXT(ctx);
   5073    Node *n;
   5074    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5075    n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6);
   5076    if (n) {
   5077       n[1].e = target;
   5078       n[2].ui = index;
   5079       n[3].f = x;
   5080       n[4].f = y;
   5081       n[5].f = z;
   5082       n[6].f = w;
   5083    }
   5084    if (ctx->ExecuteFlag) {
   5085       CALL_ProgramLocalParameter4fARB(ctx->Exec, (target, index, x, y, z, w));
   5086    }
   5087 }
   5088 
   5089 
   5090 static void GLAPIENTRY
   5091 save_ProgramLocalParameter4fvARB(GLenum target, GLuint index,
   5092                                  const GLfloat *params)
   5093 {
   5094    GET_CURRENT_CONTEXT(ctx);
   5095    Node *n;
   5096    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5097    n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6);
   5098    if (n) {
   5099       n[1].e = target;
   5100       n[2].ui = index;
   5101       n[3].f = params[0];
   5102       n[4].f = params[1];
   5103       n[5].f = params[2];
   5104       n[6].f = params[3];
   5105    }
   5106    if (ctx->ExecuteFlag) {
   5107       CALL_ProgramLocalParameter4fvARB(ctx->Exec, (target, index, params));
   5108    }
   5109 }
   5110 
   5111 
   5112 static void GLAPIENTRY
   5113 save_ProgramLocalParameters4fvEXT(GLenum target, GLuint index, GLsizei count,
   5114                                   const GLfloat *params)
   5115 {
   5116    GET_CURRENT_CONTEXT(ctx);
   5117    Node *n;
   5118    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5119 
   5120    if (count > 0) {
   5121       GLint i;
   5122       const GLfloat * p = params;
   5123 
   5124       for (i = 0 ; i < count ; i++) {
   5125          n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6);
   5126          if (n) {
   5127             n[1].e = target;
   5128             n[2].ui = index;
   5129             n[3].f = p[0];
   5130             n[4].f = p[1];
   5131             n[5].f = p[2];
   5132             n[6].f = p[3];
   5133             p += 4;
   5134          }
   5135       }
   5136    }
   5137 
   5138    if (ctx->ExecuteFlag) {
   5139       CALL_ProgramLocalParameters4fvEXT(ctx->Exec, (target, index, count, params));
   5140    }
   5141 }
   5142 
   5143 
   5144 static void GLAPIENTRY
   5145 save_ProgramLocalParameter4dARB(GLenum target, GLuint index,
   5146                                 GLdouble x, GLdouble y,
   5147                                 GLdouble z, GLdouble w)
   5148 {
   5149    GET_CURRENT_CONTEXT(ctx);
   5150    Node *n;
   5151    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5152    n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6);
   5153    if (n) {
   5154       n[1].e = target;
   5155       n[2].ui = index;
   5156       n[3].f = (GLfloat) x;
   5157       n[4].f = (GLfloat) y;
   5158       n[5].f = (GLfloat) z;
   5159       n[6].f = (GLfloat) w;
   5160    }
   5161    if (ctx->ExecuteFlag) {
   5162       CALL_ProgramLocalParameter4dARB(ctx->Exec, (target, index, x, y, z, w));
   5163    }
   5164 }
   5165 
   5166 
   5167 static void GLAPIENTRY
   5168 save_ProgramLocalParameter4dvARB(GLenum target, GLuint index,
   5169                                  const GLdouble *params)
   5170 {
   5171    GET_CURRENT_CONTEXT(ctx);
   5172    Node *n;
   5173    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5174    n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6);
   5175    if (n) {
   5176       n[1].e = target;
   5177       n[2].ui = index;
   5178       n[3].f = (GLfloat) params[0];
   5179       n[4].f = (GLfloat) params[1];
   5180       n[5].f = (GLfloat) params[2];
   5181       n[6].f = (GLfloat) params[3];
   5182    }
   5183    if (ctx->ExecuteFlag) {
   5184       CALL_ProgramLocalParameter4dvARB(ctx->Exec, (target, index, params));
   5185    }
   5186 }
   5187 
   5188 
   5189 /* GL_EXT_stencil_two_side */
   5190 static void GLAPIENTRY
   5191 save_ActiveStencilFaceEXT(GLenum face)
   5192 {
   5193    GET_CURRENT_CONTEXT(ctx);
   5194    Node *n;
   5195    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5196    n = alloc_instruction(ctx, OPCODE_ACTIVE_STENCIL_FACE_EXT, 1);
   5197    if (n) {
   5198       n[1].e = face;
   5199    }
   5200    if (ctx->ExecuteFlag) {
   5201       CALL_ActiveStencilFaceEXT(ctx->Exec, (face));
   5202    }
   5203 }
   5204 
   5205 
   5206 /* GL_EXT_depth_bounds_test */
   5207 static void GLAPIENTRY
   5208 save_DepthBoundsEXT(GLclampd zmin, GLclampd zmax)
   5209 {
   5210    GET_CURRENT_CONTEXT(ctx);
   5211    Node *n;
   5212    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5213    n = alloc_instruction(ctx, OPCODE_DEPTH_BOUNDS_EXT, 2);
   5214    if (n) {
   5215       n[1].f = (GLfloat) zmin;
   5216       n[2].f = (GLfloat) zmax;
   5217    }
   5218    if (ctx->ExecuteFlag) {
   5219       CALL_DepthBoundsEXT(ctx->Exec, (zmin, zmax));
   5220    }
   5221 }
   5222 
   5223 
   5224 
   5225 static void GLAPIENTRY
   5226 save_ProgramStringARB(GLenum target, GLenum format, GLsizei len,
   5227                       const GLvoid * string)
   5228 {
   5229    GET_CURRENT_CONTEXT(ctx);
   5230    Node *n;
   5231 
   5232    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5233 
   5234    n = alloc_instruction(ctx, OPCODE_PROGRAM_STRING_ARB, 3 + POINTER_DWORDS);
   5235    if (n) {
   5236       GLubyte *programCopy = malloc(len);
   5237       if (!programCopy) {
   5238          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB");
   5239          return;
   5240       }
   5241       memcpy(programCopy, string, len);
   5242       n[1].e = target;
   5243       n[2].e = format;
   5244       n[3].i = len;
   5245       save_pointer(&n[4], programCopy);
   5246    }
   5247    if (ctx->ExecuteFlag) {
   5248       CALL_ProgramStringARB(ctx->Exec, (target, format, len, string));
   5249    }
   5250 }
   5251 
   5252 
   5253 static void GLAPIENTRY
   5254 save_BeginQueryARB(GLenum target, GLuint id)
   5255 {
   5256    GET_CURRENT_CONTEXT(ctx);
   5257    Node *n;
   5258    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5259    n = alloc_instruction(ctx, OPCODE_BEGIN_QUERY_ARB, 2);
   5260    if (n) {
   5261       n[1].e = target;
   5262       n[2].ui = id;
   5263    }
   5264    if (ctx->ExecuteFlag) {
   5265       CALL_BeginQuery(ctx->Exec, (target, id));
   5266    }
   5267 }
   5268 
   5269 static void GLAPIENTRY
   5270 save_EndQueryARB(GLenum target)
   5271 {
   5272    GET_CURRENT_CONTEXT(ctx);
   5273    Node *n;
   5274    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5275    n = alloc_instruction(ctx, OPCODE_END_QUERY_ARB, 1);
   5276    if (n) {
   5277       n[1].e = target;
   5278    }
   5279    if (ctx->ExecuteFlag) {
   5280       CALL_EndQuery(ctx->Exec, (target));
   5281    }
   5282 }
   5283 
   5284 static void GLAPIENTRY
   5285 save_QueryCounter(GLuint id, GLenum target)
   5286 {
   5287    GET_CURRENT_CONTEXT(ctx);
   5288    Node *n;
   5289    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5290    n = alloc_instruction(ctx, OPCODE_QUERY_COUNTER, 2);
   5291    if (n) {
   5292       n[1].ui = id;
   5293       n[2].e = target;
   5294    }
   5295    if (ctx->ExecuteFlag) {
   5296       CALL_QueryCounter(ctx->Exec, (id, target));
   5297    }
   5298 }
   5299 
   5300 static void GLAPIENTRY
   5301 save_BeginQueryIndexed(GLenum target, GLuint index, GLuint id)
   5302 {
   5303    GET_CURRENT_CONTEXT(ctx);
   5304    Node *n;
   5305    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5306    n = alloc_instruction(ctx, OPCODE_BEGIN_QUERY_INDEXED, 3);
   5307    if (n) {
   5308       n[1].e = target;
   5309       n[2].ui = index;
   5310       n[3].ui = id;
   5311    }
   5312    if (ctx->ExecuteFlag) {
   5313       CALL_BeginQueryIndexed(ctx->Exec, (target, index, id));
   5314    }
   5315 }
   5316 
   5317 static void GLAPIENTRY
   5318 save_EndQueryIndexed(GLenum target, GLuint index)
   5319 {
   5320    GET_CURRENT_CONTEXT(ctx);
   5321    Node *n;
   5322    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5323    n = alloc_instruction(ctx, OPCODE_END_QUERY_INDEXED, 2);
   5324    if (n) {
   5325       n[1].e = target;
   5326       n[2].ui = index;
   5327    }
   5328    if (ctx->ExecuteFlag) {
   5329       CALL_EndQueryIndexed(ctx->Exec, (target, index));
   5330    }
   5331 }
   5332 
   5333 
   5334 static void GLAPIENTRY
   5335 save_DrawBuffersARB(GLsizei count, const GLenum * buffers)
   5336 {
   5337    GET_CURRENT_CONTEXT(ctx);
   5338    Node *n;
   5339    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5340    n = alloc_instruction(ctx, OPCODE_DRAW_BUFFERS_ARB, 1 + MAX_DRAW_BUFFERS);
   5341    if (n) {
   5342       GLint i;
   5343       n[1].i = count;
   5344       if (count > MAX_DRAW_BUFFERS)
   5345          count = MAX_DRAW_BUFFERS;
   5346       for (i = 0; i < count; i++) {
   5347          n[2 + i].e = buffers[i];
   5348       }
   5349    }
   5350    if (ctx->ExecuteFlag) {
   5351       CALL_DrawBuffers(ctx->Exec, (count, buffers));
   5352    }
   5353 }
   5354 
   5355 static void GLAPIENTRY
   5356 save_BindFragmentShaderATI(GLuint id)
   5357 {
   5358    GET_CURRENT_CONTEXT(ctx);
   5359    Node *n;
   5360 
   5361    n = alloc_instruction(ctx, OPCODE_BIND_FRAGMENT_SHADER_ATI, 1);
   5362    if (n) {
   5363       n[1].ui = id;
   5364    }
   5365    if (ctx->ExecuteFlag) {
   5366       CALL_BindFragmentShaderATI(ctx->Exec, (id));
   5367    }
   5368 }
   5369 
   5370 static void GLAPIENTRY
   5371 save_SetFragmentShaderConstantATI(GLuint dst, const GLfloat *value)
   5372 {
   5373    GET_CURRENT_CONTEXT(ctx);
   5374    Node *n;
   5375 
   5376    n = alloc_instruction(ctx, OPCODE_SET_FRAGMENT_SHADER_CONSTANTS_ATI, 5);
   5377    if (n) {
   5378       n[1].ui = dst;
   5379       n[2].f = value[0];
   5380       n[3].f = value[1];
   5381       n[4].f = value[2];
   5382       n[5].f = value[3];
   5383    }
   5384    if (ctx->ExecuteFlag) {
   5385       CALL_SetFragmentShaderConstantATI(ctx->Exec, (dst, value));
   5386    }
   5387 }
   5388 
   5389 static void GLAPIENTRY
   5390 save_Attr1fNV(GLenum attr, GLfloat x)
   5391 {
   5392    GET_CURRENT_CONTEXT(ctx);
   5393    Node *n;
   5394    SAVE_FLUSH_VERTICES(ctx);
   5395    n = alloc_instruction(ctx, OPCODE_ATTR_1F_NV, 2);
   5396    if (n) {
   5397       n[1].e = attr;
   5398       n[2].f = x;
   5399    }
   5400 
   5401    assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
   5402    ctx->ListState.ActiveAttribSize[attr] = 1;
   5403    ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, 0, 0, 1);
   5404 
   5405    if (ctx->ExecuteFlag) {
   5406       CALL_VertexAttrib1fNV(ctx->Exec, (attr, x));
   5407    }
   5408 }
   5409 
   5410 static void GLAPIENTRY
   5411 save_Attr2fNV(GLenum attr, GLfloat x, GLfloat y)
   5412 {
   5413    GET_CURRENT_CONTEXT(ctx);
   5414    Node *n;
   5415    SAVE_FLUSH_VERTICES(ctx);
   5416    n = alloc_instruction(ctx, OPCODE_ATTR_2F_NV, 3);
   5417    if (n) {
   5418       n[1].e = attr;
   5419       n[2].f = x;
   5420       n[3].f = y;
   5421    }
   5422 
   5423    assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
   5424    ctx->ListState.ActiveAttribSize[attr] = 2;
   5425    ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, 0, 1);
   5426 
   5427    if (ctx->ExecuteFlag) {
   5428       CALL_VertexAttrib2fNV(ctx->Exec, (attr, x, y));
   5429    }
   5430 }
   5431 
   5432 static void GLAPIENTRY
   5433 save_Attr3fNV(GLenum attr, GLfloat x, GLfloat y, GLfloat z)
   5434 {
   5435    GET_CURRENT_CONTEXT(ctx);
   5436    Node *n;
   5437    SAVE_FLUSH_VERTICES(ctx);
   5438    n = alloc_instruction(ctx, OPCODE_ATTR_3F_NV, 4);
   5439    if (n) {
   5440       n[1].e = attr;
   5441       n[2].f = x;
   5442       n[3].f = y;
   5443       n[4].f = z;
   5444    }
   5445 
   5446    assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
   5447    ctx->ListState.ActiveAttribSize[attr] = 3;
   5448    ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, 1);
   5449 
   5450    if (ctx->ExecuteFlag) {
   5451       CALL_VertexAttrib3fNV(ctx->Exec, (attr, x, y, z));
   5452    }
   5453 }
   5454 
   5455 static void GLAPIENTRY
   5456 save_Attr4fNV(GLenum attr, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
   5457 {
   5458    GET_CURRENT_CONTEXT(ctx);
   5459    Node *n;
   5460    SAVE_FLUSH_VERTICES(ctx);
   5461    n = alloc_instruction(ctx, OPCODE_ATTR_4F_NV, 5);
   5462    if (n) {
   5463       n[1].e = attr;
   5464       n[2].f = x;
   5465       n[3].f = y;
   5466       n[4].f = z;
   5467       n[5].f = w;
   5468    }
   5469 
   5470    assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
   5471    ctx->ListState.ActiveAttribSize[attr] = 4;
   5472    ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, w);
   5473 
   5474    if (ctx->ExecuteFlag) {
   5475       CALL_VertexAttrib4fNV(ctx->Exec, (attr, x, y, z, w));
   5476    }
   5477 }
   5478 
   5479 
   5480 static void GLAPIENTRY
   5481 save_Attr1fARB(GLenum attr, GLfloat x)
   5482 {
   5483    GET_CURRENT_CONTEXT(ctx);
   5484    Node *n;
   5485    SAVE_FLUSH_VERTICES(ctx);
   5486    n = alloc_instruction(ctx, OPCODE_ATTR_1F_ARB, 2);
   5487    if (n) {
   5488       n[1].e = attr;
   5489       n[2].f = x;
   5490    }
   5491 
   5492    assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
   5493    ctx->ListState.ActiveAttribSize[attr] = 1;
   5494    ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, 0, 0, 1);
   5495 
   5496    if (ctx->ExecuteFlag) {
   5497       CALL_VertexAttrib1fARB(ctx->Exec, (attr, x));
   5498    }
   5499 }
   5500 
   5501 static void GLAPIENTRY
   5502 save_Attr2fARB(GLenum attr, GLfloat x, GLfloat y)
   5503 {
   5504    GET_CURRENT_CONTEXT(ctx);
   5505    Node *n;
   5506    SAVE_FLUSH_VERTICES(ctx);
   5507    n = alloc_instruction(ctx, OPCODE_ATTR_2F_ARB, 3);
   5508    if (n) {
   5509       n[1].e = attr;
   5510       n[2].f = x;
   5511       n[3].f = y;
   5512    }
   5513 
   5514    assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
   5515    ctx->ListState.ActiveAttribSize[attr] = 2;
   5516    ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, 0, 1);
   5517 
   5518    if (ctx->ExecuteFlag) {
   5519       CALL_VertexAttrib2fARB(ctx->Exec, (attr, x, y));
   5520    }
   5521 }
   5522 
   5523 static void GLAPIENTRY
   5524 save_Attr3fARB(GLenum attr, GLfloat x, GLfloat y, GLfloat z)
   5525 {
   5526    GET_CURRENT_CONTEXT(ctx);
   5527    Node *n;
   5528    SAVE_FLUSH_VERTICES(ctx);
   5529    n = alloc_instruction(ctx, OPCODE_ATTR_3F_ARB, 4);
   5530    if (n) {
   5531       n[1].e = attr;
   5532       n[2].f = x;
   5533       n[3].f = y;
   5534       n[4].f = z;
   5535    }
   5536 
   5537    assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
   5538    ctx->ListState.ActiveAttribSize[attr] = 3;
   5539    ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, 1);
   5540 
   5541    if (ctx->ExecuteFlag) {
   5542       CALL_VertexAttrib3fARB(ctx->Exec, (attr, x, y, z));
   5543    }
   5544 }
   5545 
   5546 static void GLAPIENTRY
   5547 save_Attr4fARB(GLenum attr, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
   5548 {
   5549    GET_CURRENT_CONTEXT(ctx);
   5550    Node *n;
   5551    SAVE_FLUSH_VERTICES(ctx);
   5552    n = alloc_instruction(ctx, OPCODE_ATTR_4F_ARB, 5);
   5553    if (n) {
   5554       n[1].e = attr;
   5555       n[2].f = x;
   5556       n[3].f = y;
   5557       n[4].f = z;
   5558       n[5].f = w;
   5559    }
   5560 
   5561    assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
   5562    ctx->ListState.ActiveAttribSize[attr] = 4;
   5563    ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, w);
   5564 
   5565    if (ctx->ExecuteFlag) {
   5566       CALL_VertexAttrib4fARB(ctx->Exec, (attr, x, y, z, w));
   5567    }
   5568 }
   5569 
   5570 
   5571 static void GLAPIENTRY
   5572 save_EvalCoord1f(GLfloat x)
   5573 {
   5574    GET_CURRENT_CONTEXT(ctx);
   5575    Node *n;
   5576    SAVE_FLUSH_VERTICES(ctx);
   5577    n = alloc_instruction(ctx, OPCODE_EVAL_C1, 1);
   5578    if (n) {
   5579       n[1].f = x;
   5580    }
   5581    if (ctx->ExecuteFlag) {
   5582       CALL_EvalCoord1f(ctx->Exec, (x));
   5583    }
   5584 }
   5585 
   5586 static void GLAPIENTRY
   5587 save_EvalCoord1fv(const GLfloat * v)
   5588 {
   5589    save_EvalCoord1f(v[0]);
   5590 }
   5591 
   5592 static void GLAPIENTRY
   5593 save_EvalCoord2f(GLfloat x, GLfloat y)
   5594 {
   5595    GET_CURRENT_CONTEXT(ctx);
   5596    Node *n;
   5597    SAVE_FLUSH_VERTICES(ctx);
   5598    n = alloc_instruction(ctx, OPCODE_EVAL_C2, 2);
   5599    if (n) {
   5600       n[1].f = x;
   5601       n[2].f = y;
   5602    }
   5603    if (ctx->ExecuteFlag) {
   5604       CALL_EvalCoord2f(ctx->Exec, (x, y));
   5605    }
   5606 }
   5607 
   5608 static void GLAPIENTRY
   5609 save_EvalCoord2fv(const GLfloat * v)
   5610 {
   5611    save_EvalCoord2f(v[0], v[1]);
   5612 }
   5613 
   5614 
   5615 static void GLAPIENTRY
   5616 save_EvalPoint1(GLint x)
   5617 {
   5618    GET_CURRENT_CONTEXT(ctx);
   5619    Node *n;
   5620    SAVE_FLUSH_VERTICES(ctx);
   5621    n = alloc_instruction(ctx, OPCODE_EVAL_P1, 1);
   5622    if (n) {
   5623       n[1].i = x;
   5624    }
   5625    if (ctx->ExecuteFlag) {
   5626       CALL_EvalPoint1(ctx->Exec, (x));
   5627    }
   5628 }
   5629 
   5630 static void GLAPIENTRY
   5631 save_EvalPoint2(GLint x, GLint y)
   5632 {
   5633    GET_CURRENT_CONTEXT(ctx);
   5634    Node *n;
   5635    SAVE_FLUSH_VERTICES(ctx);
   5636    n = alloc_instruction(ctx, OPCODE_EVAL_P2, 2);
   5637    if (n) {
   5638       n[1].i = x;
   5639       n[2].i = y;
   5640    }
   5641    if (ctx->ExecuteFlag) {
   5642       CALL_EvalPoint2(ctx->Exec, (x, y));
   5643    }
   5644 }
   5645 
   5646 static void GLAPIENTRY
   5647 save_Indexf(GLfloat x)
   5648 {
   5649    save_Attr1fNV(VERT_ATTRIB_COLOR_INDEX, x);
   5650 }
   5651 
   5652 static void GLAPIENTRY
   5653 save_Indexfv(const GLfloat * v)
   5654 {
   5655    save_Attr1fNV(VERT_ATTRIB_COLOR_INDEX, v[0]);
   5656 }
   5657 
   5658 static void GLAPIENTRY
   5659 save_EdgeFlag(GLboolean x)
   5660 {
   5661    save_Attr1fNV(VERT_ATTRIB_EDGEFLAG, x ? 1.0f : 0.0f);
   5662 }
   5663 
   5664 
   5665 /**
   5666  * Compare 'count' elements of vectors 'a' and 'b'.
   5667  * \return GL_TRUE if equal, GL_FALSE if different.
   5668  */
   5669 static inline GLboolean
   5670 compare_vec(const GLfloat *a, const GLfloat *b, GLuint count)
   5671 {
   5672    return memcmp( a, b, count * sizeof(GLfloat) ) == 0;
   5673 }
   5674 
   5675 
   5676 /**
   5677  * This glMaterial function is used for glMaterial calls that are outside
   5678  * a glBegin/End pair.  For glMaterial inside glBegin/End, see the VBO code.
   5679  */
   5680 static void GLAPIENTRY
   5681 save_Materialfv(GLenum face, GLenum pname, const GLfloat * param)
   5682 {
   5683    GET_CURRENT_CONTEXT(ctx);
   5684    Node *n;
   5685    int args, i;
   5686    GLuint bitmask;
   5687 
   5688    switch (face) {
   5689    case GL_BACK:
   5690    case GL_FRONT:
   5691    case GL_FRONT_AND_BACK:
   5692       break;
   5693    default:
   5694       _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(face)");
   5695       return;
   5696    }
   5697 
   5698    switch (pname) {
   5699    case GL_EMISSION:
   5700    case GL_AMBIENT:
   5701    case GL_DIFFUSE:
   5702    case GL_SPECULAR:
   5703    case GL_AMBIENT_AND_DIFFUSE:
   5704       args = 4;
   5705       break;
   5706    case GL_SHININESS:
   5707       args = 1;
   5708       break;
   5709    case GL_COLOR_INDEXES:
   5710       args = 3;
   5711       break;
   5712    default:
   5713       _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(pname)");
   5714       return;
   5715    }
   5716 
   5717    if (ctx->ExecuteFlag) {
   5718       CALL_Materialfv(ctx->Exec, (face, pname, param));
   5719    }
   5720 
   5721    bitmask = _mesa_material_bitmask(ctx, face, pname, ~0, NULL);
   5722 
   5723    /* Try to eliminate redundant statechanges.  Because it is legal to
   5724     * call glMaterial even inside begin/end calls, don't need to worry
   5725     * about ctx->Driver.CurrentSavePrimitive here.
   5726     */
   5727    for (i = 0; i < MAT_ATTRIB_MAX; i++) {
   5728       if (bitmask & (1 << i)) {
   5729          if (ctx->ListState.ActiveMaterialSize[i] == args &&
   5730              compare_vec(ctx->ListState.CurrentMaterial[i], param, args)) {
   5731             /* no change in material value */
   5732             bitmask &= ~(1 << i);
   5733          }
   5734          else {
   5735             ctx->ListState.ActiveMaterialSize[i] = args;
   5736             COPY_SZ_4V(ctx->ListState.CurrentMaterial[i], args, param);
   5737          }
   5738       }
   5739    }
   5740 
   5741    /* If this call has no effect, return early */
   5742    if (bitmask == 0)
   5743       return;
   5744 
   5745    SAVE_FLUSH_VERTICES(ctx);
   5746 
   5747    n = alloc_instruction(ctx, OPCODE_MATERIAL, 6);
   5748    if (n) {
   5749       n[1].e = face;
   5750       n[2].e = pname;
   5751       for (i = 0; i < args; i++)
   5752          n[3 + i].f = param[i];
   5753    }
   5754 }
   5755 
   5756 static void GLAPIENTRY
   5757 save_Begin(GLenum mode)
   5758 {
   5759    GET_CURRENT_CONTEXT(ctx);
   5760 
   5761    if (!_mesa_is_valid_prim_mode(ctx, mode)) {
   5762       /* compile this error into the display list */
   5763       _mesa_compile_error(ctx, GL_INVALID_ENUM, "glBegin(mode)");
   5764    }
   5765    else if (_mesa_inside_dlist_begin_end(ctx)) {
   5766       /* compile this error into the display list */
   5767       _mesa_compile_error(ctx, GL_INVALID_OPERATION, "recursive glBegin");
   5768    }
   5769    else {
   5770       ctx->Driver.CurrentSavePrimitive = mode;
   5771 
   5772       vbo_save_NotifyBegin(ctx, mode);
   5773    }
   5774 }
   5775 
   5776 static void GLAPIENTRY
   5777 save_End(void)
   5778 {
   5779    GET_CURRENT_CONTEXT(ctx);
   5780    SAVE_FLUSH_VERTICES(ctx);
   5781    (void) alloc_instruction(ctx, OPCODE_END, 0);
   5782    ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END;
   5783    if (ctx->ExecuteFlag) {
   5784       CALL_End(ctx->Exec, ());
   5785    }
   5786 }
   5787 
   5788 static void GLAPIENTRY
   5789 save_Rectf(GLfloat a, GLfloat b, GLfloat c, GLfloat d)
   5790 {
   5791    GET_CURRENT_CONTEXT(ctx);
   5792    Node *n;
   5793    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   5794    n = alloc_instruction(ctx, OPCODE_RECTF, 4);
   5795    if (n) {
   5796       n[1].f = a;
   5797       n[2].f = b;
   5798       n[3].f = c;
   5799       n[4].f = d;
   5800    }
   5801    if (ctx->ExecuteFlag) {
   5802       CALL_Rectf(ctx->Exec, (a, b, c, d));
   5803    }
   5804 }
   5805 
   5806 
   5807 static void GLAPIENTRY
   5808 save_Vertex2f(GLfloat x, GLfloat y)
   5809 {
   5810    save_Attr2fNV(VERT_ATTRIB_POS, x, y);
   5811 }
   5812 
   5813 static void GLAPIENTRY
   5814 save_Vertex2fv(const GLfloat * v)
   5815 {
   5816    save_Attr2fNV(VERT_ATTRIB_POS, v[0], v[1]);
   5817 }
   5818 
   5819 static void GLAPIENTRY
   5820 save_Vertex3f(GLfloat x, GLfloat y, GLfloat z)
   5821 {
   5822    save_Attr3fNV(VERT_ATTRIB_POS, x, y, z);
   5823 }
   5824 
   5825 static void GLAPIENTRY
   5826 save_Vertex3fv(const GLfloat * v)
   5827 {
   5828    save_Attr3fNV(VERT_ATTRIB_POS, v[0], v[1], v[2]);
   5829 }
   5830 
   5831 static void GLAPIENTRY
   5832 save_Vertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
   5833 {
   5834    save_Attr4fNV(VERT_ATTRIB_POS, x, y, z, w);
   5835 }
   5836 
   5837 static void GLAPIENTRY
   5838 save_Vertex4fv(const GLfloat * v)
   5839 {
   5840    save_Attr4fNV(VERT_ATTRIB_POS, v[0], v[1], v[2], v[3]);
   5841 }
   5842 
   5843 static void GLAPIENTRY
   5844 save_TexCoord1f(GLfloat x)
   5845 {
   5846    save_Attr1fNV(VERT_ATTRIB_TEX0, x);
   5847 }
   5848 
   5849 static void GLAPIENTRY
   5850 save_TexCoord1fv(const GLfloat * v)
   5851 {
   5852    save_Attr1fNV(VERT_ATTRIB_TEX0, v[0]);
   5853 }
   5854 
   5855 static void GLAPIENTRY
   5856 save_TexCoord2f(GLfloat x, GLfloat y)
   5857 {
   5858    save_Attr2fNV(VERT_ATTRIB_TEX0, x, y);
   5859 }
   5860 
   5861 static void GLAPIENTRY
   5862 save_TexCoord2fv(const GLfloat * v)
   5863 {
   5864    save_Attr2fNV(VERT_ATTRIB_TEX0, v[0], v[1]);
   5865 }
   5866 
   5867 static void GLAPIENTRY
   5868 save_TexCoord3f(GLfloat x, GLfloat y, GLfloat z)
   5869 {
   5870    save_Attr3fNV(VERT_ATTRIB_TEX0, x, y, z);
   5871 }
   5872 
   5873 static void GLAPIENTRY
   5874 save_TexCoord3fv(const GLfloat * v)
   5875 {
   5876    save_Attr3fNV(VERT_ATTRIB_TEX0, v[0], v[1], v[2]);
   5877 }
   5878 
   5879 static void GLAPIENTRY
   5880 save_TexCoord4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
   5881 {
   5882    save_Attr4fNV(VERT_ATTRIB_TEX0, x, y, z, w);
   5883 }
   5884 
   5885 static void GLAPIENTRY
   5886 save_TexCoord4fv(const GLfloat * v)
   5887 {
   5888    save_Attr4fNV(VERT_ATTRIB_TEX0, v[0], v[1], v[2], v[3]);
   5889 }
   5890 
   5891 static void GLAPIENTRY
   5892 save_Normal3f(GLfloat x, GLfloat y, GLfloat z)
   5893 {
   5894    save_Attr3fNV(VERT_ATTRIB_NORMAL, x, y, z);
   5895 }
   5896 
   5897 static void GLAPIENTRY
   5898 save_Normal3fv(const GLfloat * v)
   5899 {
   5900    save_Attr3fNV(VERT_ATTRIB_NORMAL, v[0], v[1], v[2]);
   5901 }
   5902 
   5903 static void GLAPIENTRY
   5904 save_FogCoordfEXT(GLfloat x)
   5905 {
   5906    save_Attr1fNV(VERT_ATTRIB_FOG, x);
   5907 }
   5908 
   5909 static void GLAPIENTRY
   5910 save_FogCoordfvEXT(const GLfloat * v)
   5911 {
   5912    save_Attr1fNV(VERT_ATTRIB_FOG, v[0]);
   5913 }
   5914 
   5915 static void GLAPIENTRY
   5916 save_Color3f(GLfloat x, GLfloat y, GLfloat z)
   5917 {
   5918    save_Attr3fNV(VERT_ATTRIB_COLOR0, x, y, z);
   5919 }
   5920 
   5921 static void GLAPIENTRY
   5922 save_Color3fv(const GLfloat * v)
   5923 {
   5924    save_Attr3fNV(VERT_ATTRIB_COLOR0, v[0], v[1], v[2]);
   5925 }
   5926 
   5927 static void GLAPIENTRY
   5928 save_Color4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
   5929 {
   5930    save_Attr4fNV(VERT_ATTRIB_COLOR0, x, y, z, w);
   5931 }
   5932 
   5933 static void GLAPIENTRY
   5934 save_Color4fv(const GLfloat * v)
   5935 {
   5936    save_Attr4fNV(VERT_ATTRIB_COLOR0, v[0], v[1], v[2], v[3]);
   5937 }
   5938 
   5939 static void GLAPIENTRY
   5940 save_SecondaryColor3fEXT(GLfloat x, GLfloat y, GLfloat z)
   5941 {
   5942    save_Attr3fNV(VERT_ATTRIB_COLOR1, x, y, z);
   5943 }
   5944 
   5945 static void GLAPIENTRY
   5946 save_SecondaryColor3fvEXT(const GLfloat * v)
   5947 {
   5948    save_Attr3fNV(VERT_ATTRIB_COLOR1, v[0], v[1], v[2]);
   5949 }
   5950 
   5951 
   5952 /* Just call the respective ATTR for texcoord
   5953  */
   5954 static void GLAPIENTRY
   5955 save_MultiTexCoord1f(GLenum target, GLfloat x)
   5956 {
   5957    GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
   5958    save_Attr1fNV(attr, x);
   5959 }
   5960 
   5961 static void GLAPIENTRY
   5962 save_MultiTexCoord1fv(GLenum target, const GLfloat * v)
   5963 {
   5964    GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
   5965    save_Attr1fNV(attr, v[0]);
   5966 }
   5967 
   5968 static void GLAPIENTRY
   5969 save_MultiTexCoord2f(GLenum target, GLfloat x, GLfloat y)
   5970 {
   5971    GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
   5972    save_Attr2fNV(attr, x, y);
   5973 }
   5974 
   5975 static void GLAPIENTRY
   5976 save_MultiTexCoord2fv(GLenum target, const GLfloat * v)
   5977 {
   5978    GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
   5979    save_Attr2fNV(attr, v[0], v[1]);
   5980 }
   5981 
   5982 static void GLAPIENTRY
   5983 save_MultiTexCoord3f(GLenum target, GLfloat x, GLfloat y, GLfloat z)
   5984 {
   5985    GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
   5986    save_Attr3fNV(attr, x, y, z);
   5987 }
   5988 
   5989 static void GLAPIENTRY
   5990 save_MultiTexCoord3fv(GLenum target, const GLfloat * v)
   5991 {
   5992    GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
   5993    save_Attr3fNV(attr, v[0], v[1], v[2]);
   5994 }
   5995 
   5996 static void GLAPIENTRY
   5997 save_MultiTexCoord4f(GLenum target, GLfloat x, GLfloat y,
   5998                      GLfloat z, GLfloat w)
   5999 {
   6000    GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
   6001    save_Attr4fNV(attr, x, y, z, w);
   6002 }
   6003 
   6004 static void GLAPIENTRY
   6005 save_MultiTexCoord4fv(GLenum target, const GLfloat * v)
   6006 {
   6007    GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
   6008    save_Attr4fNV(attr, v[0], v[1], v[2], v[3]);
   6009 }
   6010 
   6011 
   6012 /**
   6013  * Record a GL_INVALID_VALUE error when an invalid vertex attribute
   6014  * index is found.
   6015  */
   6016 static void
   6017 index_error(void)
   6018 {
   6019    GET_CURRENT_CONTEXT(ctx);
   6020    _mesa_error(ctx, GL_INVALID_VALUE, "VertexAttribf(index)");
   6021 }
   6022 
   6023 
   6024 
   6025 static void GLAPIENTRY
   6026 save_VertexAttrib1fARB(GLuint index, GLfloat x)
   6027 {
   6028    if (index < MAX_VERTEX_GENERIC_ATTRIBS)
   6029       save_Attr1fARB(index, x);
   6030    else
   6031       index_error();
   6032 }
   6033 
   6034 static void GLAPIENTRY
   6035 save_VertexAttrib1fvARB(GLuint index, const GLfloat * v)
   6036 {
   6037    if (index < MAX_VERTEX_GENERIC_ATTRIBS)
   6038       save_Attr1fARB(index, v[0]);
   6039    else
   6040       index_error();
   6041 }
   6042 
   6043 static void GLAPIENTRY
   6044 save_VertexAttrib2fARB(GLuint index, GLfloat x, GLfloat y)
   6045 {
   6046    if (index < MAX_VERTEX_GENERIC_ATTRIBS)
   6047       save_Attr2fARB(index, x, y);
   6048    else
   6049       index_error();
   6050 }
   6051 
   6052 static void GLAPIENTRY
   6053 save_VertexAttrib2fvARB(GLuint index, const GLfloat * v)
   6054 {
   6055    if (index < MAX_VERTEX_GENERIC_ATTRIBS)
   6056       save_Attr2fARB(index, v[0], v[1]);
   6057    else
   6058       index_error();
   6059 }
   6060 
   6061 static void GLAPIENTRY
   6062 save_VertexAttrib3fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z)
   6063 {
   6064    if (index < MAX_VERTEX_GENERIC_ATTRIBS)
   6065       save_Attr3fARB(index, x, y, z);
   6066    else
   6067       index_error();
   6068 }
   6069 
   6070 static void GLAPIENTRY
   6071 save_VertexAttrib3fvARB(GLuint index, const GLfloat * v)
   6072 {
   6073    if (index < MAX_VERTEX_GENERIC_ATTRIBS)
   6074       save_Attr3fARB(index, v[0], v[1], v[2]);
   6075    else
   6076       index_error();
   6077 }
   6078 
   6079 static void GLAPIENTRY
   6080 save_VertexAttrib4fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z,
   6081                        GLfloat w)
   6082 {
   6083    if (index < MAX_VERTEX_GENERIC_ATTRIBS)
   6084       save_Attr4fARB(index, x, y, z, w);
   6085    else
   6086       index_error();
   6087 }
   6088 
   6089 static void GLAPIENTRY
   6090 save_VertexAttrib4fvARB(GLuint index, const GLfloat * v)
   6091 {
   6092    if (index < MAX_VERTEX_GENERIC_ATTRIBS)
   6093       save_Attr4fARB(index, v[0], v[1], v[2], v[3]);
   6094    else
   6095       index_error();
   6096 }
   6097 
   6098 static void GLAPIENTRY
   6099 save_PrimitiveRestartNV(void)
   6100 {
   6101    /* Note: this is used when outside a glBegin/End pair in a display list */
   6102    GET_CURRENT_CONTEXT(ctx);
   6103    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6104    (void) alloc_instruction(ctx, OPCODE_PRIMITIVE_RESTART_NV, 0);
   6105    if (ctx->ExecuteFlag) {
   6106       CALL_PrimitiveRestartNV(ctx->Exec, ());
   6107    }
   6108 }
   6109 
   6110 
   6111 static void GLAPIENTRY
   6112 save_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
   6113                         GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
   6114                         GLbitfield mask, GLenum filter)
   6115 {
   6116    GET_CURRENT_CONTEXT(ctx);
   6117    Node *n;
   6118    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6119    n = alloc_instruction(ctx, OPCODE_BLIT_FRAMEBUFFER, 10);
   6120    if (n) {
   6121       n[1].i = srcX0;
   6122       n[2].i = srcY0;
   6123       n[3].i = srcX1;
   6124       n[4].i = srcY1;
   6125       n[5].i = dstX0;
   6126       n[6].i = dstY0;
   6127       n[7].i = dstX1;
   6128       n[8].i = dstY1;
   6129       n[9].i = mask;
   6130       n[10].e = filter;
   6131    }
   6132    if (ctx->ExecuteFlag) {
   6133       CALL_BlitFramebuffer(ctx->Exec, (srcX0, srcY0, srcX1, srcY1,
   6134                                           dstX0, dstY0, dstX1, dstY1,
   6135                                           mask, filter));
   6136    }
   6137 }
   6138 
   6139 
   6140 /** GL_EXT_provoking_vertex */
   6141 static void GLAPIENTRY
   6142 save_ProvokingVertexEXT(GLenum mode)
   6143 {
   6144    GET_CURRENT_CONTEXT(ctx);
   6145    Node *n;
   6146    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6147    n = alloc_instruction(ctx, OPCODE_PROVOKING_VERTEX, 1);
   6148    if (n) {
   6149       n[1].e = mode;
   6150    }
   6151    if (ctx->ExecuteFlag) {
   6152       /*CALL_ProvokingVertex(ctx->Exec, (mode));*/
   6153       _mesa_ProvokingVertex(mode);
   6154    }
   6155 }
   6156 
   6157 
   6158 /** GL_EXT_transform_feedback */
   6159 static void GLAPIENTRY
   6160 save_BeginTransformFeedback(GLenum mode)
   6161 {
   6162    GET_CURRENT_CONTEXT(ctx);
   6163    Node *n;
   6164    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6165    n = alloc_instruction(ctx, OPCODE_BEGIN_TRANSFORM_FEEDBACK, 1);
   6166    if (n) {
   6167       n[1].e = mode;
   6168    }
   6169    if (ctx->ExecuteFlag) {
   6170       CALL_BeginTransformFeedback(ctx->Exec, (mode));
   6171    }
   6172 }
   6173 
   6174 
   6175 /** GL_EXT_transform_feedback */
   6176 static void GLAPIENTRY
   6177 save_EndTransformFeedback(void)
   6178 {
   6179    GET_CURRENT_CONTEXT(ctx);
   6180    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6181    (void) alloc_instruction(ctx, OPCODE_END_TRANSFORM_FEEDBACK, 0);
   6182    if (ctx->ExecuteFlag) {
   6183       CALL_EndTransformFeedback(ctx->Exec, ());
   6184    }
   6185 }
   6186 
   6187 static void GLAPIENTRY
   6188 save_BindTransformFeedback(GLenum target, GLuint name)
   6189 {
   6190    GET_CURRENT_CONTEXT(ctx);
   6191    Node *n;
   6192    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6193    n = alloc_instruction(ctx, OPCODE_BIND_TRANSFORM_FEEDBACK, 2);
   6194    if (n) {
   6195       n[1].e = target;
   6196       n[2].ui = name;
   6197    }
   6198    if (ctx->ExecuteFlag) {
   6199       CALL_BindTransformFeedback(ctx->Exec, (target, name));
   6200    }
   6201 }
   6202 
   6203 static void GLAPIENTRY
   6204 save_PauseTransformFeedback(void)
   6205 {
   6206    GET_CURRENT_CONTEXT(ctx);
   6207    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6208    (void) alloc_instruction(ctx, OPCODE_PAUSE_TRANSFORM_FEEDBACK, 0);
   6209    if (ctx->ExecuteFlag) {
   6210       CALL_PauseTransformFeedback(ctx->Exec, ());
   6211    }
   6212 }
   6213 
   6214 static void GLAPIENTRY
   6215 save_ResumeTransformFeedback(void)
   6216 {
   6217    GET_CURRENT_CONTEXT(ctx);
   6218    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6219    (void) alloc_instruction(ctx, OPCODE_RESUME_TRANSFORM_FEEDBACK, 0);
   6220    if (ctx->ExecuteFlag) {
   6221       CALL_ResumeTransformFeedback(ctx->Exec, ());
   6222    }
   6223 }
   6224 
   6225 static void GLAPIENTRY
   6226 save_DrawTransformFeedback(GLenum mode, GLuint name)
   6227 {
   6228    GET_CURRENT_CONTEXT(ctx);
   6229    Node *n;
   6230    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6231    n = alloc_instruction(ctx, OPCODE_DRAW_TRANSFORM_FEEDBACK, 2);
   6232    if (n) {
   6233       n[1].e = mode;
   6234       n[2].ui = name;
   6235    }
   6236    if (ctx->ExecuteFlag) {
   6237       CALL_DrawTransformFeedback(ctx->Exec, (mode, name));
   6238    }
   6239 }
   6240 
   6241 static void GLAPIENTRY
   6242 save_DrawTransformFeedbackStream(GLenum mode, GLuint name, GLuint stream)
   6243 {
   6244    GET_CURRENT_CONTEXT(ctx);
   6245    Node *n;
   6246    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6247    n = alloc_instruction(ctx, OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM, 3);
   6248    if (n) {
   6249       n[1].e = mode;
   6250       n[2].ui = name;
   6251       n[3].ui = stream;
   6252    }
   6253    if (ctx->ExecuteFlag) {
   6254       CALL_DrawTransformFeedbackStream(ctx->Exec, (mode, name, stream));
   6255    }
   6256 }
   6257 
   6258 static void GLAPIENTRY
   6259 save_DrawTransformFeedbackInstanced(GLenum mode, GLuint name,
   6260                                     GLsizei primcount)
   6261 {
   6262    GET_CURRENT_CONTEXT(ctx);
   6263    Node *n;
   6264    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6265    n = alloc_instruction(ctx, OPCODE_DRAW_TRANSFORM_FEEDBACK_INSTANCED, 3);
   6266    if (n) {
   6267       n[1].e = mode;
   6268       n[2].ui = name;
   6269       n[3].si = primcount;
   6270    }
   6271    if (ctx->ExecuteFlag) {
   6272       CALL_DrawTransformFeedbackInstanced(ctx->Exec, (mode, name, primcount));
   6273    }
   6274 }
   6275 
   6276 static void GLAPIENTRY
   6277 save_DrawTransformFeedbackStreamInstanced(GLenum mode, GLuint name,
   6278                                           GLuint stream, GLsizei primcount)
   6279 {
   6280    GET_CURRENT_CONTEXT(ctx);
   6281    Node *n;
   6282    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6283    n = alloc_instruction(ctx, OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM_INSTANCED, 4);
   6284    if (n) {
   6285       n[1].e = mode;
   6286       n[2].ui = name;
   6287       n[3].ui = stream;
   6288       n[4].si = primcount;
   6289    }
   6290    if (ctx->ExecuteFlag) {
   6291       CALL_DrawTransformFeedbackStreamInstanced(ctx->Exec, (mode, name, stream,
   6292                                                             primcount));
   6293    }
   6294 }
   6295 
   6296 static void GLAPIENTRY
   6297 save_UseProgram(GLuint program)
   6298 {
   6299    GET_CURRENT_CONTEXT(ctx);
   6300    Node *n;
   6301    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6302    n = alloc_instruction(ctx, OPCODE_USE_PROGRAM, 1);
   6303    if (n) {
   6304       n[1].ui = program;
   6305    }
   6306    if (ctx->ExecuteFlag) {
   6307       CALL_UseProgram(ctx->Exec, (program));
   6308    }
   6309 }
   6310 
   6311 
   6312 static void GLAPIENTRY
   6313 save_Uniform1fARB(GLint location, GLfloat x)
   6314 {
   6315    GET_CURRENT_CONTEXT(ctx);
   6316    Node *n;
   6317    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6318    n = alloc_instruction(ctx, OPCODE_UNIFORM_1F, 2);
   6319    if (n) {
   6320       n[1].i = location;
   6321       n[2].f = x;
   6322    }
   6323    if (ctx->ExecuteFlag) {
   6324       CALL_Uniform1f(ctx->Exec, (location, x));
   6325    }
   6326 }
   6327 
   6328 
   6329 static void GLAPIENTRY
   6330 save_Uniform2fARB(GLint location, GLfloat x, GLfloat y)
   6331 {
   6332    GET_CURRENT_CONTEXT(ctx);
   6333    Node *n;
   6334    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6335    n = alloc_instruction(ctx, OPCODE_UNIFORM_2F, 3);
   6336    if (n) {
   6337       n[1].i = location;
   6338       n[2].f = x;
   6339       n[3].f = y;
   6340    }
   6341    if (ctx->ExecuteFlag) {
   6342       CALL_Uniform2f(ctx->Exec, (location, x, y));
   6343    }
   6344 }
   6345 
   6346 
   6347 static void GLAPIENTRY
   6348 save_Uniform3fARB(GLint location, GLfloat x, GLfloat y, GLfloat z)
   6349 {
   6350    GET_CURRENT_CONTEXT(ctx);
   6351    Node *n;
   6352    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6353    n = alloc_instruction(ctx, OPCODE_UNIFORM_3F, 4);
   6354    if (n) {
   6355       n[1].i = location;
   6356       n[2].f = x;
   6357       n[3].f = y;
   6358       n[4].f = z;
   6359    }
   6360    if (ctx->ExecuteFlag) {
   6361       CALL_Uniform3f(ctx->Exec, (location, x, y, z));
   6362    }
   6363 }
   6364 
   6365 
   6366 static void GLAPIENTRY
   6367 save_Uniform4fARB(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
   6368 {
   6369    GET_CURRENT_CONTEXT(ctx);
   6370    Node *n;
   6371    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6372    n = alloc_instruction(ctx, OPCODE_UNIFORM_4F, 5);
   6373    if (n) {
   6374       n[1].i = location;
   6375       n[2].f = x;
   6376       n[3].f = y;
   6377       n[4].f = z;
   6378       n[5].f = w;
   6379    }
   6380    if (ctx->ExecuteFlag) {
   6381       CALL_Uniform4f(ctx->Exec, (location, x, y, z, w));
   6382    }
   6383 }
   6384 
   6385 
   6386 static void GLAPIENTRY
   6387 save_Uniform1fvARB(GLint location, GLsizei count, const GLfloat *v)
   6388 {
   6389    GET_CURRENT_CONTEXT(ctx);
   6390    Node *n;
   6391    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6392    n = alloc_instruction(ctx, OPCODE_UNIFORM_1FV, 2 + POINTER_DWORDS);
   6393    if (n) {
   6394       n[1].i = location;
   6395       n[2].i = count;
   6396       save_pointer(&n[3], memdup(v, count * 1 * sizeof(GLfloat)));
   6397    }
   6398    if (ctx->ExecuteFlag) {
   6399       CALL_Uniform1fv(ctx->Exec, (location, count, v));
   6400    }
   6401 }
   6402 
   6403 static void GLAPIENTRY
   6404 save_Uniform2fvARB(GLint location, GLsizei count, const GLfloat *v)
   6405 {
   6406    GET_CURRENT_CONTEXT(ctx);
   6407    Node *n;
   6408    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6409    n = alloc_instruction(ctx, OPCODE_UNIFORM_2FV, 2 + POINTER_DWORDS);
   6410    if (n) {
   6411       n[1].i = location;
   6412       n[2].i = count;
   6413       save_pointer(&n[3], memdup(v, count * 2 * sizeof(GLfloat)));
   6414    }
   6415    if (ctx->ExecuteFlag) {
   6416       CALL_Uniform2fv(ctx->Exec, (location, count, v));
   6417    }
   6418 }
   6419 
   6420 static void GLAPIENTRY
   6421 save_Uniform3fvARB(GLint location, GLsizei count, const GLfloat *v)
   6422 {
   6423    GET_CURRENT_CONTEXT(ctx);
   6424    Node *n;
   6425    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6426    n = alloc_instruction(ctx, OPCODE_UNIFORM_3FV, 2 + POINTER_DWORDS);
   6427    if (n) {
   6428       n[1].i = location;
   6429       n[2].i = count;
   6430       save_pointer(&n[3], memdup(v, count * 3 * sizeof(GLfloat)));
   6431    }
   6432    if (ctx->ExecuteFlag) {
   6433       CALL_Uniform3fv(ctx->Exec, (location, count, v));
   6434    }
   6435 }
   6436 
   6437 static void GLAPIENTRY
   6438 save_Uniform4fvARB(GLint location, GLsizei count, const GLfloat *v)
   6439 {
   6440    GET_CURRENT_CONTEXT(ctx);
   6441    Node *n;
   6442    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6443    n = alloc_instruction(ctx, OPCODE_UNIFORM_4FV, 2 + POINTER_DWORDS);
   6444    if (n) {
   6445       n[1].i = location;
   6446       n[2].i = count;
   6447       save_pointer(&n[3], memdup(v, count * 4 * sizeof(GLfloat)));
   6448    }
   6449    if (ctx->ExecuteFlag) {
   6450       CALL_Uniform4fv(ctx->Exec, (location, count, v));
   6451    }
   6452 }
   6453 
   6454 
   6455 static void GLAPIENTRY
   6456 save_Uniform1iARB(GLint location, GLint x)
   6457 {
   6458    GET_CURRENT_CONTEXT(ctx);
   6459    Node *n;
   6460    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6461    n = alloc_instruction(ctx, OPCODE_UNIFORM_1I, 2);
   6462    if (n) {
   6463       n[1].i = location;
   6464       n[2].i = x;
   6465    }
   6466    if (ctx->ExecuteFlag) {
   6467       CALL_Uniform1i(ctx->Exec, (location, x));
   6468    }
   6469 }
   6470 
   6471 static void GLAPIENTRY
   6472 save_Uniform2iARB(GLint location, GLint x, GLint y)
   6473 {
   6474    GET_CURRENT_CONTEXT(ctx);
   6475    Node *n;
   6476    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6477    n = alloc_instruction(ctx, OPCODE_UNIFORM_2I, 3);
   6478    if (n) {
   6479       n[1].i = location;
   6480       n[2].i = x;
   6481       n[3].i = y;
   6482    }
   6483    if (ctx->ExecuteFlag) {
   6484       CALL_Uniform2i(ctx->Exec, (location, x, y));
   6485    }
   6486 }
   6487 
   6488 static void GLAPIENTRY
   6489 save_Uniform3iARB(GLint location, GLint x, GLint y, GLint z)
   6490 {
   6491    GET_CURRENT_CONTEXT(ctx);
   6492    Node *n;
   6493    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6494    n = alloc_instruction(ctx, OPCODE_UNIFORM_3I, 4);
   6495    if (n) {
   6496       n[1].i = location;
   6497       n[2].i = x;
   6498       n[3].i = y;
   6499       n[4].i = z;
   6500    }
   6501    if (ctx->ExecuteFlag) {
   6502       CALL_Uniform3i(ctx->Exec, (location, x, y, z));
   6503    }
   6504 }
   6505 
   6506 static void GLAPIENTRY
   6507 save_Uniform4iARB(GLint location, GLint x, GLint y, GLint z, GLint w)
   6508 {
   6509    GET_CURRENT_CONTEXT(ctx);
   6510    Node *n;
   6511    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6512    n = alloc_instruction(ctx, OPCODE_UNIFORM_4I, 5);
   6513    if (n) {
   6514       n[1].i = location;
   6515       n[2].i = x;
   6516       n[3].i = y;
   6517       n[4].i = z;
   6518       n[5].i = w;
   6519    }
   6520    if (ctx->ExecuteFlag) {
   6521       CALL_Uniform4i(ctx->Exec, (location, x, y, z, w));
   6522    }
   6523 }
   6524 
   6525 
   6526 
   6527 static void GLAPIENTRY
   6528 save_Uniform1ivARB(GLint location, GLsizei count, const GLint *v)
   6529 {
   6530    GET_CURRENT_CONTEXT(ctx);
   6531    Node *n;
   6532    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6533    n = alloc_instruction(ctx, OPCODE_UNIFORM_1IV, 2 + POINTER_DWORDS);
   6534    if (n) {
   6535       n[1].i = location;
   6536       n[2].i = count;
   6537       save_pointer(&n[3], memdup(v, count * 1 * sizeof(GLint)));
   6538    }
   6539    if (ctx->ExecuteFlag) {
   6540       CALL_Uniform1iv(ctx->Exec, (location, count, v));
   6541    }
   6542 }
   6543 
   6544 static void GLAPIENTRY
   6545 save_Uniform2ivARB(GLint location, GLsizei count, const GLint *v)
   6546 {
   6547    GET_CURRENT_CONTEXT(ctx);
   6548    Node *n;
   6549    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6550    n = alloc_instruction(ctx, OPCODE_UNIFORM_2IV, 2 + POINTER_DWORDS);
   6551    if (n) {
   6552       n[1].i = location;
   6553       n[2].i = count;
   6554       save_pointer(&n[3], memdup(v, count * 2 * sizeof(GLint)));
   6555    }
   6556    if (ctx->ExecuteFlag) {
   6557       CALL_Uniform2iv(ctx->Exec, (location, count, v));
   6558    }
   6559 }
   6560 
   6561 static void GLAPIENTRY
   6562 save_Uniform3ivARB(GLint location, GLsizei count, const GLint *v)
   6563 {
   6564    GET_CURRENT_CONTEXT(ctx);
   6565    Node *n;
   6566    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6567    n = alloc_instruction(ctx, OPCODE_UNIFORM_3IV, 2 + POINTER_DWORDS);
   6568    if (n) {
   6569       n[1].i = location;
   6570       n[2].i = count;
   6571       save_pointer(&n[3], memdup(v, count * 3 * sizeof(GLint)));
   6572    }
   6573    if (ctx->ExecuteFlag) {
   6574       CALL_Uniform3iv(ctx->Exec, (location, count, v));
   6575    }
   6576 }
   6577 
   6578 static void GLAPIENTRY
   6579 save_Uniform4ivARB(GLint location, GLsizei count, const GLint *v)
   6580 {
   6581    GET_CURRENT_CONTEXT(ctx);
   6582    Node *n;
   6583    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6584    n = alloc_instruction(ctx, OPCODE_UNIFORM_4IV, 2 + POINTER_DWORDS);
   6585    if (n) {
   6586       n[1].i = location;
   6587       n[2].i = count;
   6588       save_pointer(&n[3], memdup(v, count * 4 * sizeof(GLfloat)));
   6589    }
   6590    if (ctx->ExecuteFlag) {
   6591       CALL_Uniform4iv(ctx->Exec, (location, count, v));
   6592    }
   6593 }
   6594 
   6595 
   6596 
   6597 static void GLAPIENTRY
   6598 save_Uniform1ui(GLint location, GLuint x)
   6599 {
   6600    GET_CURRENT_CONTEXT(ctx);
   6601    Node *n;
   6602    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6603    n = alloc_instruction(ctx, OPCODE_UNIFORM_1UI, 2);
   6604    if (n) {
   6605       n[1].i = location;
   6606       n[2].i = x;
   6607    }
   6608    if (ctx->ExecuteFlag) {
   6609       /*CALL_Uniform1ui(ctx->Exec, (location, x));*/
   6610    }
   6611 }
   6612 
   6613 static void GLAPIENTRY
   6614 save_Uniform2ui(GLint location, GLuint x, GLuint y)
   6615 {
   6616    GET_CURRENT_CONTEXT(ctx);
   6617    Node *n;
   6618    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6619    n = alloc_instruction(ctx, OPCODE_UNIFORM_2UI, 3);
   6620    if (n) {
   6621       n[1].i = location;
   6622       n[2].i = x;
   6623       n[3].i = y;
   6624    }
   6625    if (ctx->ExecuteFlag) {
   6626       /*CALL_Uniform2ui(ctx->Exec, (location, x, y));*/
   6627    }
   6628 }
   6629 
   6630 static void GLAPIENTRY
   6631 save_Uniform3ui(GLint location, GLuint x, GLuint y, GLuint z)
   6632 {
   6633    GET_CURRENT_CONTEXT(ctx);
   6634    Node *n;
   6635    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6636    n = alloc_instruction(ctx, OPCODE_UNIFORM_3UI, 4);
   6637    if (n) {
   6638       n[1].i = location;
   6639       n[2].i = x;
   6640       n[3].i = y;
   6641       n[4].i = z;
   6642    }
   6643    if (ctx->ExecuteFlag) {
   6644       /*CALL_Uniform3ui(ctx->Exec, (location, x, y, z));*/
   6645    }
   6646 }
   6647 
   6648 static void GLAPIENTRY
   6649 save_Uniform4ui(GLint location, GLuint x, GLuint y, GLuint z, GLuint w)
   6650 {
   6651    GET_CURRENT_CONTEXT(ctx);
   6652    Node *n;
   6653    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6654    n = alloc_instruction(ctx, OPCODE_UNIFORM_4UI, 5);
   6655    if (n) {
   6656       n[1].i = location;
   6657       n[2].i = x;
   6658       n[3].i = y;
   6659       n[4].i = z;
   6660       n[5].i = w;
   6661    }
   6662    if (ctx->ExecuteFlag) {
   6663       /*CALL_Uniform4ui(ctx->Exec, (location, x, y, z, w));*/
   6664    }
   6665 }
   6666 
   6667 
   6668 
   6669 static void GLAPIENTRY
   6670 save_Uniform1uiv(GLint location, GLsizei count, const GLuint *v)
   6671 {
   6672    GET_CURRENT_CONTEXT(ctx);
   6673    Node *n;
   6674    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6675    n = alloc_instruction(ctx, OPCODE_UNIFORM_1UIV, 2 + POINTER_DWORDS);
   6676    if (n) {
   6677       n[1].i = location;
   6678       n[2].i = count;
   6679       save_pointer(&n[3], memdup(v, count * 1 * sizeof(*v)));
   6680    }
   6681    if (ctx->ExecuteFlag) {
   6682       /*CALL_Uniform1uiv(ctx->Exec, (location, count, v));*/
   6683    }
   6684 }
   6685 
   6686 static void GLAPIENTRY
   6687 save_Uniform2uiv(GLint location, GLsizei count, const GLuint *v)
   6688 {
   6689    GET_CURRENT_CONTEXT(ctx);
   6690    Node *n;
   6691    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6692    n = alloc_instruction(ctx, OPCODE_UNIFORM_2UIV, 2 + POINTER_DWORDS);
   6693    if (n) {
   6694       n[1].i = location;
   6695       n[2].i = count;
   6696       save_pointer(&n[3], memdup(v, count * 2 * sizeof(*v)));
   6697    }
   6698    if (ctx->ExecuteFlag) {
   6699       /*CALL_Uniform2uiv(ctx->Exec, (location, count, v));*/
   6700    }
   6701 }
   6702 
   6703 static void GLAPIENTRY
   6704 save_Uniform3uiv(GLint location, GLsizei count, const GLuint *v)
   6705 {
   6706    GET_CURRENT_CONTEXT(ctx);
   6707    Node *n;
   6708    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6709    n = alloc_instruction(ctx, OPCODE_UNIFORM_3UIV, 2 + POINTER_DWORDS);
   6710    if (n) {
   6711       n[1].i = location;
   6712       n[2].i = count;
   6713       save_pointer(&n[3], memdup(v, count * 3 * sizeof(*v)));
   6714    }
   6715    if (ctx->ExecuteFlag) {
   6716       /*CALL_Uniform3uiv(ctx->Exec, (location, count, v));*/
   6717    }
   6718 }
   6719 
   6720 static void GLAPIENTRY
   6721 save_Uniform4uiv(GLint location, GLsizei count, const GLuint *v)
   6722 {
   6723    GET_CURRENT_CONTEXT(ctx);
   6724    Node *n;
   6725    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6726    n = alloc_instruction(ctx, OPCODE_UNIFORM_4UIV, 2 + POINTER_DWORDS);
   6727    if (n) {
   6728       n[1].i = location;
   6729       n[2].i = count;
   6730       save_pointer(&n[3], memdup(v, count * 4 * sizeof(*v)));
   6731    }
   6732    if (ctx->ExecuteFlag) {
   6733       /*CALL_Uniform4uiv(ctx->Exec, (location, count, v));*/
   6734    }
   6735 }
   6736 
   6737 
   6738 
   6739 static void GLAPIENTRY
   6740 save_UniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose,
   6741                          const GLfloat *m)
   6742 {
   6743    GET_CURRENT_CONTEXT(ctx);
   6744    Node *n;
   6745    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6746    n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX22, 3 + POINTER_DWORDS);
   6747    if (n) {
   6748       n[1].i = location;
   6749       n[2].i = count;
   6750       n[3].b = transpose;
   6751       save_pointer(&n[4], memdup(m, count * 2 * 2 * sizeof(GLfloat)));
   6752    }
   6753    if (ctx->ExecuteFlag) {
   6754       CALL_UniformMatrix2fv(ctx->Exec, (location, count, transpose, m));
   6755    }
   6756 }
   6757 
   6758 static void GLAPIENTRY
   6759 save_UniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose,
   6760                          const GLfloat *m)
   6761 {
   6762    GET_CURRENT_CONTEXT(ctx);
   6763    Node *n;
   6764    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6765    n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX33, 3 + POINTER_DWORDS);
   6766    if (n) {
   6767       n[1].i = location;
   6768       n[2].i = count;
   6769       n[3].b = transpose;
   6770       save_pointer(&n[4], memdup(m, count * 3 * 3 * sizeof(GLfloat)));
   6771    }
   6772    if (ctx->ExecuteFlag) {
   6773       CALL_UniformMatrix3fv(ctx->Exec, (location, count, transpose, m));
   6774    }
   6775 }
   6776 
   6777 static void GLAPIENTRY
   6778 save_UniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose,
   6779                          const GLfloat *m)
   6780 {
   6781    GET_CURRENT_CONTEXT(ctx);
   6782    Node *n;
   6783    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6784    n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX44, 3 + POINTER_DWORDS);
   6785    if (n) {
   6786       n[1].i = location;
   6787       n[2].i = count;
   6788       n[3].b = transpose;
   6789       save_pointer(&n[4], memdup(m, count * 4 * 4 * sizeof(GLfloat)));
   6790    }
   6791    if (ctx->ExecuteFlag) {
   6792       CALL_UniformMatrix4fv(ctx->Exec, (location, count, transpose, m));
   6793    }
   6794 }
   6795 
   6796 
   6797 static void GLAPIENTRY
   6798 save_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
   6799                         const GLfloat *m)
   6800 {
   6801    GET_CURRENT_CONTEXT(ctx);
   6802    Node *n;
   6803    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6804    n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX23, 3 + POINTER_DWORDS);
   6805    if (n) {
   6806       n[1].i = location;
   6807       n[2].i = count;
   6808       n[3].b = transpose;
   6809       save_pointer(&n[4], memdup(m, count * 2 * 3 * sizeof(GLfloat)));
   6810    }
   6811    if (ctx->ExecuteFlag) {
   6812       CALL_UniformMatrix2x3fv(ctx->Exec, (location, count, transpose, m));
   6813    }
   6814 }
   6815 
   6816 static void GLAPIENTRY
   6817 save_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
   6818                         const GLfloat *m)
   6819 {
   6820    GET_CURRENT_CONTEXT(ctx);
   6821    Node *n;
   6822    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6823    n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX32, 3 + POINTER_DWORDS);
   6824    if (n) {
   6825       n[1].i = location;
   6826       n[2].i = count;
   6827       n[3].b = transpose;
   6828       save_pointer(&n[4], memdup(m, count * 3 * 2 * sizeof(GLfloat)));
   6829    }
   6830    if (ctx->ExecuteFlag) {
   6831       CALL_UniformMatrix3x2fv(ctx->Exec, (location, count, transpose, m));
   6832    }
   6833 }
   6834 
   6835 
   6836 static void GLAPIENTRY
   6837 save_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
   6838                         const GLfloat *m)
   6839 {
   6840    GET_CURRENT_CONTEXT(ctx);
   6841    Node *n;
   6842    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6843    n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX24, 3 + POINTER_DWORDS);
   6844    if (n) {
   6845       n[1].i = location;
   6846       n[2].i = count;
   6847       n[3].b = transpose;
   6848       save_pointer(&n[4], memdup(m, count * 2 * 4 * sizeof(GLfloat)));
   6849    }
   6850    if (ctx->ExecuteFlag) {
   6851       CALL_UniformMatrix2x4fv(ctx->Exec, (location, count, transpose, m));
   6852    }
   6853 }
   6854 
   6855 static void GLAPIENTRY
   6856 save_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
   6857                         const GLfloat *m)
   6858 {
   6859    GET_CURRENT_CONTEXT(ctx);
   6860    Node *n;
   6861    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6862    n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX42, 3 + POINTER_DWORDS);
   6863    if (n) {
   6864       n[1].i = location;
   6865       n[2].i = count;
   6866       n[3].b = transpose;
   6867       save_pointer(&n[4], memdup(m, count * 4 * 2 * sizeof(GLfloat)));
   6868    }
   6869    if (ctx->ExecuteFlag) {
   6870       CALL_UniformMatrix4x2fv(ctx->Exec, (location, count, transpose, m));
   6871    }
   6872 }
   6873 
   6874 
   6875 static void GLAPIENTRY
   6876 save_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
   6877                         const GLfloat *m)
   6878 {
   6879    GET_CURRENT_CONTEXT(ctx);
   6880    Node *n;
   6881    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6882    n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX34, 3 + POINTER_DWORDS);
   6883    if (n) {
   6884       n[1].i = location;
   6885       n[2].i = count;
   6886       n[3].b = transpose;
   6887       save_pointer(&n[4], memdup(m, count * 3 * 4 * sizeof(GLfloat)));
   6888    }
   6889    if (ctx->ExecuteFlag) {
   6890       CALL_UniformMatrix3x4fv(ctx->Exec, (location, count, transpose, m));
   6891    }
   6892 }
   6893 
   6894 static void GLAPIENTRY
   6895 save_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
   6896                         const GLfloat *m)
   6897 {
   6898    GET_CURRENT_CONTEXT(ctx);
   6899    Node *n;
   6900    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6901    n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX43, 3 + POINTER_DWORDS);
   6902    if (n) {
   6903       n[1].i = location;
   6904       n[2].i = count;
   6905       n[3].b = transpose;
   6906       save_pointer(&n[4], memdup(m, count * 4 * 3 * sizeof(GLfloat)));
   6907    }
   6908    if (ctx->ExecuteFlag) {
   6909       CALL_UniformMatrix4x3fv(ctx->Exec, (location, count, transpose, m));
   6910    }
   6911 }
   6912 
   6913 static void GLAPIENTRY
   6914 save_UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
   6915 {
   6916    GET_CURRENT_CONTEXT(ctx);
   6917    Node *n;
   6918    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6919    n = alloc_instruction(ctx, OPCODE_USE_PROGRAM_STAGES, 3);
   6920    if (n) {
   6921       n[1].ui = pipeline;
   6922       n[2].ui = stages;
   6923       n[3].ui = program;
   6924    }
   6925    if (ctx->ExecuteFlag) {
   6926       CALL_UseProgramStages(ctx->Exec, (pipeline, stages, program));
   6927    }
   6928 }
   6929 
   6930 static void GLAPIENTRY
   6931 save_ProgramUniform1f(GLuint program, GLint location, GLfloat x)
   6932 {
   6933    GET_CURRENT_CONTEXT(ctx);
   6934    Node *n;
   6935    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6936    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1F, 3);
   6937    if (n) {
   6938       n[1].ui = program;
   6939       n[2].i = location;
   6940       n[3].f = x;
   6941    }
   6942    if (ctx->ExecuteFlag) {
   6943       CALL_ProgramUniform1f(ctx->Exec, (program, location, x));
   6944    }
   6945 }
   6946 
   6947 static void GLAPIENTRY
   6948 save_ProgramUniform2f(GLuint program, GLint location, GLfloat x, GLfloat y)
   6949 {
   6950    GET_CURRENT_CONTEXT(ctx);
   6951    Node *n;
   6952    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6953    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2F, 4);
   6954    if (n) {
   6955       n[1].ui = program;
   6956       n[2].i = location;
   6957       n[3].f = x;
   6958       n[4].f = y;
   6959    }
   6960    if (ctx->ExecuteFlag) {
   6961       CALL_ProgramUniform2f(ctx->Exec, (program, location, x, y));
   6962    }
   6963 }
   6964 
   6965 static void GLAPIENTRY
   6966 save_ProgramUniform3f(GLuint program, GLint location,
   6967                       GLfloat x, GLfloat y, GLfloat z)
   6968 {
   6969    GET_CURRENT_CONTEXT(ctx);
   6970    Node *n;
   6971    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6972    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3F, 5);
   6973    if (n) {
   6974       n[1].ui = program;
   6975       n[2].i = location;
   6976       n[3].f = x;
   6977       n[4].f = y;
   6978       n[5].f = z;
   6979    }
   6980    if (ctx->ExecuteFlag) {
   6981       CALL_ProgramUniform3f(ctx->Exec, (program, location, x, y, z));
   6982    }
   6983 }
   6984 
   6985 static void GLAPIENTRY
   6986 save_ProgramUniform4f(GLuint program, GLint location,
   6987                       GLfloat x, GLfloat y, GLfloat z, GLfloat w)
   6988 {
   6989    GET_CURRENT_CONTEXT(ctx);
   6990    Node *n;
   6991    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   6992    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4F, 6);
   6993    if (n) {
   6994       n[1].ui = program;
   6995       n[2].i = location;
   6996       n[3].f = x;
   6997       n[4].f = y;
   6998       n[5].f = z;
   6999       n[6].f = w;
   7000    }
   7001    if (ctx->ExecuteFlag) {
   7002       CALL_ProgramUniform4f(ctx->Exec, (program, location, x, y, z, w));
   7003    }
   7004 }
   7005 
   7006 static void GLAPIENTRY
   7007 save_ProgramUniform1fv(GLuint program, GLint location, GLsizei count,
   7008                        const GLfloat *v)
   7009 {
   7010    GET_CURRENT_CONTEXT(ctx);
   7011    Node *n;
   7012    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7013    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1FV, 3 + POINTER_DWORDS);
   7014    if (n) {
   7015       n[1].ui = program;
   7016       n[2].i = location;
   7017       n[3].i = count;
   7018       save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLfloat)));
   7019    }
   7020    if (ctx->ExecuteFlag) {
   7021       CALL_ProgramUniform1fv(ctx->Exec, (program, location, count, v));
   7022    }
   7023 }
   7024 
   7025 static void GLAPIENTRY
   7026 save_ProgramUniform2fv(GLuint program, GLint location, GLsizei count,
   7027                        const GLfloat *v)
   7028 {
   7029    GET_CURRENT_CONTEXT(ctx);
   7030    Node *n;
   7031    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7032    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2FV, 3 + POINTER_DWORDS);
   7033    if (n) {
   7034       n[1].ui = program;
   7035       n[2].i = location;
   7036       n[3].i = count;
   7037       save_pointer(&n[4], memdup(v, count * 2 * sizeof(GLfloat)));
   7038    }
   7039    if (ctx->ExecuteFlag) {
   7040       CALL_ProgramUniform2fv(ctx->Exec, (program, location, count, v));
   7041    }
   7042 }
   7043 
   7044 static void GLAPIENTRY
   7045 save_ProgramUniform3fv(GLuint program, GLint location, GLsizei count,
   7046                        const GLfloat *v)
   7047 {
   7048    GET_CURRENT_CONTEXT(ctx);
   7049    Node *n;
   7050    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7051    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3FV, 3 + POINTER_DWORDS);
   7052    if (n) {
   7053       n[1].ui = program;
   7054       n[2].i = location;
   7055       n[3].i = count;
   7056       save_pointer(&n[4], memdup(v, count * 3 * sizeof(GLfloat)));
   7057    }
   7058    if (ctx->ExecuteFlag) {
   7059       CALL_ProgramUniform3fv(ctx->Exec, (program, location, count, v));
   7060    }
   7061 }
   7062 
   7063 static void GLAPIENTRY
   7064 save_ProgramUniform4fv(GLuint program, GLint location, GLsizei count,
   7065                        const GLfloat *v)
   7066 {
   7067    GET_CURRENT_CONTEXT(ctx);
   7068    Node *n;
   7069    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7070    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4FV, 3 + POINTER_DWORDS);
   7071    if (n) {
   7072       n[1].ui = program;
   7073       n[2].i = location;
   7074       n[3].i = count;
   7075       save_pointer(&n[4], memdup(v, count * 4 * sizeof(GLfloat)));
   7076    }
   7077    if (ctx->ExecuteFlag) {
   7078       CALL_ProgramUniform4fv(ctx->Exec, (program, location, count, v));
   7079    }
   7080 }
   7081 
   7082 static void GLAPIENTRY
   7083 save_ProgramUniform1i(GLuint program, GLint location, GLint x)
   7084 {
   7085    GET_CURRENT_CONTEXT(ctx);
   7086    Node *n;
   7087    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7088    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1I, 3);
   7089    if (n) {
   7090       n[1].ui = program;
   7091       n[2].i = location;
   7092       n[3].i = x;
   7093    }
   7094    if (ctx->ExecuteFlag) {
   7095       CALL_ProgramUniform1i(ctx->Exec, (program, location, x));
   7096    }
   7097 }
   7098 
   7099 static void GLAPIENTRY
   7100 save_ProgramUniform2i(GLuint program, GLint location, GLint x, GLint y)
   7101 {
   7102    GET_CURRENT_CONTEXT(ctx);
   7103    Node *n;
   7104    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7105    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2I, 4);
   7106    if (n) {
   7107       n[1].ui = program;
   7108       n[2].i = location;
   7109       n[3].i = x;
   7110       n[4].i = y;
   7111    }
   7112    if (ctx->ExecuteFlag) {
   7113       CALL_ProgramUniform2i(ctx->Exec, (program, location, x, y));
   7114    }
   7115 }
   7116 
   7117 static void GLAPIENTRY
   7118 save_ProgramUniform3i(GLuint program, GLint location,
   7119                       GLint x, GLint y, GLint z)
   7120 {
   7121    GET_CURRENT_CONTEXT(ctx);
   7122    Node *n;
   7123    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7124    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3I, 5);
   7125    if (n) {
   7126       n[1].ui = program;
   7127       n[2].i = location;
   7128       n[3].i = x;
   7129       n[4].i = y;
   7130       n[5].i = z;
   7131    }
   7132    if (ctx->ExecuteFlag) {
   7133       CALL_ProgramUniform3i(ctx->Exec, (program, location, x, y, z));
   7134    }
   7135 }
   7136 
   7137 static void GLAPIENTRY
   7138 save_ProgramUniform4i(GLuint program, GLint location,
   7139                       GLint x, GLint y, GLint z, GLint w)
   7140 {
   7141    GET_CURRENT_CONTEXT(ctx);
   7142    Node *n;
   7143    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7144    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4I, 6);
   7145    if (n) {
   7146       n[1].ui = program;
   7147       n[2].i = location;
   7148       n[3].i = x;
   7149       n[4].i = y;
   7150       n[5].i = z;
   7151       n[6].i = w;
   7152    }
   7153    if (ctx->ExecuteFlag) {
   7154       CALL_ProgramUniform4i(ctx->Exec, (program, location, x, y, z, w));
   7155    }
   7156 }
   7157 
   7158 static void GLAPIENTRY
   7159 save_ProgramUniform1iv(GLuint program, GLint location, GLsizei count,
   7160                        const GLint *v)
   7161 {
   7162    GET_CURRENT_CONTEXT(ctx);
   7163    Node *n;
   7164    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7165    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1IV, 3 + POINTER_DWORDS);
   7166    if (n) {
   7167       n[1].ui = program;
   7168       n[2].i = location;
   7169       n[3].i = count;
   7170       save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLint)));
   7171    }
   7172    if (ctx->ExecuteFlag) {
   7173       CALL_ProgramUniform1iv(ctx->Exec, (program, location, count, v));
   7174    }
   7175 }
   7176 
   7177 static void GLAPIENTRY
   7178 save_ProgramUniform2iv(GLuint program, GLint location, GLsizei count,
   7179                        const GLint *v)
   7180 {
   7181    GET_CURRENT_CONTEXT(ctx);
   7182    Node *n;
   7183    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7184    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2IV, 3 + POINTER_DWORDS);
   7185    if (n) {
   7186       n[1].ui = program;
   7187       n[2].i = location;
   7188       n[3].i = count;
   7189       save_pointer(&n[4], memdup(v, count * 2 * sizeof(GLint)));
   7190    }
   7191    if (ctx->ExecuteFlag) {
   7192       CALL_ProgramUniform2iv(ctx->Exec, (program, location, count, v));
   7193    }
   7194 }
   7195 
   7196 static void GLAPIENTRY
   7197 save_ProgramUniform3iv(GLuint program, GLint location, GLsizei count,
   7198                        const GLint *v)
   7199 {
   7200    GET_CURRENT_CONTEXT(ctx);
   7201    Node *n;
   7202    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7203    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3IV, 3 + POINTER_DWORDS);
   7204    if (n) {
   7205       n[1].ui = program;
   7206       n[2].i = location;
   7207       n[3].i = count;
   7208       save_pointer(&n[4], memdup(v, count * 3 * sizeof(GLint)));
   7209    }
   7210    if (ctx->ExecuteFlag) {
   7211       CALL_ProgramUniform3iv(ctx->Exec, (program, location, count, v));
   7212    }
   7213 }
   7214 
   7215 static void GLAPIENTRY
   7216 save_ProgramUniform4iv(GLuint program, GLint location, GLsizei count,
   7217                        const GLint *v)
   7218 {
   7219    GET_CURRENT_CONTEXT(ctx);
   7220    Node *n;
   7221    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7222    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4IV, 3 + POINTER_DWORDS);
   7223    if (n) {
   7224       n[1].ui = program;
   7225       n[2].i = location;
   7226       n[3].i = count;
   7227       save_pointer(&n[4], memdup(v, count * 4 * sizeof(GLint)));
   7228    }
   7229    if (ctx->ExecuteFlag) {
   7230       CALL_ProgramUniform4iv(ctx->Exec, (program, location, count, v));
   7231    }
   7232 }
   7233 
   7234 static void GLAPIENTRY
   7235 save_ProgramUniform1ui(GLuint program, GLint location, GLuint x)
   7236 {
   7237    GET_CURRENT_CONTEXT(ctx);
   7238    Node *n;
   7239    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7240    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1UI, 3);
   7241    if (n) {
   7242       n[1].ui = program;
   7243       n[2].i = location;
   7244       n[3].ui = x;
   7245    }
   7246    if (ctx->ExecuteFlag) {
   7247       CALL_ProgramUniform1ui(ctx->Exec, (program, location, x));
   7248    }
   7249 }
   7250 
   7251 static void GLAPIENTRY
   7252 save_ProgramUniform2ui(GLuint program, GLint location, GLuint x, GLuint y)
   7253 {
   7254    GET_CURRENT_CONTEXT(ctx);
   7255    Node *n;
   7256    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7257    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2UI, 4);
   7258    if (n) {
   7259       n[1].ui = program;
   7260       n[2].i = location;
   7261       n[3].ui = x;
   7262       n[4].ui = y;
   7263    }
   7264    if (ctx->ExecuteFlag) {
   7265       CALL_ProgramUniform2ui(ctx->Exec, (program, location, x, y));
   7266    }
   7267 }
   7268 
   7269 static void GLAPIENTRY
   7270 save_ProgramUniform3ui(GLuint program, GLint location,
   7271                        GLuint x, GLuint y, GLuint z)
   7272 {
   7273    GET_CURRENT_CONTEXT(ctx);
   7274    Node *n;
   7275    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7276    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3UI, 5);
   7277    if (n) {
   7278       n[1].ui = program;
   7279       n[2].i = location;
   7280       n[3].ui = x;
   7281       n[4].ui = y;
   7282       n[5].ui = z;
   7283    }
   7284    if (ctx->ExecuteFlag) {
   7285       CALL_ProgramUniform3ui(ctx->Exec, (program, location, x, y, z));
   7286    }
   7287 }
   7288 
   7289 static void GLAPIENTRY
   7290 save_ProgramUniform4ui(GLuint program, GLint location,
   7291                        GLuint x, GLuint y, GLuint z, GLuint w)
   7292 {
   7293    GET_CURRENT_CONTEXT(ctx);
   7294    Node *n;
   7295    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7296    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4UI, 6);
   7297    if (n) {
   7298       n[1].ui = program;
   7299       n[2].i = location;
   7300       n[3].ui = x;
   7301       n[4].ui = y;
   7302       n[5].ui = z;
   7303       n[6].ui = w;
   7304    }
   7305    if (ctx->ExecuteFlag) {
   7306       CALL_ProgramUniform4ui(ctx->Exec, (program, location, x, y, z, w));
   7307    }
   7308 }
   7309 
   7310 static void GLAPIENTRY
   7311 save_ProgramUniform1uiv(GLuint program, GLint location, GLsizei count,
   7312                         const GLuint *v)
   7313 {
   7314    GET_CURRENT_CONTEXT(ctx);
   7315    Node *n;
   7316    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7317    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1UIV, 3 + POINTER_DWORDS);
   7318    if (n) {
   7319       n[1].ui = program;
   7320       n[2].i = location;
   7321       n[3].i = count;
   7322       save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLuint)));
   7323    }
   7324    if (ctx->ExecuteFlag) {
   7325       CALL_ProgramUniform1uiv(ctx->Exec, (program, location, count, v));
   7326    }
   7327 }
   7328 
   7329 static void GLAPIENTRY
   7330 save_ProgramUniform2uiv(GLuint program, GLint location, GLsizei count,
   7331                         const GLuint *v)
   7332 {
   7333    GET_CURRENT_CONTEXT(ctx);
   7334    Node *n;
   7335    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7336    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2UIV, 3 + POINTER_DWORDS);
   7337    if (n) {
   7338       n[1].ui = program;
   7339       n[2].i = location;
   7340       n[3].i = count;
   7341       save_pointer(&n[4], memdup(v, count * 2 * sizeof(GLuint)));
   7342    }
   7343    if (ctx->ExecuteFlag) {
   7344       CALL_ProgramUniform2uiv(ctx->Exec, (program, location, count, v));
   7345    }
   7346 }
   7347 
   7348 static void GLAPIENTRY
   7349 save_ProgramUniform3uiv(GLuint program, GLint location, GLsizei count,
   7350                         const GLuint *v)
   7351 {
   7352    GET_CURRENT_CONTEXT(ctx);
   7353    Node *n;
   7354    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7355    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3UIV, 3 + POINTER_DWORDS);
   7356    if (n) {
   7357       n[1].ui = program;
   7358       n[2].i = location;
   7359       n[3].i = count;
   7360       save_pointer(&n[4], memdup(v, count * 3 * sizeof(GLuint)));
   7361    }
   7362    if (ctx->ExecuteFlag) {
   7363       CALL_ProgramUniform3uiv(ctx->Exec, (program, location, count, v));
   7364    }
   7365 }
   7366 
   7367 static void GLAPIENTRY
   7368 save_ProgramUniform4uiv(GLuint program, GLint location, GLsizei count,
   7369                         const GLuint *v)
   7370 {
   7371    GET_CURRENT_CONTEXT(ctx);
   7372    Node *n;
   7373    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7374    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4UIV, 3 + POINTER_DWORDS);
   7375    if (n) {
   7376       n[1].ui = program;
   7377       n[2].i = location;
   7378       n[3].i = count;
   7379       save_pointer(&n[4], memdup(v, count * 4 * sizeof(GLuint)));
   7380    }
   7381    if (ctx->ExecuteFlag) {
   7382       CALL_ProgramUniform4uiv(ctx->Exec, (program, location, count, v));
   7383    }
   7384 }
   7385 
   7386 static void GLAPIENTRY
   7387 save_ProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count,
   7388                              GLboolean transpose, const GLfloat *v)
   7389 {
   7390    GET_CURRENT_CONTEXT(ctx);
   7391    Node *n;
   7392    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7393    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX22F,
   7394                          4 + POINTER_DWORDS);
   7395    if (n) {
   7396       n[1].ui = program;
   7397       n[2].i = location;
   7398       n[3].i = count;
   7399       n[4].b = transpose;
   7400       save_pointer(&n[5], memdup(v, count * 2 * 2 * sizeof(GLfloat)));
   7401    }
   7402    if (ctx->ExecuteFlag) {
   7403       CALL_ProgramUniformMatrix2fv(ctx->Exec,
   7404                                    (program, location, count, transpose, v));
   7405    }
   7406 }
   7407 
   7408 static void GLAPIENTRY
   7409 save_ProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count,
   7410                                GLboolean transpose, const GLfloat *v)
   7411 {
   7412    GET_CURRENT_CONTEXT(ctx);
   7413    Node *n;
   7414    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7415    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX23F,
   7416                          4 + POINTER_DWORDS);
   7417    if (n) {
   7418       n[1].ui = program;
   7419       n[2].i = location;
   7420       n[3].i = count;
   7421       n[4].b = transpose;
   7422       save_pointer(&n[5], memdup(v, count * 2 * 3 * sizeof(GLfloat)));
   7423    }
   7424    if (ctx->ExecuteFlag) {
   7425       CALL_ProgramUniformMatrix2x3fv(ctx->Exec,
   7426                                      (program, location, count, transpose, v));
   7427    }
   7428 }
   7429 
   7430 static void GLAPIENTRY
   7431 save_ProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count,
   7432                                GLboolean transpose, const GLfloat *v)
   7433 {
   7434    GET_CURRENT_CONTEXT(ctx);
   7435    Node *n;
   7436    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7437    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX24F,
   7438                          4 + POINTER_DWORDS);
   7439    if (n) {
   7440       n[1].ui = program;
   7441       n[2].i = location;
   7442       n[3].i = count;
   7443       n[4].b = transpose;
   7444       save_pointer(&n[5], memdup(v, count * 2 * 4 * sizeof(GLfloat)));
   7445    }
   7446    if (ctx->ExecuteFlag) {
   7447       CALL_ProgramUniformMatrix2x4fv(ctx->Exec,
   7448                                      (program, location, count, transpose, v));
   7449    }
   7450 }
   7451 
   7452 static void GLAPIENTRY
   7453 save_ProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count,
   7454                                GLboolean transpose, const GLfloat *v)
   7455 {
   7456    GET_CURRENT_CONTEXT(ctx);
   7457    Node *n;
   7458    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7459    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX32F,
   7460                          4 + POINTER_DWORDS);
   7461    if (n) {
   7462       n[1].ui = program;
   7463       n[2].i = location;
   7464       n[3].i = count;
   7465       n[4].b = transpose;
   7466       save_pointer(&n[5], memdup(v, count * 3 * 2 * sizeof(GLfloat)));
   7467    }
   7468    if (ctx->ExecuteFlag) {
   7469       CALL_ProgramUniformMatrix3x2fv(ctx->Exec,
   7470                                      (program, location, count, transpose, v));
   7471    }
   7472 }
   7473 
   7474 static void GLAPIENTRY
   7475 save_ProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count,
   7476                              GLboolean transpose, const GLfloat *v)
   7477 {
   7478    GET_CURRENT_CONTEXT(ctx);
   7479    Node *n;
   7480    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7481    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX33F,
   7482                          4 + POINTER_DWORDS);
   7483    if (n) {
   7484       n[1].ui = program;
   7485       n[2].i = location;
   7486       n[3].i = count;
   7487       n[4].b = transpose;
   7488       save_pointer(&n[5], memdup(v, count * 3 * 3 * sizeof(GLfloat)));
   7489    }
   7490    if (ctx->ExecuteFlag) {
   7491       CALL_ProgramUniformMatrix3fv(ctx->Exec,
   7492                                    (program, location, count, transpose, v));
   7493    }
   7494 }
   7495 
   7496 static void GLAPIENTRY
   7497 save_ProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count,
   7498                                GLboolean transpose, const GLfloat *v)
   7499 {
   7500    GET_CURRENT_CONTEXT(ctx);
   7501    Node *n;
   7502    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7503    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX34F,
   7504                          4 + POINTER_DWORDS);
   7505    if (n) {
   7506       n[1].ui = program;
   7507       n[2].i = location;
   7508       n[3].i = count;
   7509       n[4].b = transpose;
   7510       save_pointer(&n[5], memdup(v, count * 3 * 4 * sizeof(GLfloat)));
   7511    }
   7512    if (ctx->ExecuteFlag) {
   7513       CALL_ProgramUniformMatrix3x4fv(ctx->Exec,
   7514                                      (program, location, count, transpose, v));
   7515    }
   7516 }
   7517 
   7518 static void GLAPIENTRY
   7519 save_ProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count,
   7520                                GLboolean transpose, const GLfloat *v)
   7521 {
   7522    GET_CURRENT_CONTEXT(ctx);
   7523    Node *n;
   7524    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7525    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX42F,
   7526                          4 + POINTER_DWORDS);
   7527    if (n) {
   7528       n[1].ui = program;
   7529       n[2].i = location;
   7530       n[3].i = count;
   7531       n[4].b = transpose;
   7532       save_pointer(&n[5], memdup(v, count * 4 * 2 * sizeof(GLfloat)));
   7533    }
   7534    if (ctx->ExecuteFlag) {
   7535       CALL_ProgramUniformMatrix4x2fv(ctx->Exec,
   7536                                      (program, location, count, transpose, v));
   7537    }
   7538 }
   7539 
   7540 static void GLAPIENTRY
   7541 save_ProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count,
   7542                                GLboolean transpose, const GLfloat *v)
   7543 {
   7544    GET_CURRENT_CONTEXT(ctx);
   7545    Node *n;
   7546    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7547    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX43F,
   7548                          4 + POINTER_DWORDS);
   7549    if (n) {
   7550       n[1].ui = program;
   7551       n[2].i = location;
   7552       n[3].i = count;
   7553       n[4].b = transpose;
   7554       save_pointer(&n[5], memdup(v, count * 4 * 3 * sizeof(GLfloat)));
   7555    }
   7556    if (ctx->ExecuteFlag) {
   7557       CALL_ProgramUniformMatrix4x3fv(ctx->Exec,
   7558                                      (program, location, count, transpose, v));
   7559    }
   7560 }
   7561 
   7562 static void GLAPIENTRY
   7563 save_ProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count,
   7564                              GLboolean transpose, const GLfloat *v)
   7565 {
   7566    GET_CURRENT_CONTEXT(ctx);
   7567    Node *n;
   7568    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7569    n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX44F,
   7570                          4 + POINTER_DWORDS);
   7571    if (n) {
   7572       n[1].ui = program;
   7573       n[2].i = location;
   7574       n[3].i = count;
   7575       n[4].b = transpose;
   7576       save_pointer(&n[5], memdup(v, count * 4 * 4 * sizeof(GLfloat)));
   7577    }
   7578    if (ctx->ExecuteFlag) {
   7579       CALL_ProgramUniformMatrix4fv(ctx->Exec,
   7580                                    (program, location, count, transpose, v));
   7581    }
   7582 }
   7583 
   7584 static void GLAPIENTRY
   7585 save_ClipControl(GLenum origin, GLenum depth)
   7586 {
   7587    GET_CURRENT_CONTEXT(ctx);
   7588    Node *n;
   7589    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7590    n = alloc_instruction(ctx, OPCODE_CLIP_CONTROL, 2);
   7591    if (n) {
   7592       n[1].e = origin;
   7593       n[2].e = depth;
   7594    }
   7595    if (ctx->ExecuteFlag) {
   7596       CALL_ClipControl(ctx->Exec, (origin, depth));
   7597    }
   7598 }
   7599 
   7600 static void GLAPIENTRY
   7601 save_ClampColorARB(GLenum target, GLenum clamp)
   7602 {
   7603    GET_CURRENT_CONTEXT(ctx);
   7604    Node *n;
   7605    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7606    n = alloc_instruction(ctx, OPCODE_CLAMP_COLOR, 2);
   7607    if (n) {
   7608       n[1].e = target;
   7609       n[2].e = clamp;
   7610    }
   7611    if (ctx->ExecuteFlag) {
   7612       CALL_ClampColor(ctx->Exec, (target, clamp));
   7613    }
   7614 }
   7615 
   7616 /** GL_EXT_texture_integer */
   7617 static void GLAPIENTRY
   7618 save_ClearColorIi(GLint red, GLint green, GLint blue, GLint alpha)
   7619 {
   7620    GET_CURRENT_CONTEXT(ctx);
   7621    Node *n;
   7622    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7623    n = alloc_instruction(ctx, OPCODE_CLEARCOLOR_I, 4);
   7624    if (n) {
   7625       n[1].i = red;
   7626       n[2].i = green;
   7627       n[3].i = blue;
   7628       n[4].i = alpha;
   7629    }
   7630    if (ctx->ExecuteFlag) {
   7631       CALL_ClearColorIiEXT(ctx->Exec, (red, green, blue, alpha));
   7632    }
   7633 }
   7634 
   7635 /** GL_EXT_texture_integer */
   7636 static void GLAPIENTRY
   7637 save_ClearColorIui(GLuint red, GLuint green, GLuint blue, GLuint alpha)
   7638 {
   7639    GET_CURRENT_CONTEXT(ctx);
   7640    Node *n;
   7641    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7642    n = alloc_instruction(ctx, OPCODE_CLEARCOLOR_UI, 4);
   7643    if (n) {
   7644       n[1].ui = red;
   7645       n[2].ui = green;
   7646       n[3].ui = blue;
   7647       n[4].ui = alpha;
   7648    }
   7649    if (ctx->ExecuteFlag) {
   7650       CALL_ClearColorIuiEXT(ctx->Exec, (red, green, blue, alpha));
   7651    }
   7652 }
   7653 
   7654 /** GL_EXT_texture_integer */
   7655 static void GLAPIENTRY
   7656 save_TexParameterIiv(GLenum target, GLenum pname, const GLint *params)
   7657 {
   7658    GET_CURRENT_CONTEXT(ctx);
   7659    Node *n;
   7660    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7661    n = alloc_instruction(ctx, OPCODE_TEXPARAMETER_I, 6);
   7662    if (n) {
   7663       n[1].e = target;
   7664       n[2].e = pname;
   7665       n[3].i = params[0];
   7666       n[4].i = params[1];
   7667       n[5].i = params[2];
   7668       n[6].i = params[3];
   7669    }
   7670    if (ctx->ExecuteFlag) {
   7671       CALL_TexParameterIiv(ctx->Exec, (target, pname, params));
   7672    }
   7673 }
   7674 
   7675 /** GL_EXT_texture_integer */
   7676 static void GLAPIENTRY
   7677 save_TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
   7678 {
   7679    GET_CURRENT_CONTEXT(ctx);
   7680    Node *n;
   7681    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7682    n = alloc_instruction(ctx, OPCODE_TEXPARAMETER_UI, 6);
   7683    if (n) {
   7684       n[1].e = target;
   7685       n[2].e = pname;
   7686       n[3].ui = params[0];
   7687       n[4].ui = params[1];
   7688       n[5].ui = params[2];
   7689       n[6].ui = params[3];
   7690    }
   7691    if (ctx->ExecuteFlag) {
   7692       CALL_TexParameterIuiv(ctx->Exec, (target, pname, params));
   7693    }
   7694 }
   7695 
   7696 /* GL_ARB_instanced_arrays */
   7697 static void GLAPIENTRY
   7698 save_VertexAttribDivisor(GLuint index, GLuint divisor)
   7699 {
   7700    GET_CURRENT_CONTEXT(ctx);
   7701    Node *n;
   7702    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7703    n = alloc_instruction(ctx, OPCODE_VERTEX_ATTRIB_DIVISOR, 2);
   7704    if (n) {
   7705       n[1].ui = index;
   7706       n[2].ui = divisor;
   7707    }
   7708    if (ctx->ExecuteFlag) {
   7709       CALL_VertexAttribDivisor(ctx->Exec, (index, divisor));
   7710    }
   7711 }
   7712 
   7713 
   7714 /* GL_NV_texture_barrier */
   7715 static void GLAPIENTRY
   7716 save_TextureBarrierNV(void)
   7717 {
   7718    GET_CURRENT_CONTEXT(ctx);
   7719    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7720    alloc_instruction(ctx, OPCODE_TEXTURE_BARRIER_NV, 0);
   7721    if (ctx->ExecuteFlag) {
   7722       CALL_TextureBarrierNV(ctx->Exec, ());
   7723    }
   7724 }
   7725 
   7726 
   7727 /* GL_ARB_sampler_objects */
   7728 static void GLAPIENTRY
   7729 save_BindSampler(GLuint unit, GLuint sampler)
   7730 {
   7731    Node *n;
   7732    GET_CURRENT_CONTEXT(ctx);
   7733    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7734    n = alloc_instruction(ctx, OPCODE_BIND_SAMPLER, 2);
   7735    if (n) {
   7736       n[1].ui = unit;
   7737       n[2].ui = sampler;
   7738    }
   7739    if (ctx->ExecuteFlag) {
   7740       CALL_BindSampler(ctx->Exec, (unit, sampler));
   7741    }
   7742 }
   7743 
   7744 static void GLAPIENTRY
   7745 save_SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *params)
   7746 {
   7747    Node *n;
   7748    GET_CURRENT_CONTEXT(ctx);
   7749    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7750    n = alloc_instruction(ctx, OPCODE_SAMPLER_PARAMETERIV, 6);
   7751    if (n) {
   7752       n[1].ui = sampler;
   7753       n[2].e = pname;
   7754       n[3].i = params[0];
   7755       if (pname == GL_TEXTURE_BORDER_COLOR) {
   7756          n[4].i = params[1];
   7757          n[5].i = params[2];
   7758          n[6].i = params[3];
   7759       }
   7760       else {
   7761          n[4].i = n[5].i = n[6].i = 0;
   7762       }
   7763    }
   7764    if (ctx->ExecuteFlag) {
   7765       CALL_SamplerParameteriv(ctx->Exec, (sampler, pname, params));
   7766    }
   7767 }
   7768 
   7769 static void GLAPIENTRY
   7770 save_SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
   7771 {
   7772    GLint parray[4];
   7773    parray[0] = param;
   7774    parray[1] = parray[2] = parray[3] = 0;
   7775    save_SamplerParameteriv(sampler, pname, parray);
   7776 }
   7777 
   7778 static void GLAPIENTRY
   7779 save_SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *params)
   7780 {
   7781    Node *n;
   7782    GET_CURRENT_CONTEXT(ctx);
   7783    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7784    n = alloc_instruction(ctx, OPCODE_SAMPLER_PARAMETERFV, 6);
   7785    if (n) {
   7786       n[1].ui = sampler;
   7787       n[2].e = pname;
   7788       n[3].f = params[0];
   7789       if (pname == GL_TEXTURE_BORDER_COLOR) {
   7790          n[4].f = params[1];
   7791          n[5].f = params[2];
   7792          n[6].f = params[3];
   7793       }
   7794       else {
   7795          n[4].f = n[5].f = n[6].f = 0.0F;
   7796       }
   7797    }
   7798    if (ctx->ExecuteFlag) {
   7799       CALL_SamplerParameterfv(ctx->Exec, (sampler, pname, params));
   7800    }
   7801 }
   7802 
   7803 static void GLAPIENTRY
   7804 save_SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
   7805 {
   7806    GLfloat parray[4];
   7807    parray[0] = param;
   7808    parray[1] = parray[2] = parray[3] = 0.0F;
   7809    save_SamplerParameterfv(sampler, pname, parray);
   7810 }
   7811 
   7812 static void GLAPIENTRY
   7813 save_SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *params)
   7814 {
   7815    Node *n;
   7816    GET_CURRENT_CONTEXT(ctx);
   7817    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7818    n = alloc_instruction(ctx, OPCODE_SAMPLER_PARAMETERIIV, 6);
   7819    if (n) {
   7820       n[1].ui = sampler;
   7821       n[2].e = pname;
   7822       n[3].i = params[0];
   7823       if (pname == GL_TEXTURE_BORDER_COLOR) {
   7824          n[4].i = params[1];
   7825          n[5].i = params[2];
   7826          n[6].i = params[3];
   7827       }
   7828       else {
   7829          n[4].i = n[5].i = n[6].i = 0;
   7830       }
   7831    }
   7832    if (ctx->ExecuteFlag) {
   7833       CALL_SamplerParameterIiv(ctx->Exec, (sampler, pname, params));
   7834    }
   7835 }
   7836 
   7837 static void GLAPIENTRY
   7838 save_SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *params)
   7839 {
   7840    Node *n;
   7841    GET_CURRENT_CONTEXT(ctx);
   7842    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7843    n = alloc_instruction(ctx, OPCODE_SAMPLER_PARAMETERUIV, 6);
   7844    if (n) {
   7845       n[1].ui = sampler;
   7846       n[2].e = pname;
   7847       n[3].ui = params[0];
   7848       if (pname == GL_TEXTURE_BORDER_COLOR) {
   7849          n[4].ui = params[1];
   7850          n[5].ui = params[2];
   7851          n[6].ui = params[3];
   7852       }
   7853       else {
   7854          n[4].ui = n[5].ui = n[6].ui = 0;
   7855       }
   7856    }
   7857    if (ctx->ExecuteFlag) {
   7858       CALL_SamplerParameterIuiv(ctx->Exec, (sampler, pname, params));
   7859    }
   7860 }
   7861 
   7862 static void GLAPIENTRY
   7863 save_WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
   7864 {
   7865    Node *n;
   7866    GET_CURRENT_CONTEXT(ctx);
   7867    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7868    n = alloc_instruction(ctx, OPCODE_WAIT_SYNC, 4);
   7869    if (n) {
   7870       union uint64_pair p;
   7871       p.uint64 = timeout;
   7872       n[1].bf = flags;
   7873       n[2].ui = p.uint32[0];
   7874       n[3].ui = p.uint32[1];
   7875       save_pointer(&n[4], sync);
   7876    }
   7877    if (ctx->ExecuteFlag) {
   7878       CALL_WaitSync(ctx->Exec, (sync, flags, timeout));
   7879    }
   7880 }
   7881 
   7882 
   7883 /** GL_NV_conditional_render */
   7884 static void GLAPIENTRY
   7885 save_BeginConditionalRender(GLuint queryId, GLenum mode)
   7886 {
   7887    GET_CURRENT_CONTEXT(ctx);
   7888    Node *n;
   7889    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7890    n = alloc_instruction(ctx, OPCODE_BEGIN_CONDITIONAL_RENDER, 2);
   7891    if (n) {
   7892       n[1].i = queryId;
   7893       n[2].e = mode;
   7894    }
   7895    if (ctx->ExecuteFlag) {
   7896       CALL_BeginConditionalRender(ctx->Exec, (queryId, mode));
   7897    }
   7898 }
   7899 
   7900 static void GLAPIENTRY
   7901 save_EndConditionalRender(void)
   7902 {
   7903    GET_CURRENT_CONTEXT(ctx);
   7904    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7905    alloc_instruction(ctx, OPCODE_END_CONDITIONAL_RENDER, 0);
   7906    if (ctx->ExecuteFlag) {
   7907       CALL_EndConditionalRender(ctx->Exec, ());
   7908    }
   7909 }
   7910 
   7911 static void GLAPIENTRY
   7912 save_UniformBlockBinding(GLuint prog, GLuint index, GLuint binding)
   7913 {
   7914    GET_CURRENT_CONTEXT(ctx);
   7915    Node *n;
   7916    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7917    n = alloc_instruction(ctx, OPCODE_UNIFORM_BLOCK_BINDING, 3);
   7918    if (n) {
   7919       n[1].ui = prog;
   7920       n[2].ui = index;
   7921       n[3].ui = binding;
   7922    }
   7923    if (ctx->ExecuteFlag) {
   7924       CALL_UniformBlockBinding(ctx->Exec, (prog, index, binding));
   7925    }
   7926 }
   7927 
   7928 /** GL_EXT_window_rectangles */
   7929 static void GLAPIENTRY
   7930 save_WindowRectanglesEXT(GLenum mode, GLsizei count, const GLint *box)
   7931 {
   7932    GET_CURRENT_CONTEXT(ctx);
   7933    Node *n;
   7934    ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
   7935    n = alloc_instruction(ctx, OPCODE_WINDOW_RECTANGLES, 2 + POINTER_DWORDS);
   7936    if (n) {
   7937       GLint *box_copy = NULL;
   7938 
   7939       if (count > 0)
   7940          box_copy = memdup(box, sizeof(GLint) * 4 * count);
   7941       n[1].e = mode;
   7942       n[2].si = count;
   7943       save_pointer(&n[3], box_copy);
   7944    }
   7945    if (ctx->ExecuteFlag) {
   7946       CALL_WindowRectanglesEXT(ctx->Exec, (mode, count, box));
   7947    }
   7948 }
   7949 
   7950 /**
   7951  * Save an error-generating command into display list.
   7952  *
   7953  * KW: Will appear in the list before the vertex buffer containing the
   7954  * command that provoked the error.  I don't see this as a problem.
   7955  */
   7956 static void
   7957 save_error(struct gl_context *ctx, GLenum error, const char *s)
   7958 {
   7959    Node *n;
   7960    n = alloc_instruction(ctx, OPCODE_ERROR, 1 + POINTER_DWORDS);
   7961    if (n) {
   7962       n[1].e = error;
   7963       save_pointer(&n[2], (void *) s);
   7964       /* note: the data/string here doesn't have to be freed in
   7965        * _mesa_delete_list() since the string is never dynamically
   7966        * allocated.
   7967        */
   7968    }
   7969 }
   7970 
   7971 
   7972 /**
   7973  * Compile an error into current display list.
   7974  */
   7975 void
   7976 _mesa_compile_error(struct gl_context *ctx, GLenum error, const char *s)
   7977 {
   7978    if (ctx->CompileFlag)
   7979       save_error(ctx, error, s);
   7980    if (ctx->ExecuteFlag)
   7981       _mesa_error(ctx, error, "%s", s);
   7982 }
   7983 
   7984 
   7985 /**
   7986  * Test if ID names a display list.
   7987  */
   7988 static GLboolean
   7989 islist(struct gl_context *ctx, GLuint list)
   7990 {
   7991    if (list > 0 && _mesa_lookup_list(ctx, list)) {
   7992       return GL_TRUE;
   7993    }
   7994    else {
   7995       return GL_FALSE;
   7996    }
   7997 }
   7998 
   7999 
   8000 
   8001 /**********************************************************************/
   8002 /*                     Display list execution                         */
   8003 /**********************************************************************/
   8004 
   8005 
   8006 /*
   8007  * Execute a display list.  Note that the ListBase offset must have already
   8008  * been added before calling this function.  I.e. the list argument is
   8009  * the absolute list number, not relative to ListBase.
   8010  * \param list - display list number
   8011  */
   8012 static void
   8013 execute_list(struct gl_context *ctx, GLuint list)
   8014 {
   8015    struct gl_display_list *dlist;
   8016    Node *n;
   8017    GLboolean done;
   8018 
   8019    if (list == 0 || !islist(ctx, list))
   8020       return;
   8021 
   8022    if (ctx->ListState.CallDepth == MAX_LIST_NESTING) {
   8023       /* raise an error? */
   8024       return;
   8025    }
   8026 
   8027    dlist = _mesa_lookup_list(ctx, list);
   8028    if (!dlist)
   8029       return;
   8030 
   8031    ctx->ListState.CallDepth++;
   8032 
   8033    vbo_save_BeginCallList(ctx, dlist);
   8034 
   8035    n = dlist->Head;
   8036 
   8037    done = GL_FALSE;
   8038    while (!done) {
   8039       const OpCode opcode = n[0].opcode;
   8040 
   8041       if (is_ext_opcode(opcode)) {
   8042          n += ext_opcode_execute(ctx, n);
   8043       }
   8044       else {
   8045          switch (opcode) {
   8046          case OPCODE_ERROR:
   8047             _mesa_error(ctx, n[1].e, "%s", (const char *) get_pointer(&n[2]));
   8048             break;
   8049          case OPCODE_ACCUM:
   8050             CALL_Accum(ctx->Exec, (n[1].e, n[2].f));
   8051             break;
   8052          case OPCODE_ALPHA_FUNC:
   8053             CALL_AlphaFunc(ctx->Exec, (n[1].e, n[2].f));
   8054             break;
   8055          case OPCODE_BIND_TEXTURE:
   8056             CALL_BindTexture(ctx->Exec, (n[1].e, n[2].ui));
   8057             break;
   8058          case OPCODE_BITMAP:
   8059             {
   8060                const struct gl_pixelstore_attrib save = ctx->Unpack;
   8061                ctx->Unpack = ctx->DefaultPacking;
   8062                CALL_Bitmap(ctx->Exec, ((GLsizei) n[1].i, (GLsizei) n[2].i,
   8063                                        n[3].f, n[4].f, n[5].f, n[6].f,
   8064                                        get_pointer(&n[7])));
   8065                ctx->Unpack = save;      /* restore */
   8066             }
   8067             break;
   8068          case OPCODE_BLEND_COLOR:
   8069             CALL_BlendColor(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
   8070             break;
   8071          case OPCODE_BLEND_EQUATION:
   8072             CALL_BlendEquation(ctx->Exec, (n[1].e));
   8073             break;
   8074          case OPCODE_BLEND_EQUATION_SEPARATE:
   8075             CALL_BlendEquationSeparate(ctx->Exec, (n[1].e, n[2].e));
   8076             break;
   8077          case OPCODE_BLEND_FUNC_SEPARATE:
   8078             CALL_BlendFuncSeparate(ctx->Exec,
   8079                                       (n[1].e, n[2].e, n[3].e, n[4].e));
   8080             break;
   8081 
   8082          case OPCODE_BLEND_FUNC_I:
   8083             /* GL_ARB_draw_buffers_blend */
   8084             CALL_BlendFunciARB(ctx->Exec, (n[1].ui, n[2].e, n[3].e));
   8085             break;
   8086          case OPCODE_BLEND_FUNC_SEPARATE_I:
   8087             /* GL_ARB_draw_buffers_blend */
   8088             CALL_BlendFuncSeparateiARB(ctx->Exec, (n[1].ui, n[2].e, n[3].e,
   8089                                                    n[4].e, n[5].e));
   8090             break;
   8091          case OPCODE_BLEND_EQUATION_I:
   8092             /* GL_ARB_draw_buffers_blend */
   8093             CALL_BlendEquationiARB(ctx->Exec, (n[1].ui, n[2].e));
   8094             break;
   8095          case OPCODE_BLEND_EQUATION_SEPARATE_I:
   8096             /* GL_ARB_draw_buffers_blend */
   8097             CALL_BlendEquationSeparateiARB(ctx->Exec,
   8098                                            (n[1].ui, n[2].e, n[3].e));
   8099             break;
   8100 
   8101          case OPCODE_CALL_LIST:
   8102             /* Generated by glCallList(), don't add ListBase */
   8103             if (ctx->ListState.CallDepth < MAX_LIST_NESTING) {
   8104                execute_list(ctx, n[1].ui);
   8105             }
   8106             break;
   8107          case OPCODE_CALL_LISTS:
   8108             if (ctx->ListState.CallDepth < MAX_LIST_NESTING) {
   8109                CALL_CallLists(ctx->Exec, (n[1].i, n[2].e, get_pointer(&n[3])));
   8110             }
   8111             break;
   8112          case OPCODE_CLEAR:
   8113             CALL_Clear(ctx->Exec, (n[1].bf));
   8114             break;
   8115          case OPCODE_CLEAR_BUFFER_IV:
   8116             {
   8117                GLint value[4];
   8118                value[0] = n[3].i;
   8119                value[1] = n[4].i;
   8120                value[2] = n[5].i;
   8121                value[3] = n[6].i;
   8122                CALL_ClearBufferiv(ctx->Exec, (n[1].e, n[2].i, value));
   8123             }
   8124             break;
   8125          case OPCODE_CLEAR_BUFFER_UIV:
   8126             {
   8127                GLuint value[4];
   8128                value[0] = n[3].ui;
   8129                value[1] = n[4].ui;
   8130                value[2] = n[5].ui;
   8131                value[3] = n[6].ui;
   8132                CALL_ClearBufferuiv(ctx->Exec, (n[1].e, n[2].i, value));
   8133             }
   8134             break;
   8135          case OPCODE_CLEAR_BUFFER_FV:
   8136             {
   8137                GLfloat value[4];
   8138                value[0] = n[3].f;
   8139                value[1] = n[4].f;
   8140                value[2] = n[5].f;
   8141                value[3] = n[6].f;
   8142                CALL_ClearBufferfv(ctx->Exec, (n[1].e, n[2].i, value));
   8143             }
   8144             break;
   8145          case OPCODE_CLEAR_BUFFER_FI:
   8146             CALL_ClearBufferfi(ctx->Exec, (n[1].e, n[2].i, n[3].f, n[4].i));
   8147             break;
   8148          case OPCODE_CLEAR_COLOR:
   8149             CALL_ClearColor(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
   8150             break;
   8151          case OPCODE_CLEAR_ACCUM:
   8152             CALL_ClearAccum(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
   8153             break;
   8154          case OPCODE_CLEAR_DEPTH:
   8155             CALL_ClearDepth(ctx->Exec, ((GLclampd) n[1].f));
   8156             break;
   8157          case OPCODE_CLEAR_INDEX:
   8158             CALL_ClearIndex(ctx->Exec, ((GLfloat) n[1].ui));
   8159             break;
   8160          case OPCODE_CLEAR_STENCIL:
   8161             CALL_ClearStencil(ctx->Exec, (n[1].i));
   8162             break;
   8163          case OPCODE_CLIP_PLANE:
   8164             {
   8165                GLdouble eq[4];
   8166                eq[0] = n[2].f;
   8167                eq[1] = n[3].f;
   8168                eq[2] = n[4].f;
   8169                eq[3] = n[5].f;
   8170                CALL_ClipPlane(ctx->Exec, (n[1].e, eq));
   8171             }
   8172             break;
   8173          case OPCODE_COLOR_MASK:
   8174             CALL_ColorMask(ctx->Exec, (n[1].b, n[2].b, n[3].b, n[4].b));
   8175             break;
   8176          case OPCODE_COLOR_MASK_INDEXED:
   8177             CALL_ColorMaski(ctx->Exec, (n[1].ui, n[2].b, n[3].b,
   8178                                                  n[4].b, n[5].b));
   8179             break;
   8180          case OPCODE_COLOR_MATERIAL:
   8181             CALL_ColorMaterial(ctx->Exec, (n[1].e, n[2].e));
   8182             break;
   8183          case OPCODE_COPY_PIXELS:
   8184             CALL_CopyPixels(ctx->Exec, (n[1].i, n[2].i,
   8185                                         (GLsizei) n[3].i, (GLsizei) n[4].i,
   8186                                         n[5].e));
   8187             break;
   8188          case OPCODE_COPY_TEX_IMAGE1D:
   8189             CALL_CopyTexImage1D(ctx->Exec, (n[1].e, n[2].i, n[3].e, n[4].i,
   8190                                             n[5].i, n[6].i, n[7].i));
   8191             break;
   8192          case OPCODE_COPY_TEX_IMAGE2D:
   8193             CALL_CopyTexImage2D(ctx->Exec, (n[1].e, n[2].i, n[3].e, n[4].i,
   8194                                             n[5].i, n[6].i, n[7].i, n[8].i));
   8195             break;
   8196          case OPCODE_COPY_TEX_SUB_IMAGE1D:
   8197             CALL_CopyTexSubImage1D(ctx->Exec, (n[1].e, n[2].i, n[3].i,
   8198                                                n[4].i, n[5].i, n[6].i));
   8199             break;
   8200          case OPCODE_COPY_TEX_SUB_IMAGE2D:
   8201             CALL_CopyTexSubImage2D(ctx->Exec, (n[1].e, n[2].i, n[3].i,
   8202                                                n[4].i, n[5].i, n[6].i, n[7].i,
   8203                                                n[8].i));
   8204             break;
   8205          case OPCODE_COPY_TEX_SUB_IMAGE3D:
   8206             CALL_CopyTexSubImage3D(ctx->Exec, (n[1].e, n[2].i, n[3].i,
   8207                                                n[4].i, n[5].i, n[6].i, n[7].i,
   8208                                                n[8].i, n[9].i));
   8209             break;
   8210          case OPCODE_CULL_FACE:
   8211             CALL_CullFace(ctx->Exec, (n[1].e));
   8212             break;
   8213          case OPCODE_DEPTH_FUNC:
   8214             CALL_DepthFunc(ctx->Exec, (n[1].e));
   8215             break;
   8216          case OPCODE_DEPTH_MASK:
   8217             CALL_DepthMask(ctx->Exec, (n[1].b));
   8218             break;
   8219          case OPCODE_DEPTH_RANGE:
   8220             CALL_DepthRange(ctx->Exec,
   8221                             ((GLclampd) n[1].f, (GLclampd) n[2].f));
   8222             break;
   8223          case OPCODE_DISABLE:
   8224             CALL_Disable(ctx->Exec, (n[1].e));
   8225             break;
   8226          case OPCODE_DISABLE_INDEXED:
   8227             CALL_Disablei(ctx->Exec, (n[1].ui, n[2].e));
   8228             break;
   8229          case OPCODE_DRAW_BUFFER:
   8230             CALL_DrawBuffer(ctx->Exec, (n[1].e));
   8231             break;
   8232          case OPCODE_DRAW_PIXELS:
   8233             {
   8234                const struct gl_pixelstore_attrib save = ctx->Unpack;
   8235                ctx->Unpack = ctx->DefaultPacking;
   8236                CALL_DrawPixels(ctx->Exec, (n[1].i, n[2].i, n[3].e, n[4].e,
   8237                                            get_pointer(&n[5])));
   8238                ctx->Unpack = save;      /* restore */
   8239             }
   8240             break;
   8241          case OPCODE_ENABLE:
   8242             CALL_Enable(ctx->Exec, (n[1].e));
   8243             break;
   8244          case OPCODE_ENABLE_INDEXED:
   8245             CALL_Enablei(ctx->Exec, (n[1].ui, n[2].e));
   8246             break;
   8247          case OPCODE_EVALMESH1:
   8248             CALL_EvalMesh1(ctx->Exec, (n[1].e, n[2].i, n[3].i));
   8249             break;
   8250          case OPCODE_EVALMESH2:
   8251             CALL_EvalMesh2(ctx->Exec,
   8252                            (n[1].e, n[2].i, n[3].i, n[4].i, n[5].i));
   8253             break;
   8254          case OPCODE_FOG:
   8255             {
   8256                GLfloat p[4];
   8257                p[0] = n[2].f;
   8258                p[1] = n[3].f;
   8259                p[2] = n[4].f;
   8260                p[3] = n[5].f;
   8261                CALL_Fogfv(ctx->Exec, (n[1].e, p));
   8262             }
   8263             break;
   8264          case OPCODE_FRONT_FACE:
   8265             CALL_FrontFace(ctx->Exec, (n[1].e));
   8266             break;
   8267          case OPCODE_FRUSTUM:
   8268             CALL_Frustum(ctx->Exec,
   8269                          (n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f));
   8270             break;
   8271          case OPCODE_HINT:
   8272             CALL_Hint(ctx->Exec, (n[1].e, n[2].e));
   8273             break;
   8274          case OPCODE_INDEX_MASK:
   8275             CALL_IndexMask(ctx->Exec, (n[1].ui));
   8276             break;
   8277          case OPCODE_INIT_NAMES:
   8278             CALL_InitNames(ctx->Exec, ());
   8279             break;
   8280          case OPCODE_LIGHT:
   8281             {
   8282                GLfloat p[4];
   8283                p[0] = n[3].f;
   8284                p[1] = n[4].f;
   8285                p[2] = n[5].f;
   8286                p[3] = n[6].f;
   8287                CALL_Lightfv(ctx->Exec, (n[1].e, n[2].e, p));
   8288             }
   8289             break;
   8290          case OPCODE_LIGHT_MODEL:
   8291             {
   8292                GLfloat p[4];
   8293                p[0] = n[2].f;
   8294                p[1] = n[3].f;
   8295                p[2] = n[4].f;
   8296                p[3] = n[5].f;
   8297                CALL_LightModelfv(ctx->Exec, (n[1].e, p));
   8298             }
   8299             break;
   8300          case OPCODE_LINE_STIPPLE:
   8301             CALL_LineStipple(ctx->Exec, (n[1].i, n[2].us));
   8302             break;
   8303          case OPCODE_LINE_WIDTH:
   8304             CALL_LineWidth(ctx->Exec, (n[1].f));
   8305             break;
   8306          case OPCODE_LIST_BASE:
   8307             CALL_ListBase(ctx->Exec, (n[1].ui));
   8308             break;
   8309          case OPCODE_LOAD_IDENTITY:
   8310             CALL_LoadIdentity(ctx->Exec, ());
   8311             break;
   8312          case OPCODE_LOAD_MATRIX:
   8313             STATIC_ASSERT(sizeof(Node) == sizeof(GLfloat));
   8314             CALL_LoadMatrixf(ctx->Exec, (&n[1].f));
   8315             break;
   8316          case OPCODE_LOAD_NAME:
   8317             CALL_LoadName(ctx->Exec, (n[1].ui));
   8318             break;
   8319          case OPCODE_LOGIC_OP:
   8320             CALL_LogicOp(ctx->Exec, (n[1].e));
   8321             break;
   8322          case OPCODE_MAP1:
   8323             {
   8324                GLenum target = n[1].e;
   8325                GLint ustride = _mesa_evaluator_components(target);
   8326                GLint uorder = n[5].i;
   8327                GLfloat u1 = n[2].f;
   8328                GLfloat u2 = n[3].f;
   8329                CALL_Map1f(ctx->Exec, (target, u1, u2, ustride, uorder,
   8330                                       (GLfloat *) get_pointer(&n[6])));
   8331             }
   8332             break;
   8333          case OPCODE_MAP2:
   8334             {
   8335                GLenum target = n[1].e;
   8336                GLfloat u1 = n[2].f;
   8337                GLfloat u2 = n[3].f;
   8338                GLfloat v1 = n[4].f;
   8339                GLfloat v2 = n[5].f;
   8340                GLint ustride = n[6].i;
   8341                GLint vstride = n[7].i;
   8342                GLint uorder = n[8].i;
   8343                GLint vorder = n[9].i;
   8344                CALL_Map2f(ctx->Exec, (target, u1, u2, ustride, uorder,
   8345                                       v1, v2, vstride, vorder,
   8346                                       (GLfloat *) get_pointer(&n[10])));
   8347             }
   8348             break;
   8349          case OPCODE_MAPGRID1:
   8350             CALL_MapGrid1f(ctx->Exec, (n[1].i, n[2].f, n[3].f));
   8351             break;
   8352          case OPCODE_MAPGRID2:
   8353             CALL_MapGrid2f(ctx->Exec,
   8354                            (n[1].i, n[2].f, n[3].f, n[4].i, n[5].f, n[6].f));
   8355             break;
   8356          case OPCODE_MATRIX_MODE:
   8357             CALL_MatrixMode(ctx->Exec, (n[1].e));
   8358             break;
   8359          case OPCODE_MULT_MATRIX:
   8360             CALL_MultMatrixf(ctx->Exec, (&n[1].f));
   8361             break;
   8362          case OPCODE_ORTHO:
   8363             CALL_Ortho(ctx->Exec,
   8364                        (n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f));
   8365             break;
   8366          case OPCODE_PASSTHROUGH:
   8367             CALL_PassThrough(ctx->Exec, (n[1].f));
   8368             break;
   8369          case OPCODE_PIXEL_MAP:
   8370             CALL_PixelMapfv(ctx->Exec,
   8371                             (n[1].e, n[2].i, get_pointer(&n[3])));
   8372             break;
   8373          case OPCODE_PIXEL_TRANSFER:
   8374             CALL_PixelTransferf(ctx->Exec, (n[1].e, n[2].f));
   8375             break;
   8376          case OPCODE_PIXEL_ZOOM:
   8377             CALL_PixelZoom(ctx->Exec, (n[1].f, n[2].f));
   8378             break;
   8379          case OPCODE_POINT_SIZE:
   8380             CALL_PointSize(ctx->Exec, (n[1].f));
   8381             break;
   8382          case OPCODE_POINT_PARAMETERS:
   8383             {
   8384                GLfloat params[3];
   8385                params[0] = n[2].f;
   8386                params[1] = n[3].f;
   8387                params[2] = n[4].f;
   8388                CALL_PointParameterfv(ctx->Exec, (n[1].e, params));
   8389             }
   8390             break;
   8391          case OPCODE_POLYGON_MODE:
   8392             CALL_PolygonMode(ctx->Exec, (n[1].e, n[2].e));
   8393             break;
   8394          case OPCODE_POLYGON_STIPPLE:
   8395             {
   8396                const struct gl_pixelstore_attrib save = ctx->Unpack;
   8397                ctx->Unpack = ctx->DefaultPacking;
   8398                CALL_PolygonStipple(ctx->Exec, (get_pointer(&n[1])));
   8399                ctx->Unpack = save;      /* restore */
   8400             }
   8401             break;
   8402          case OPCODE_POLYGON_OFFSET:
   8403             CALL_PolygonOffset(ctx->Exec, (n[1].f, n[2].f));
   8404             break;
   8405          case OPCODE_POLYGON_OFFSET_CLAMP:
   8406             CALL_PolygonOffsetClampEXT(ctx->Exec, (n[1].f, n[2].f, n[3].f));
   8407             break;
   8408          case OPCODE_POP_ATTRIB:
   8409             CALL_PopAttrib(ctx->Exec, ());
   8410             break;
   8411          case OPCODE_POP_MATRIX:
   8412             CALL_PopMatrix(ctx->Exec, ());
   8413             break;
   8414          case OPCODE_POP_NAME:
   8415             CALL_PopName(ctx->Exec, ());
   8416             break;
   8417          case OPCODE_PRIORITIZE_TEXTURE:
   8418             CALL_PrioritizeTextures(ctx->Exec, (1, &n[1].ui, &n[2].f));
   8419             break;
   8420          case OPCODE_PUSH_ATTRIB:
   8421             CALL_PushAttrib(ctx->Exec, (n[1].bf));
   8422             break;
   8423          case OPCODE_PUSH_MATRIX:
   8424             CALL_PushMatrix(ctx->Exec, ());
   8425             break;
   8426          case OPCODE_PUSH_NAME:
   8427             CALL_PushName(ctx->Exec, (n[1].ui));
   8428             break;
   8429          case OPCODE_RASTER_POS:
   8430             CALL_RasterPos4f(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
   8431             break;
   8432          case OPCODE_READ_BUFFER:
   8433             CALL_ReadBuffer(ctx->Exec, (n[1].e));
   8434             break;
   8435          case OPCODE_ROTATE:
   8436             CALL_Rotatef(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
   8437             break;
   8438          case OPCODE_SCALE:
   8439             CALL_Scalef(ctx->Exec, (n[1].f, n[2].f, n[3].f));
   8440             break;
   8441          case OPCODE_SCISSOR:
   8442             CALL_Scissor(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i));
   8443             break;
   8444          case OPCODE_SHADE_MODEL:
   8445             CALL_ShadeModel(ctx->Exec, (n[1].e));
   8446             break;
   8447          case OPCODE_PROVOKING_VERTEX:
   8448             CALL_ProvokingVertex(ctx->Exec, (n[1].e));
   8449             break;
   8450          case OPCODE_STENCIL_FUNC:
   8451             CALL_StencilFunc(ctx->Exec, (n[1].e, n[2].i, n[3].ui));
   8452             break;
   8453          case OPCODE_STENCIL_MASK:
   8454             CALL_StencilMask(ctx->Exec, (n[1].ui));
   8455             break;
   8456          case OPCODE_STENCIL_OP:
   8457             CALL_StencilOp(ctx->Exec, (n[1].e, n[2].e, n[3].e));
   8458             break;
   8459          case OPCODE_STENCIL_FUNC_SEPARATE:
   8460             CALL_StencilFuncSeparate(ctx->Exec,
   8461                                      (n[1].e, n[2].e, n[3].i, n[4].ui));
   8462             break;
   8463          case OPCODE_STENCIL_MASK_SEPARATE:
   8464             CALL_StencilMaskSeparate(ctx->Exec, (n[1].e, n[2].ui));
   8465             break;
   8466          case OPCODE_STENCIL_OP_SEPARATE:
   8467             CALL_StencilOpSeparate(ctx->Exec,
   8468                                    (n[1].e, n[2].e, n[3].e, n[4].e));
   8469             break;
   8470          case OPCODE_TEXENV:
   8471             {
   8472                GLfloat params[4];
   8473                params[0] = n[3].f;
   8474                params[1] = n[4].f;
   8475                params[2] = n[5].f;
   8476                params[3] = n[6].f;
   8477                CALL_TexEnvfv(ctx->Exec, (n[1].e, n[2].e, params));
   8478             }
   8479             break;
   8480          case OPCODE_TEXGEN:
   8481             {
   8482                GLfloat params[4];
   8483                params[0] = n[3].f;
   8484                params[1] = n[4].f;
   8485                params[2] = n[5].f;
   8486                params[3] = n[6].f;
   8487                CALL_TexGenfv(ctx->Exec, (n[1].e, n[2].e, params));
   8488             }
   8489             break;
   8490          case OPCODE_TEXPARAMETER:
   8491             {
   8492                GLfloat params[4];
   8493                params[0] = n[3].f;
   8494                params[1] = n[4].f;
   8495                params[2] = n[5].f;
   8496                params[3] = n[6].f;
   8497                CALL_TexParameterfv(ctx->Exec, (n[1].e, n[2].e, params));
   8498             }
   8499             break;
   8500          case OPCODE_TEX_IMAGE1D:
   8501             {
   8502                const struct gl_pixelstore_attrib save = ctx->Unpack;
   8503                ctx->Unpack = ctx->DefaultPacking;
   8504                CALL_TexImage1D(ctx->Exec, (n[1].e,      /* target */
   8505                                            n[2].i,      /* level */
   8506                                            n[3].i,      /* components */
   8507                                            n[4].i,      /* width */
   8508                                            n[5].e,      /* border */
   8509                                            n[6].e,      /* format */
   8510                                            n[7].e,      /* type */
   8511                                            get_pointer(&n[8])));
   8512                ctx->Unpack = save;      /* restore */
   8513             }
   8514             break;
   8515          case OPCODE_TEX_IMAGE2D:
   8516             {
   8517                const struct gl_pixelstore_attrib save = ctx->Unpack;
   8518                ctx->Unpack = ctx->DefaultPacking;
   8519                CALL_TexImage2D(ctx->Exec, (n[1].e,      /* target */
   8520                                            n[2].i,      /* level */
   8521                                            n[3].i,      /* components */
   8522                                            n[4].i,      /* width */
   8523                                            n[5].i,      /* height */
   8524                                            n[6].e,      /* border */
   8525                                            n[7].e,      /* format */
   8526                                            n[8].e,      /* type */
   8527                                            get_pointer(&n[9])));
   8528                ctx->Unpack = save;      /* restore */
   8529             }
   8530             break;
   8531          case OPCODE_TEX_IMAGE3D:
   8532             {
   8533                const struct gl_pixelstore_attrib save = ctx->Unpack;
   8534                ctx->Unpack = ctx->DefaultPacking;
   8535                CALL_TexImage3D(ctx->Exec, (n[1].e,      /* target */
   8536                                            n[2].i,      /* level */
   8537                                            n[3].i,      /* components */
   8538                                            n[4].i,      /* width */
   8539                                            n[5].i,      /* height */
   8540                                            n[6].i,      /* depth  */
   8541                                            n[7].e,      /* border */
   8542                                            n[8].e,      /* format */
   8543                                            n[9].e,      /* type */
   8544                                            get_pointer(&n[10])));
   8545                ctx->Unpack = save;      /* restore */
   8546             }
   8547             break;
   8548          case OPCODE_TEX_SUB_IMAGE1D:
   8549             {
   8550                const struct gl_pixelstore_attrib save = ctx->Unpack;
   8551                ctx->Unpack = ctx->DefaultPacking;
   8552                CALL_TexSubImage1D(ctx->Exec, (n[1].e, n[2].i, n[3].i,
   8553                                               n[4].i, n[5].e,
   8554                                               n[6].e, get_pointer(&n[7])));
   8555                ctx->Unpack = save;      /* restore */
   8556             }
   8557             break;
   8558          case OPCODE_TEX_SUB_IMAGE2D:
   8559             {
   8560                const struct gl_pixelstore_attrib save = ctx->Unpack;
   8561                ctx->Unpack = ctx->DefaultPacking;
   8562                CALL_TexSubImage2D(ctx->Exec, (n[1].e, n[2].i, n[3].i,
   8563                                               n[4].i, n[5].e,
   8564                                               n[6].i, n[7].e, n[8].e,
   8565                                               get_pointer(&n[9])));
   8566                ctx->Unpack = save;      /* restore */
   8567             }
   8568             break;
   8569          case OPCODE_TEX_SUB_IMAGE3D:
   8570             {
   8571                const struct gl_pixelstore_attrib save = ctx->Unpack;
   8572                ctx->Unpack = ctx->DefaultPacking;
   8573                CALL_TexSubImage3D(ctx->Exec, (n[1].e, n[2].i, n[3].i,
   8574                                               n[4].i, n[5].i, n[6].i, n[7].i,
   8575                                               n[8].i, n[9].e, n[10].e,
   8576                                               get_pointer(&n[11])));
   8577                ctx->Unpack = save;      /* restore */
   8578             }
   8579             break;
   8580          case OPCODE_TRANSLATE:
   8581             CALL_Translatef(ctx->Exec, (n[1].f, n[2].f, n[3].f));
   8582             break;
   8583          case OPCODE_VIEWPORT:
   8584             CALL_Viewport(ctx->Exec, (n[1].i, n[2].i,
   8585                                       (GLsizei) n[3].i, (GLsizei) n[4].i));
   8586             break;
   8587          case OPCODE_WINDOW_POS:
   8588             CALL_WindowPos4fMESA(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
   8589             break;
   8590          case OPCODE_ACTIVE_TEXTURE:   /* GL_ARB_multitexture */
   8591             CALL_ActiveTexture(ctx->Exec, (n[1].e));
   8592             break;
   8593          case OPCODE_COMPRESSED_TEX_IMAGE_1D:  /* GL_ARB_texture_compression */
   8594             CALL_CompressedTexImage1D(ctx->Exec, (n[1].e, n[2].i, n[3].e,
   8595                                                   n[4].i, n[5].i, n[6].i,
   8596                                                   get_pointer(&n[7])));
   8597             break;
   8598          case OPCODE_COMPRESSED_TEX_IMAGE_2D:  /* GL_ARB_texture_compression */
   8599             CALL_CompressedTexImage2D(ctx->Exec, (n[1].e, n[2].i, n[3].e,
   8600                                                   n[4].i, n[5].i, n[6].i,
   8601                                                   n[7].i, get_pointer(&n[8])));
   8602             break;
   8603          case OPCODE_COMPRESSED_TEX_IMAGE_3D:  /* GL_ARB_texture_compression */
   8604             CALL_CompressedTexImage3D(ctx->Exec, (n[1].e, n[2].i, n[3].e,
   8605                                                   n[4].i, n[5].i, n[6].i,
   8606                                                   n[7].i, n[8].i,
   8607                                                   get_pointer(&n[9])));
   8608             break;
   8609          case OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D:      /* GL_ARB_texture_compress */
   8610             CALL_CompressedTexSubImage1D(ctx->Exec,
   8611                                             (n[1].e, n[2].i, n[3].i, n[4].i,
   8612                                              n[5].e, n[6].i,
   8613                                              get_pointer(&n[7])));
   8614             break;
   8615          case OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D:      /* GL_ARB_texture_compress */
   8616             CALL_CompressedTexSubImage2D(ctx->Exec,
   8617                                             (n[1].e, n[2].i, n[3].i, n[4].i,
   8618                                              n[5].i, n[6].i, n[7].e, n[8].i,
   8619                                              get_pointer(&n[9])));
   8620             break;
   8621          case OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D:      /* GL_ARB_texture_compress */
   8622             CALL_CompressedTexSubImage3D(ctx->Exec,
   8623                                             (n[1].e, n[2].i, n[3].i, n[4].i,
   8624                                              n[5].i, n[6].i, n[7].i, n[8].i,
   8625                                              n[9].e, n[10].i,
   8626                                              get_pointer(&n[11])));
   8627             break;
   8628          case OPCODE_SAMPLE_COVERAGE:  /* GL_ARB_multisample */
   8629             CALL_SampleCoverage(ctx->Exec, (n[1].f, n[2].b));
   8630             break;
   8631          case OPCODE_WINDOW_POS_ARB:   /* GL_ARB_window_pos */
   8632             CALL_WindowPos3f(ctx->Exec, (n[1].f, n[2].f, n[3].f));
   8633             break;
   8634          case OPCODE_BIND_PROGRAM_ARB:  /* GL_ARB_vertex_program */
   8635             CALL_BindProgramARB(ctx->Exec, (n[1].e, n[2].ui));
   8636             break;
   8637          case OPCODE_PROGRAM_LOCAL_PARAMETER_ARB:
   8638             CALL_ProgramLocalParameter4fARB(ctx->Exec,
   8639                                             (n[1].e, n[2].ui, n[3].f, n[4].f,
   8640                                              n[5].f, n[6].f));
   8641             break;
   8642          case OPCODE_ACTIVE_STENCIL_FACE_EXT:
   8643             CALL_ActiveStencilFaceEXT(ctx->Exec, (n[1].e));
   8644             break;
   8645          case OPCODE_DEPTH_BOUNDS_EXT:
   8646             CALL_DepthBoundsEXT(ctx->Exec, (n[1].f, n[2].f));
   8647             break;
   8648          case OPCODE_PROGRAM_STRING_ARB:
   8649             CALL_ProgramStringARB(ctx->Exec,
   8650                                   (n[1].e, n[2].e, n[3].i,
   8651                                    get_pointer(&n[4])));
   8652             break;
   8653          case OPCODE_PROGRAM_ENV_PARAMETER_ARB:
   8654             CALL_ProgramEnvParameter4fARB(ctx->Exec, (n[1].e, n[2].ui, n[3].f,
   8655                                                       n[4].f, n[5].f,
   8656                                                       n[6].f));
   8657             break;
   8658          case OPCODE_BEGIN_QUERY_ARB:
   8659             CALL_BeginQuery(ctx->Exec, (n[1].e, n[2].ui));
   8660             break;
   8661          case OPCODE_END_QUERY_ARB:
   8662             CALL_EndQuery(ctx->Exec, (n[1].e));
   8663             break;
   8664          case OPCODE_QUERY_COUNTER:
   8665             CALL_QueryCounter(ctx->Exec, (n[1].ui, n[2].e));
   8666             break;
   8667          case OPCODE_BEGIN_QUERY_INDEXED:
   8668             CALL_BeginQueryIndexed(ctx->Exec, (n[1].e, n[2].ui, n[3].ui));
   8669             break;
   8670          case OPCODE_END_QUERY_INDEXED:
   8671             CALL_EndQueryIndexed(ctx->Exec, (n[1].e, n[2].ui));
   8672             break;
   8673          case OPCODE_DRAW_BUFFERS_ARB:
   8674             {
   8675                GLenum buffers[MAX_DRAW_BUFFERS];
   8676                GLint i, count = MIN2(n[1].i, MAX_DRAW_BUFFERS);
   8677                for (i = 0; i < count; i++)
   8678                   buffers[i] = n[2 + i].e;
   8679                CALL_DrawBuffers(ctx->Exec, (n[1].i, buffers));
   8680             }
   8681             break;
   8682          case OPCODE_BLIT_FRAMEBUFFER:
   8683             CALL_BlitFramebuffer(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i,
   8684                                                 n[5].i, n[6].i, n[7].i, n[8].i,
   8685                                                 n[9].i, n[10].e));
   8686             break;
   8687          case OPCODE_PRIMITIVE_RESTART_NV:
   8688             CALL_PrimitiveRestartNV(ctx->Exec, ());
   8689             break;
   8690 
   8691          case OPCODE_USE_PROGRAM:
   8692             CALL_UseProgram(ctx->Exec, (n[1].ui));
   8693             break;
   8694          case OPCODE_UNIFORM_1F:
   8695             CALL_Uniform1f(ctx->Exec, (n[1].i, n[2].f));
   8696             break;
   8697          case OPCODE_UNIFORM_2F:
   8698             CALL_Uniform2f(ctx->Exec, (n[1].i, n[2].f, n[3].f));
   8699             break;
   8700          case OPCODE_UNIFORM_3F:
   8701             CALL_Uniform3f(ctx->Exec, (n[1].i, n[2].f, n[3].f, n[4].f));
   8702             break;
   8703          case OPCODE_UNIFORM_4F:
   8704             CALL_Uniform4f(ctx->Exec,
   8705                               (n[1].i, n[2].f, n[3].f, n[4].f, n[5].f));
   8706             break;
   8707          case OPCODE_UNIFORM_1FV:
   8708             CALL_Uniform1fv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
   8709             break;
   8710          case OPCODE_UNIFORM_2FV:
   8711             CALL_Uniform2fv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
   8712             break;
   8713          case OPCODE_UNIFORM_3FV:
   8714             CALL_Uniform3fv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
   8715             break;
   8716          case OPCODE_UNIFORM_4FV:
   8717             CALL_Uniform4fv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
   8718             break;
   8719          case OPCODE_UNIFORM_1I:
   8720             CALL_Uniform1i(ctx->Exec, (n[1].i, n[2].i));
   8721             break;
   8722          case OPCODE_UNIFORM_2I:
   8723             CALL_Uniform2i(ctx->Exec, (n[1].i, n[2].i, n[3].i));
   8724             break;
   8725          case OPCODE_UNIFORM_3I:
   8726             CALL_Uniform3i(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i));
   8727             break;
   8728          case OPCODE_UNIFORM_4I:
   8729             CALL_Uniform4i(ctx->Exec,
   8730                               (n[1].i, n[2].i, n[3].i, n[4].i, n[5].i));
   8731             break;
   8732          case OPCODE_UNIFORM_1IV:
   8733             CALL_Uniform1iv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
   8734             break;
   8735          case OPCODE_UNIFORM_2IV:
   8736             CALL_Uniform2iv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
   8737             break;
   8738          case OPCODE_UNIFORM_3IV:
   8739             CALL_Uniform3iv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
   8740             break;
   8741          case OPCODE_UNIFORM_4IV:
   8742             CALL_Uniform4iv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
   8743             break;
   8744          case OPCODE_UNIFORM_1UI:
   8745             /*CALL_Uniform1uiARB(ctx->Exec, (n[1].i, n[2].i));*/
   8746             break;
   8747          case OPCODE_UNIFORM_2UI:
   8748             /*CALL_Uniform2uiARB(ctx->Exec, (n[1].i, n[2].i, n[3].i));*/
   8749             break;
   8750          case OPCODE_UNIFORM_3UI:
   8751             /*CALL_Uniform3uiARB(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i));*/
   8752             break;
   8753          case OPCODE_UNIFORM_4UI:
   8754             /*CALL_Uniform4uiARB(ctx->Exec,
   8755                               (n[1].i, n[2].i, n[3].i, n[4].i, n[5].i));
   8756             */
   8757             break;
   8758          case OPCODE_UNIFORM_1UIV:
   8759             /*CALL_Uniform1uivARB(ctx->Exec, (n[1].i, n[2].i,
   8760                                               get_pointer(&n[3])));*/
   8761             break;
   8762          case OPCODE_UNIFORM_2UIV:
   8763             /*CALL_Uniform2uivARB(ctx->Exec, (n[1].i, n[2].i,
   8764                                               get_pointer(&n[3])));*/
   8765             break;
   8766          case OPCODE_UNIFORM_3UIV:
   8767             /*CALL_Uniform3uivARB(ctx->Exec, (n[1].i, n[2].i,
   8768                                               get_pointer(&n[3])));*/
   8769             break;
   8770          case OPCODE_UNIFORM_4UIV:
   8771             /*CALL_Uniform4uivARB(ctx->Exec, (n[1].i, n[2].i,
   8772                                               get_pointer(&n[3])));*/
   8773             break;
   8774          case OPCODE_UNIFORM_MATRIX22:
   8775             CALL_UniformMatrix2fv(ctx->Exec,
   8776                                   (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
   8777             break;
   8778          case OPCODE_UNIFORM_MATRIX33:
   8779             CALL_UniformMatrix3fv(ctx->Exec,
   8780                                   (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
   8781             break;
   8782          case OPCODE_UNIFORM_MATRIX44:
   8783             CALL_UniformMatrix4fv(ctx->Exec,
   8784                                   (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
   8785             break;
   8786          case OPCODE_UNIFORM_MATRIX23:
   8787             CALL_UniformMatrix2x3fv(ctx->Exec,
   8788                                     (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
   8789             break;
   8790          case OPCODE_UNIFORM_MATRIX32:
   8791             CALL_UniformMatrix3x2fv(ctx->Exec,
   8792                                     (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
   8793             break;
   8794          case OPCODE_UNIFORM_MATRIX24:
   8795             CALL_UniformMatrix2x4fv(ctx->Exec,
   8796                                     (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
   8797             break;
   8798          case OPCODE_UNIFORM_MATRIX42:
   8799             CALL_UniformMatrix4x2fv(ctx->Exec,
   8800                                     (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
   8801             break;
   8802          case OPCODE_UNIFORM_MATRIX34:
   8803             CALL_UniformMatrix3x4fv(ctx->Exec,
   8804                                     (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
   8805             break;
   8806          case OPCODE_UNIFORM_MATRIX43:
   8807             CALL_UniformMatrix4x3fv(ctx->Exec,
   8808                                     (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
   8809             break;
   8810 
   8811          case OPCODE_USE_PROGRAM_STAGES:
   8812             CALL_UseProgramStages(ctx->Exec, (n[1].ui, n[2].ui, n[3].ui));
   8813             break;
   8814          case OPCODE_PROGRAM_UNIFORM_1F:
   8815             CALL_ProgramUniform1f(ctx->Exec, (n[1].ui, n[2].i, n[3].f));
   8816             break;
   8817          case OPCODE_PROGRAM_UNIFORM_2F:
   8818             CALL_ProgramUniform2f(ctx->Exec, (n[1].ui, n[2].i, n[3].f, n[4].f));
   8819             break;
   8820          case OPCODE_PROGRAM_UNIFORM_3F:
   8821             CALL_ProgramUniform3f(ctx->Exec, (n[1].ui, n[2].i,
   8822                                               n[3].f, n[4].f, n[5].f));
   8823             break;
   8824          case OPCODE_PROGRAM_UNIFORM_4F:
   8825             CALL_ProgramUniform4f(ctx->Exec, (n[1].ui, n[2].i,
   8826                                               n[3].f, n[4].f, n[5].f, n[6].f));
   8827             break;
   8828          case OPCODE_PROGRAM_UNIFORM_1FV:
   8829             CALL_ProgramUniform1fv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
   8830                                                get_pointer(&n[4])));
   8831             break;
   8832          case OPCODE_PROGRAM_UNIFORM_2FV:
   8833             CALL_ProgramUniform2fv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
   8834                                                get_pointer(&n[4])));
   8835             break;
   8836          case OPCODE_PROGRAM_UNIFORM_3FV:
   8837             CALL_ProgramUniform3fv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
   8838                                                get_pointer(&n[4])));
   8839             break;
   8840          case OPCODE_PROGRAM_UNIFORM_4FV:
   8841             CALL_ProgramUniform4fv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
   8842                                                get_pointer(&n[4])));
   8843             break;
   8844          case OPCODE_PROGRAM_UNIFORM_1I:
   8845             CALL_ProgramUniform1i(ctx->Exec, (n[1].ui, n[2].i, n[3].i));
   8846             break;
   8847          case OPCODE_PROGRAM_UNIFORM_2I:
   8848             CALL_ProgramUniform2i(ctx->Exec, (n[1].ui, n[2].i, n[3].i, n[4].i));
   8849             break;
   8850          case OPCODE_PROGRAM_UNIFORM_3I:
   8851             CALL_ProgramUniform3i(ctx->Exec, (n[1].ui, n[2].i,
   8852                                               n[3].i, n[4].i, n[5].i));
   8853             break;
   8854          case OPCODE_PROGRAM_UNIFORM_4I:
   8855             CALL_ProgramUniform4i(ctx->Exec, (n[1].ui, n[2].i,
   8856                                               n[3].i, n[4].i, n[5].i, n[6].i));
   8857             break;
   8858          case OPCODE_PROGRAM_UNIFORM_1IV:
   8859             CALL_ProgramUniform1iv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
   8860                                                get_pointer(&n[4])));
   8861             break;
   8862          case OPCODE_PROGRAM_UNIFORM_2IV:
   8863             CALL_ProgramUniform2iv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
   8864                                                get_pointer(&n[4])));
   8865             break;
   8866          case OPCODE_PROGRAM_UNIFORM_3IV:
   8867             CALL_ProgramUniform3iv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
   8868                                                get_pointer(&n[4])));
   8869             break;
   8870          case OPCODE_PROGRAM_UNIFORM_4IV:
   8871             CALL_ProgramUniform4iv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
   8872                                                get_pointer(&n[4])));
   8873             break;
   8874          case OPCODE_PROGRAM_UNIFORM_1UI:
   8875             CALL_ProgramUniform1ui(ctx->Exec, (n[1].ui, n[2].i, n[3].ui));
   8876             break;
   8877          case OPCODE_PROGRAM_UNIFORM_2UI:
   8878             CALL_ProgramUniform2ui(ctx->Exec, (n[1].ui, n[2].i,
   8879                                                n[3].ui, n[4].ui));
   8880             break;
   8881          case OPCODE_PROGRAM_UNIFORM_3UI:
   8882             CALL_ProgramUniform3ui(ctx->Exec, (n[1].ui, n[2].i,
   8883                                                n[3].ui, n[4].ui, n[5].ui));
   8884             break;
   8885          case OPCODE_PROGRAM_UNIFORM_4UI:
   8886             CALL_ProgramUniform4ui(ctx->Exec, (n[1].ui, n[2].i,
   8887                                                n[3].ui,
   8888                                                n[4].ui, n[5].ui, n[6].ui));
   8889             break;
   8890          case OPCODE_PROGRAM_UNIFORM_1UIV:
   8891             CALL_ProgramUniform1uiv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
   8892                                                 get_pointer(&n[4])));
   8893             break;
   8894          case OPCODE_PROGRAM_UNIFORM_2UIV:
   8895             CALL_ProgramUniform2uiv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
   8896                                                 get_pointer(&n[4])));
   8897             break;
   8898          case OPCODE_PROGRAM_UNIFORM_3UIV:
   8899             CALL_ProgramUniform3uiv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
   8900                                                 get_pointer(&n[4])));
   8901             break;
   8902          case OPCODE_PROGRAM_UNIFORM_4UIV:
   8903             CALL_ProgramUniform4uiv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
   8904                                                 get_pointer(&n[4])));
   8905             break;
   8906          case OPCODE_PROGRAM_UNIFORM_MATRIX22F:
   8907             CALL_ProgramUniformMatrix2fv(ctx->Exec,
   8908                                          (n[1].ui, n[2].i, n[3].i, n[4].b,
   8909                                           get_pointer(&n[5])));
   8910             break;
   8911          case OPCODE_PROGRAM_UNIFORM_MATRIX23F:
   8912             CALL_ProgramUniformMatrix2x3fv(ctx->Exec,
   8913                                            (n[1].ui, n[2].i, n[3].i, n[4].b,
   8914                                             get_pointer(&n[5])));
   8915             break;
   8916          case OPCODE_PROGRAM_UNIFORM_MATRIX24F:
   8917             CALL_ProgramUniformMatrix2x4fv(ctx->Exec,
   8918                                            (n[1].ui, n[2].i, n[3].i, n[4].b,
   8919                                             get_pointer(&n[5])));
   8920             break;
   8921          case OPCODE_PROGRAM_UNIFORM_MATRIX32F:
   8922             CALL_ProgramUniformMatrix3x2fv(ctx->Exec,
   8923                                            (n[1].ui, n[2].i, n[3].i, n[4].b,
   8924                                             get_pointer(&n[5])));
   8925             break;
   8926          case OPCODE_PROGRAM_UNIFORM_MATRIX33F:
   8927             CALL_ProgramUniformMatrix3fv(ctx->Exec,
   8928                                          (n[1].ui, n[2].i, n[3].i, n[4].b,
   8929                                           get_pointer(&n[5])));
   8930             break;
   8931          case OPCODE_PROGRAM_UNIFORM_MATRIX34F:
   8932             CALL_ProgramUniformMatrix3x4fv(ctx->Exec,
   8933                                            (n[1].ui, n[2].i, n[3].i, n[4].b,
   8934                                             get_pointer(&n[5])));
   8935             break;
   8936          case OPCODE_PROGRAM_UNIFORM_MATRIX42F:
   8937             CALL_ProgramUniformMatrix4x2fv(ctx->Exec,
   8938                                            (n[1].ui, n[2].i, n[3].i, n[4].b,
   8939                                             get_pointer(&n[5])));
   8940             break;
   8941          case OPCODE_PROGRAM_UNIFORM_MATRIX43F:
   8942             CALL_ProgramUniformMatrix4x3fv(ctx->Exec,
   8943                                            (n[1].ui, n[2].i, n[3].i, n[4].b,
   8944                                             get_pointer(&n[5])));
   8945             break;
   8946          case OPCODE_PROGRAM_UNIFORM_MATRIX44F:
   8947             CALL_ProgramUniformMatrix4fv(ctx->Exec,
   8948                                          (n[1].ui, n[2].i, n[3].i, n[4].b,
   8949                                           get_pointer(&n[5])));
   8950             break;
   8951 
   8952          case OPCODE_CLIP_CONTROL:
   8953             CALL_ClipControl(ctx->Exec, (n[1].e, n[2].e));
   8954             break;
   8955 
   8956          case OPCODE_CLAMP_COLOR:
   8957             CALL_ClampColor(ctx->Exec, (n[1].e, n[2].e));
   8958             break;
   8959 
   8960          case OPCODE_BIND_FRAGMENT_SHADER_ATI:
   8961             CALL_BindFragmentShaderATI(ctx->Exec, (n[1].i));
   8962             break;
   8963          case OPCODE_SET_FRAGMENT_SHADER_CONSTANTS_ATI:
   8964             CALL_SetFragmentShaderConstantATI(ctx->Exec, (n[1].ui, &n[2].f));
   8965             break;
   8966          case OPCODE_ATTR_1F_NV:
   8967             CALL_VertexAttrib1fNV(ctx->Exec, (n[1].e, n[2].f));
   8968             break;
   8969          case OPCODE_ATTR_2F_NV:
   8970             CALL_VertexAttrib2fvNV(ctx->Exec, (n[1].e, &n[2].f));
   8971             break;
   8972          case OPCODE_ATTR_3F_NV:
   8973             CALL_VertexAttrib3fvNV(ctx->Exec, (n[1].e, &n[2].f));
   8974             break;
   8975          case OPCODE_ATTR_4F_NV:
   8976             CALL_VertexAttrib4fvNV(ctx->Exec, (n[1].e, &n[2].f));
   8977             break;
   8978          case OPCODE_ATTR_1F_ARB:
   8979             CALL_VertexAttrib1fARB(ctx->Exec, (n[1].e, n[2].f));
   8980             break;
   8981          case OPCODE_ATTR_2F_ARB:
   8982             CALL_VertexAttrib2fvARB(ctx->Exec, (n[1].e, &n[2].f));
   8983             break;
   8984          case OPCODE_ATTR_3F_ARB:
   8985             CALL_VertexAttrib3fvARB(ctx->Exec, (n[1].e, &n[2].f));
   8986             break;
   8987          case OPCODE_ATTR_4F_ARB:
   8988             CALL_VertexAttrib4fvARB(ctx->Exec, (n[1].e, &n[2].f));
   8989             break;
   8990          case OPCODE_MATERIAL:
   8991             CALL_Materialfv(ctx->Exec, (n[1].e, n[2].e, &n[3].f));
   8992             break;
   8993          case OPCODE_BEGIN:
   8994             CALL_Begin(ctx->Exec, (n[1].e));
   8995             break;
   8996          case OPCODE_END:
   8997             CALL_End(ctx->Exec, ());
   8998             break;
   8999          case OPCODE_RECTF:
   9000             CALL_Rectf(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
   9001             break;
   9002          case OPCODE_EVAL_C1:
   9003             CALL_EvalCoord1f(ctx->Exec, (n[1].f));
   9004             break;
   9005          case OPCODE_EVAL_C2:
   9006             CALL_EvalCoord2f(ctx->Exec, (n[1].f, n[2].f));
   9007             break;
   9008          case OPCODE_EVAL_P1:
   9009             CALL_EvalPoint1(ctx->Exec, (n[1].i));
   9010             break;
   9011          case OPCODE_EVAL_P2:
   9012             CALL_EvalPoint2(ctx->Exec, (n[1].i, n[2].i));
   9013             break;
   9014 
   9015          /* GL_EXT_texture_integer */
   9016          case OPCODE_CLEARCOLOR_I:
   9017             CALL_ClearColorIiEXT(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i));
   9018             break;
   9019          case OPCODE_CLEARCOLOR_UI:
   9020             CALL_ClearColorIuiEXT(ctx->Exec,
   9021                                   (n[1].ui, n[2].ui, n[3].ui, n[4].ui));
   9022             break;
   9023          case OPCODE_TEXPARAMETER_I:
   9024             {
   9025                GLint params[4];
   9026                params[0] = n[3].i;
   9027                params[1] = n[4].i;
   9028                params[2] = n[5].i;
   9029                params[3] = n[6].i;
   9030                CALL_TexParameterIiv(ctx->Exec, (n[1].e, n[2].e, params));
   9031             }
   9032             break;
   9033          case OPCODE_TEXPARAMETER_UI:
   9034             {
   9035                GLuint params[4];
   9036                params[0] = n[3].ui;
   9037                params[1] = n[4].ui;
   9038                params[2] = n[5].ui;
   9039                params[3] = n[6].ui;
   9040                CALL_TexParameterIuiv(ctx->Exec, (n[1].e, n[2].e, params));
   9041             }
   9042             break;
   9043 
   9044          case OPCODE_VERTEX_ATTRIB_DIVISOR:
   9045             /* GL_ARB_instanced_arrays */
   9046             CALL_VertexAttribDivisor(ctx->Exec, (n[1].ui, n[2].ui));
   9047             break;
   9048 
   9049          case OPCODE_TEXTURE_BARRIER_NV:
   9050             CALL_TextureBarrierNV(ctx->Exec, ());
   9051             break;
   9052 
   9053          /* GL_EXT/ARB_transform_feedback */
   9054          case OPCODE_BEGIN_TRANSFORM_FEEDBACK:
   9055             CALL_BeginTransformFeedback(ctx->Exec, (n[1].e));
   9056             break;
   9057          case OPCODE_END_TRANSFORM_FEEDBACK:
   9058             CALL_EndTransformFeedback(ctx->Exec, ());
   9059             break;
   9060          case OPCODE_BIND_TRANSFORM_FEEDBACK:
   9061             CALL_BindTransformFeedback(ctx->Exec, (n[1].e, n[2].ui));
   9062             break;
   9063          case OPCODE_PAUSE_TRANSFORM_FEEDBACK:
   9064             CALL_PauseTransformFeedback(ctx->Exec, ());
   9065             break;
   9066          case OPCODE_RESUME_TRANSFORM_FEEDBACK:
   9067             CALL_ResumeTransformFeedback(ctx->Exec, ());
   9068             break;
   9069          case OPCODE_DRAW_TRANSFORM_FEEDBACK:
   9070             CALL_DrawTransformFeedback(ctx->Exec, (n[1].e, n[2].ui));
   9071             break;
   9072          case OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM:
   9073             CALL_DrawTransformFeedbackStream(ctx->Exec,
   9074                                              (n[1].e, n[2].ui, n[3].ui));
   9075             break;
   9076          case OPCODE_DRAW_TRANSFORM_FEEDBACK_INSTANCED:
   9077             CALL_DrawTransformFeedbackInstanced(ctx->Exec,
   9078                                                 (n[1].e, n[2].ui, n[3].si));
   9079             break;
   9080          case OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM_INSTANCED:
   9081             CALL_DrawTransformFeedbackStreamInstanced(ctx->Exec,
   9082                                        (n[1].e, n[2].ui, n[3].ui, n[4].si));
   9083             break;
   9084 
   9085 
   9086          case OPCODE_BIND_SAMPLER:
   9087             CALL_BindSampler(ctx->Exec, (n[1].ui, n[2].ui));
   9088             break;
   9089          case OPCODE_SAMPLER_PARAMETERIV:
   9090             {
   9091                GLint params[4];
   9092                params[0] = n[3].i;
   9093                params[1] = n[4].i;
   9094                params[2] = n[5].i;
   9095                params[3] = n[6].i;
   9096                CALL_SamplerParameteriv(ctx->Exec, (n[1].ui, n[2].e, params));
   9097             }
   9098             break;
   9099          case OPCODE_SAMPLER_PARAMETERFV:
   9100             {
   9101                GLfloat params[4];
   9102                params[0] = n[3].f;
   9103                params[1] = n[4].f;
   9104                params[2] = n[5].f;
   9105                params[3] = n[6].f;
   9106                CALL_SamplerParameterfv(ctx->Exec, (n[1].ui, n[2].e, params));
   9107             }
   9108             break;
   9109          case OPCODE_SAMPLER_PARAMETERIIV:
   9110             {
   9111                GLint params[4];
   9112                params[0] = n[3].i;
   9113                params[1] = n[4].i;
   9114                params[2] = n[5].i;
   9115                params[3] = n[6].i;
   9116                CALL_SamplerParameterIiv(ctx->Exec, (n[1].ui, n[2].e, params));
   9117             }
   9118             break;
   9119          case OPCODE_SAMPLER_PARAMETERUIV:
   9120             {
   9121                GLuint params[4];
   9122                params[0] = n[3].ui;
   9123                params[1] = n[4].ui;
   9124                params[2] = n[5].ui;
   9125                params[3] = n[6].ui;
   9126                CALL_SamplerParameterIuiv(ctx->Exec, (n[1].ui, n[2].e, params));
   9127             }
   9128             break;
   9129 
   9130          /* GL_ARB_sync */
   9131          case OPCODE_WAIT_SYNC:
   9132             {
   9133                union uint64_pair p;
   9134                p.uint32[0] = n[2].ui;
   9135                p.uint32[1] = n[3].ui;
   9136                CALL_WaitSync(ctx->Exec,
   9137                              (get_pointer(&n[4]), n[1].bf, p.uint64));
   9138             }
   9139             break;
   9140 
   9141          /* GL_NV_conditional_render */
   9142          case OPCODE_BEGIN_CONDITIONAL_RENDER:
   9143             CALL_BeginConditionalRender(ctx->Exec, (n[1].i, n[2].e));
   9144             break;
   9145          case OPCODE_END_CONDITIONAL_RENDER:
   9146             CALL_EndConditionalRender(ctx->Exec, ());
   9147             break;
   9148 
   9149          case OPCODE_UNIFORM_BLOCK_BINDING:
   9150             CALL_UniformBlockBinding(ctx->Exec, (n[1].ui, n[2].ui, n[3].ui));
   9151             break;
   9152 
   9153          /* GL_EXT_window_rectangles */
   9154          case OPCODE_WINDOW_RECTANGLES:
   9155             CALL_WindowRectanglesEXT(
   9156                   ctx->Exec, (n[1].e, n[2].si, get_pointer(&n[3])));
   9157             break;
   9158 
   9159          case OPCODE_CONTINUE:
   9160             n = (Node *) get_pointer(&n[1]);
   9161             break;
   9162          case OPCODE_NOP:
   9163             /* no-op */
   9164             break;
   9165          case OPCODE_END_OF_LIST:
   9166             done = GL_TRUE;
   9167             break;
   9168          default:
   9169             {
   9170                char msg[1000];
   9171                _mesa_snprintf(msg, sizeof(msg), "Error in execute_list: opcode=%d",
   9172                              (int) opcode);
   9173                _mesa_problem(ctx, "%s", msg);
   9174             }
   9175             done = GL_TRUE;
   9176          }
   9177 
   9178          /* increment n to point to next compiled command */
   9179          if (opcode != OPCODE_CONTINUE) {
   9180             n += InstSize[opcode];
   9181          }
   9182       }
   9183    }
   9184 
   9185    vbo_save_EndCallList(ctx);
   9186 
   9187    ctx->ListState.CallDepth--;
   9188 }
   9189 
   9190 
   9191 
   9192 /**********************************************************************/
   9193 /*                           GL functions                             */
   9194 /**********************************************************************/
   9195 
   9196 /**
   9197  * Test if a display list number is valid.
   9198  */
   9199 GLboolean GLAPIENTRY
   9200 _mesa_IsList(GLuint list)
   9201 {
   9202    GET_CURRENT_CONTEXT(ctx);
   9203    FLUSH_VERTICES(ctx, 0);      /* must be called before assert */
   9204    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
   9205    return islist(ctx, list);
   9206 }
   9207 
   9208 
   9209 /**
   9210  * Delete a sequence of consecutive display lists.
   9211  */
   9212 void GLAPIENTRY
   9213 _mesa_DeleteLists(GLuint list, GLsizei range)
   9214 {
   9215    GET_CURRENT_CONTEXT(ctx);
   9216    GLuint i;
   9217    FLUSH_VERTICES(ctx, 0);      /* must be called before assert */
   9218    ASSERT_OUTSIDE_BEGIN_END(ctx);
   9219 
   9220    if (range < 0) {
   9221       _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteLists");
   9222       return;
   9223    }
   9224 
   9225    if (range > 1) {
   9226       /* We may be deleting a set of bitmap lists.  See if there's a
   9227        * bitmap atlas to free.
   9228        */
   9229       struct gl_bitmap_atlas *atlas = lookup_bitmap_atlas(ctx, list);
   9230       if (atlas) {
   9231          _mesa_delete_bitmap_atlas(ctx, atlas);
   9232          _mesa_HashRemove(ctx->Shared->BitmapAtlas, list);
   9233       }
   9234    }
   9235 
   9236    for (i = list; i < list + range; i++) {
   9237       destroy_list(ctx, i);
   9238    }
   9239 }
   9240 
   9241 
   9242 /**
   9243  * Return a display list number, n, such that lists n through n+range-1
   9244  * are free.
   9245  */
   9246 GLuint GLAPIENTRY
   9247 _mesa_GenLists(GLsizei range)
   9248 {
   9249    GET_CURRENT_CONTEXT(ctx);
   9250    GLuint base;
   9251    FLUSH_VERTICES(ctx, 0);      /* must be called before assert */
   9252    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
   9253 
   9254    if (range < 0) {
   9255       _mesa_error(ctx, GL_INVALID_VALUE, "glGenLists");
   9256       return 0;
   9257    }
   9258    if (range == 0) {
   9259       return 0;
   9260    }
   9261 
   9262    /*
   9263     * Make this an atomic operation
   9264     */
   9265    _mesa_HashLockMutex(ctx->Shared->DisplayList);
   9266 
   9267    base = _mesa_HashFindFreeKeyBlock(ctx->Shared->DisplayList, range);
   9268    if (base) {
   9269       /* reserve the list IDs by with empty/dummy lists */
   9270       GLint i;
   9271       for (i = 0; i < range; i++) {
   9272          _mesa_HashInsertLocked(ctx->Shared->DisplayList, base + i,
   9273                                 make_list(base + i, 1));
   9274       }
   9275    }
   9276 
   9277    if (USE_BITMAP_ATLAS &&
   9278        range > 16 &&
   9279        ctx->Driver.DrawAtlasBitmaps) {
   9280       /* "range > 16" is a rough heuristic to guess when glGenLists might be
   9281        * used to allocate display lists for glXUseXFont or wglUseFontBitmaps.
   9282        * Create the empty atlas now.
   9283        */
   9284       struct gl_bitmap_atlas *atlas = lookup_bitmap_atlas(ctx, base);
   9285       if (!atlas) {
   9286          atlas = alloc_bitmap_atlas(ctx, base);
   9287       }
   9288       if (atlas) {
   9289          /* Atlas _should_ be new/empty now, but clobbering is OK */
   9290          assert(atlas->numBitmaps == 0);
   9291          atlas->numBitmaps = range;
   9292       }
   9293    }
   9294 
   9295    _mesa_HashUnlockMutex(ctx->Shared->DisplayList);
   9296 
   9297    return base;
   9298 }
   9299 
   9300 
   9301 /**
   9302  * Begin a new display list.
   9303  */
   9304 void GLAPIENTRY
   9305 _mesa_NewList(GLuint name, GLenum mode)
   9306 {
   9307    GET_CURRENT_CONTEXT(ctx);
   9308 
   9309    FLUSH_CURRENT(ctx, 0);       /* must be called before assert */
   9310    ASSERT_OUTSIDE_BEGIN_END(ctx);
   9311 
   9312    if (MESA_VERBOSE & VERBOSE_API)
   9313       _mesa_debug(ctx, "glNewList %u %s\n", name,
   9314                   _mesa_enum_to_string(mode));
   9315 
   9316    if (name == 0) {
   9317       _mesa_error(ctx, GL_INVALID_VALUE, "glNewList");
   9318       return;
   9319    }
   9320 
   9321    if (mode != GL_COMPILE && mode != GL_COMPILE_AND_EXECUTE) {
   9322       _mesa_error(ctx, GL_INVALID_ENUM, "glNewList");
   9323       return;
   9324    }
   9325 
   9326    if (ctx->ListState.CurrentList) {
   9327       /* already compiling a display list */
   9328       _mesa_error(ctx, GL_INVALID_OPERATION, "glNewList");
   9329       return;
   9330    }
   9331 
   9332    ctx->CompileFlag = GL_TRUE;
   9333    ctx->ExecuteFlag = (mode == GL_COMPILE_AND_EXECUTE);
   9334 
   9335    /* Reset accumulated list state */
   9336    invalidate_saved_current_state( ctx );
   9337 
   9338    /* Allocate new display list */
   9339    ctx->ListState.CurrentList = make_list(name, BLOCK_SIZE);
   9340    ctx->ListState.CurrentBlock = ctx->ListState.CurrentList->Head;
   9341    ctx->ListState.CurrentPos = 0;
   9342 
   9343    vbo_save_NewList(ctx, name, mode);
   9344 
   9345    ctx->CurrentServerDispatch = ctx->Save;
   9346    _glapi_set_dispatch(ctx->CurrentServerDispatch);
   9347    if (ctx->MarshalExec == NULL) {
   9348       ctx->CurrentClientDispatch = ctx->CurrentServerDispatch;
   9349    }
   9350 }
   9351 
   9352 
   9353 /**
   9354  * End definition of current display list.
   9355  */
   9356 void GLAPIENTRY
   9357 _mesa_EndList(void)
   9358 {
   9359    GET_CURRENT_CONTEXT(ctx);
   9360    SAVE_FLUSH_VERTICES(ctx);
   9361    FLUSH_VERTICES(ctx, 0);
   9362 
   9363    if (MESA_VERBOSE & VERBOSE_API)
   9364       _mesa_debug(ctx, "glEndList\n");
   9365 
   9366    if (ctx->ExecuteFlag && _mesa_inside_dlist_begin_end(ctx)) {
   9367       _mesa_error(ctx, GL_INVALID_OPERATION,
   9368                   "glEndList() called inside glBegin/End");
   9369    }
   9370 
   9371    /* Check that a list is under construction */
   9372    if (!ctx->ListState.CurrentList) {
   9373       _mesa_error(ctx, GL_INVALID_OPERATION, "glEndList");
   9374       return;
   9375    }
   9376 
   9377    /* Call before emitting END_OF_LIST, in case the driver wants to
   9378     * emit opcodes itself.
   9379     */
   9380    vbo_save_EndList(ctx);
   9381 
   9382    (void) alloc_instruction(ctx, OPCODE_END_OF_LIST, 0);
   9383 
   9384    trim_list(ctx);
   9385 
   9386    /* Destroy old list, if any */
   9387    destroy_list(ctx, ctx->ListState.CurrentList->Name);
   9388 
   9389    /* Install the new list */
   9390    _mesa_HashInsert(ctx->Shared->DisplayList,
   9391                     ctx->ListState.CurrentList->Name,
   9392                     ctx->ListState.CurrentList);
   9393 
   9394 
   9395    if (MESA_VERBOSE & VERBOSE_DISPLAY_LIST)
   9396       mesa_print_display_list(ctx->ListState.CurrentList->Name);
   9397 
   9398    ctx->ListState.CurrentList = NULL;
   9399    ctx->ListState.CurrentBlock = NULL;
   9400    ctx->ListState.CurrentPos = 0;
   9401    ctx->ExecuteFlag = GL_TRUE;
   9402    ctx->CompileFlag = GL_FALSE;
   9403 
   9404    ctx->CurrentServerDispatch = ctx->Exec;
   9405    _glapi_set_dispatch(ctx->CurrentServerDispatch);
   9406    if (ctx->MarshalExec == NULL) {
   9407       ctx->CurrentClientDispatch = ctx->CurrentServerDispatch;
   9408    }
   9409 }
   9410 
   9411 
   9412 void GLAPIENTRY
   9413 _mesa_CallList(GLuint list)
   9414 {
   9415    GLboolean save_compile_flag;
   9416    GET_CURRENT_CONTEXT(ctx);
   9417    FLUSH_CURRENT(ctx, 0);
   9418 
   9419    if (MESA_VERBOSE & VERBOSE_API)
   9420       _mesa_debug(ctx, "glCallList %d\n", list);
   9421 
   9422    if (list == 0) {
   9423       _mesa_error(ctx, GL_INVALID_VALUE, "glCallList(list==0)");
   9424       return;
   9425    }
   9426 
   9427    if (0)
   9428       mesa_print_display_list( list );
   9429 
   9430    /* VERY IMPORTANT:  Save the CompileFlag status, turn it off,
   9431     * execute the display list, and restore the CompileFlag.
   9432     */
   9433    save_compile_flag = ctx->CompileFlag;
   9434    if (save_compile_flag) {
   9435       ctx->CompileFlag = GL_FALSE;
   9436    }
   9437 
   9438    execute_list(ctx, list);
   9439    ctx->CompileFlag = save_compile_flag;
   9440 
   9441    /* also restore API function pointers to point to "save" versions */
   9442    if (save_compile_flag) {
   9443       ctx->CurrentServerDispatch = ctx->Save;
   9444        _glapi_set_dispatch(ctx->CurrentServerDispatch);
   9445       if (ctx->MarshalExec == NULL) {
   9446          ctx->CurrentClientDispatch = ctx->CurrentServerDispatch;
   9447       }
   9448    }
   9449 }
   9450 
   9451 
   9452 /**
   9453  * Try to execute a glCallLists() command where the display lists contain
   9454  * glBitmap commands with a texture atlas.
   9455  * \return true for success, false otherwise
   9456  */
   9457 static bool
   9458 render_bitmap_atlas(struct gl_context *ctx, GLsizei n, GLenum type,
   9459                     const void *lists)
   9460 {
   9461    struct gl_bitmap_atlas *atlas;
   9462    int i;
   9463 
   9464    if (!USE_BITMAP_ATLAS ||
   9465        !ctx->Current.RasterPosValid ||
   9466        ctx->List.ListBase == 0 ||
   9467        type != GL_UNSIGNED_BYTE ||
   9468        !ctx->Driver.DrawAtlasBitmaps) {
   9469       /* unsupported */
   9470       return false;
   9471    }
   9472 
   9473    atlas = lookup_bitmap_atlas(ctx, ctx->List.ListBase);
   9474 
   9475    if (!atlas) {
   9476       /* Even if glGenLists wasn't called, we can still try to create
   9477        * the atlas now.
   9478        */
   9479       atlas = alloc_bitmap_atlas(ctx, ctx->List.ListBase);
   9480    }
   9481 
   9482    if (atlas && !atlas->complete && !atlas->incomplete) {
   9483       /* Try to build the bitmap atlas now.
   9484        * If the atlas was created in glGenLists, we'll have recorded the
   9485        * number of lists (bitmaps).  Otherwise, take a guess at 256.
   9486        */
   9487       if (atlas->numBitmaps == 0)
   9488          atlas->numBitmaps = 256;
   9489       build_bitmap_atlas(ctx, atlas, ctx->List.ListBase);
   9490    }
   9491 
   9492    if (!atlas || !atlas->complete) {
   9493       return false;
   9494    }
   9495 
   9496    /* check that all display list IDs are in the atlas */
   9497    for (i = 0; i < n; i++) {
   9498       const GLubyte *ids = (const GLubyte *) lists;
   9499 
   9500       if (ids[i] >= atlas->numBitmaps) {
   9501          return false;
   9502       }
   9503    }
   9504 
   9505    ctx->Driver.DrawAtlasBitmaps(ctx, atlas, n, (const GLubyte *) lists);
   9506 
   9507    return true;
   9508 }
   9509 
   9510 
   9511 /**
   9512  * Execute glCallLists:  call multiple display lists.
   9513  */
   9514 void GLAPIENTRY
   9515 _mesa_CallLists(GLsizei n, GLenum type, const GLvoid * lists)
   9516 {
   9517    GET_CURRENT_CONTEXT(ctx);
   9518    GLint i;
   9519    GLboolean save_compile_flag;
   9520 
   9521    if (MESA_VERBOSE & VERBOSE_API)
   9522       _mesa_debug(ctx, "glCallLists %d\n", n);
   9523 
   9524    switch (type) {
   9525    case GL_BYTE:
   9526    case GL_UNSIGNED_BYTE:
   9527    case GL_SHORT:
   9528    case GL_UNSIGNED_SHORT:
   9529    case GL_INT:
   9530    case GL_UNSIGNED_INT:
   9531    case GL_FLOAT:
   9532    case GL_2_BYTES:
   9533    case GL_3_BYTES:
   9534    case GL_4_BYTES:
   9535       /* OK */
   9536       break;
   9537    default:
   9538       _mesa_error(ctx, GL_INVALID_ENUM, "glCallLists(type)");
   9539       return;
   9540    }
   9541 
   9542    if (n < 0) {
   9543       _mesa_error(ctx, GL_INVALID_VALUE, "glCallLists(n < 0)");
   9544       return;
   9545    } else if (n == 0 || lists == NULL) {
   9546       /* nothing to do */
   9547       return;
   9548    }
   9549 
   9550    if (render_bitmap_atlas(ctx, n, type, lists)) {
   9551       return;
   9552    }
   9553 
   9554    /* Save the CompileFlag status, turn it off, execute display list,
   9555     * and restore the CompileFlag.
   9556     */
   9557    save_compile_flag = ctx->CompileFlag;
   9558    ctx->CompileFlag = GL_FALSE;
   9559 
   9560    for (i = 0; i < n; i++) {
   9561       GLuint list = (GLuint) (ctx->List.ListBase + translate_id(i, type, lists));
   9562       execute_list(ctx, list);
   9563    }
   9564 
   9565    ctx->CompileFlag = save_compile_flag;
   9566 
   9567    /* also restore API function pointers to point to "save" versions */
   9568    if (save_compile_flag) {
   9569       ctx->CurrentServerDispatch = ctx->Save;
   9570       _glapi_set_dispatch(ctx->CurrentServerDispatch);
   9571       if (ctx->MarshalExec == NULL) {
   9572          ctx->CurrentClientDispatch = ctx->CurrentServerDispatch;
   9573       }
   9574    }
   9575 }
   9576 
   9577 
   9578 /**
   9579  * Set the offset added to list numbers in glCallLists.
   9580  */
   9581 void GLAPIENTRY
   9582 _mesa_ListBase(GLuint base)
   9583 {
   9584    GET_CURRENT_CONTEXT(ctx);
   9585    FLUSH_VERTICES(ctx, 0);      /* must be called before assert */
   9586    ASSERT_OUTSIDE_BEGIN_END(ctx);
   9587    ctx->List.ListBase = base;
   9588 }
   9589 
   9590 /**
   9591  * Setup the given dispatch table to point to Mesa's display list
   9592  * building functions.
   9593  *
   9594  * This does not include any of the tnl functions - they are
   9595  * initialized from _mesa_init_api_defaults and from the active vtxfmt
   9596  * struct.
   9597  */
   9598 void
   9599 _mesa_initialize_save_table(const struct gl_context *ctx)
   9600 {
   9601    struct _glapi_table *table = ctx->Save;
   9602    int numEntries = MAX2(_gloffset_COUNT, _glapi_get_dispatch_table_size());
   9603 
   9604    /* Initially populate the dispatch table with the contents of the
   9605     * normal-execution dispatch table.  This lets us skip populating functions
   9606     * that should be called directly instead of compiled into display lists.
   9607     */
   9608    memcpy(table, ctx->Exec, numEntries * sizeof(_glapi_proc));
   9609 
   9610    _mesa_loopback_init_api_table(ctx, table);
   9611 
   9612    /* VBO functions */
   9613    vbo_initialize_save_dispatch(ctx, table);
   9614 
   9615    /* GL 1.0 */
   9616    SET_Accum(table, save_Accum);
   9617    SET_AlphaFunc(table, save_AlphaFunc);
   9618    SET_Bitmap(table, save_Bitmap);
   9619    SET_BlendFunc(table, save_BlendFunc);
   9620    SET_CallList(table, save_CallList);
   9621    SET_CallLists(table, save_CallLists);
   9622    SET_Clear(table, save_Clear);
   9623    SET_ClearAccum(table, save_ClearAccum);
   9624    SET_ClearColor(table, save_ClearColor);
   9625    SET_ClearDepth(table, save_ClearDepth);
   9626    SET_ClearIndex(table, save_ClearIndex);
   9627    SET_ClearStencil(table, save_ClearStencil);
   9628    SET_ClipPlane(table, save_ClipPlane);
   9629    SET_ColorMask(table, save_ColorMask);
   9630    SET_ColorMaski(table, save_ColorMaskIndexed);
   9631    SET_ColorMaterial(table, save_ColorMaterial);
   9632    SET_CopyPixels(table, save_CopyPixels);
   9633    SET_CullFace(table, save_CullFace);
   9634    SET_DepthFunc(table, save_DepthFunc);
   9635    SET_DepthMask(table, save_DepthMask);
   9636    SET_DepthRange(table, save_DepthRange);
   9637    SET_Disable(table, save_Disable);
   9638    SET_Disablei(table, save_DisableIndexed);
   9639    SET_DrawBuffer(table, save_DrawBuffer);
   9640    SET_DrawPixels(table, save_DrawPixels);
   9641    SET_Enable(table, save_Enable);
   9642    SET_Enablei(table, save_EnableIndexed);
   9643    SET_EvalMesh1(table, save_EvalMesh1);
   9644    SET_EvalMesh2(table, save_EvalMesh2);
   9645    SET_Fogf(table, save_Fogf);
   9646    SET_Fogfv(table, save_Fogfv);
   9647    SET_Fogi(table, save_Fogi);
   9648    SET_Fogiv(table, save_Fogiv);
   9649    SET_FrontFace(table, save_FrontFace);
   9650    SET_Frustum(table, save_Frustum);
   9651    SET_Hint(table, save_Hint);
   9652    SET_IndexMask(table, save_IndexMask);
   9653    SET_InitNames(table, save_InitNames);
   9654    SET_LightModelf(table, save_LightModelf);
   9655    SET_LightModelfv(table, save_LightModelfv);
   9656    SET_LightModeli(table, save_LightModeli);
   9657    SET_LightModeliv(table, save_LightModeliv);
   9658    SET_Lightf(table, save_Lightf);
   9659    SET_Lightfv(table, save_Lightfv);
   9660    SET_Lighti(table, save_Lighti);
   9661    SET_Lightiv(table, save_Lightiv);
   9662    SET_LineStipple(table, save_LineStipple);
   9663    SET_LineWidth(table, save_LineWidth);
   9664    SET_ListBase(table, save_ListBase);
   9665    SET_LoadIdentity(table, save_LoadIdentity);
   9666    SET_LoadMatrixd(table, save_LoadMatrixd);
   9667    SET_LoadMatrixf(table, save_LoadMatrixf);
   9668    SET_LoadName(table, save_LoadName);
   9669    SET_LogicOp(table, save_LogicOp);
   9670    SET_Map1d(table, save_Map1d);
   9671    SET_Map1f(table, save_Map1f);
   9672    SET_Map2d(table, save_Map2d);
   9673    SET_Map2f(table, save_Map2f);
   9674    SET_MapGrid1d(table, save_MapGrid1d);
   9675    SET_MapGrid1f(table, save_MapGrid1f);
   9676    SET_MapGrid2d(table, save_MapGrid2d);
   9677    SET_MapGrid2f(table, save_MapGrid2f);
   9678    SET_MatrixMode(table, save_MatrixMode);
   9679    SET_MultMatrixd(table, save_MultMatrixd);
   9680    SET_MultMatrixf(table, save_MultMatrixf);
   9681    SET_NewList(table, save_NewList);
   9682    SET_Ortho(table, save_Ortho);
   9683    SET_PassThrough(table, save_PassThrough);
   9684    SET_PixelMapfv(table, save_PixelMapfv);
   9685    SET_PixelMapuiv(table, save_PixelMapuiv);
   9686    SET_PixelMapusv(table, save_PixelMapusv);
   9687    SET_PixelTransferf(table, save_PixelTransferf);
   9688    SET_PixelTransferi(table, save_PixelTransferi);
   9689    SET_PixelZoom(table, save_PixelZoom);
   9690    SET_PointSize(table, save_PointSize);
   9691    SET_PolygonMode(table, save_PolygonMode);
   9692    SET_PolygonOffset(table, save_PolygonOffset);
   9693    SET_PolygonStipple(table, save_PolygonStipple);
   9694    SET_PopAttrib(table, save_PopAttrib);
   9695    SET_PopMatrix(table, save_PopMatrix);
   9696    SET_PopName(table, save_PopName);
   9697    SET_PushAttrib(table, save_PushAttrib);
   9698    SET_PushMatrix(table, save_PushMatrix);
   9699    SET_PushName(table, save_PushName);
   9700    SET_RasterPos2d(table, save_RasterPos2d);
   9701    SET_RasterPos2dv(table, save_RasterPos2dv);
   9702    SET_RasterPos2f(table, save_RasterPos2f);
   9703    SET_RasterPos2fv(table, save_RasterPos2fv);
   9704    SET_RasterPos2i(table, save_RasterPos2i);
   9705    SET_RasterPos2iv(table, save_RasterPos2iv);
   9706    SET_RasterPos2s(table, save_RasterPos2s);
   9707    SET_RasterPos2sv(table, save_RasterPos2sv);
   9708    SET_RasterPos3d(table, save_RasterPos3d);
   9709    SET_RasterPos3dv(table, save_RasterPos3dv);
   9710    SET_RasterPos3f(table, save_RasterPos3f);
   9711    SET_RasterPos3fv(table, save_RasterPos3fv);
   9712    SET_RasterPos3i(table, save_RasterPos3i);
   9713    SET_RasterPos3iv(table, save_RasterPos3iv);
   9714    SET_RasterPos3s(table, save_RasterPos3s);
   9715    SET_RasterPos3sv(table, save_RasterPos3sv);
   9716    SET_RasterPos4d(table, save_RasterPos4d);
   9717    SET_RasterPos4dv(table, save_RasterPos4dv);
   9718    SET_RasterPos4f(table, save_RasterPos4f);
   9719    SET_RasterPos4fv(table, save_RasterPos4fv);
   9720    SET_RasterPos4i(table, save_RasterPos4i);
   9721    SET_RasterPos4iv(table, save_RasterPos4iv);
   9722    SET_RasterPos4s(table, save_RasterPos4s);
   9723    SET_RasterPos4sv(table, save_RasterPos4sv);
   9724    SET_ReadBuffer(table, save_ReadBuffer);
   9725    SET_Rectf(table, save_Rectf);
   9726    SET_Rotated(table, save_Rotated);
   9727    SET_Rotatef(table, save_Rotatef);
   9728    SET_Scaled(table, save_Scaled);
   9729    SET_Scalef(table, save_Scalef);
   9730    SET_Scissor(table, save_Scissor);
   9731    SET_ShadeModel(table, save_ShadeModel);
   9732    SET_StencilFunc(table, save_StencilFunc);
   9733    SET_StencilMask(table, save_StencilMask);
   9734    SET_StencilOp(table, save_StencilOp);
   9735    SET_TexEnvf(table, save_TexEnvf);
   9736    SET_TexEnvfv(table, save_TexEnvfv);
   9737    SET_TexEnvi(table, save_TexEnvi);
   9738    SET_TexEnviv(table, save_TexEnviv);
   9739    SET_TexGend(table, save_TexGend);
   9740    SET_TexGendv(table, save_TexGendv);
   9741    SET_TexGenf(table, save_TexGenf);
   9742    SET_TexGenfv(table, save_TexGenfv);
   9743    SET_TexGeni(table, save_TexGeni);
   9744    SET_TexGeniv(table, save_TexGeniv);
   9745    SET_TexImage1D(table, save_TexImage1D);
   9746    SET_TexImage2D(table, save_TexImage2D);
   9747    SET_TexParameterf(table, save_TexParameterf);
   9748    SET_TexParameterfv(table, save_TexParameterfv);
   9749    SET_TexParameteri(table, save_TexParameteri);
   9750    SET_TexParameteriv(table, save_TexParameteriv);
   9751    SET_Translated(table, save_Translated);
   9752    SET_Translatef(table, save_Translatef);
   9753    SET_Viewport(table, save_Viewport);
   9754 
   9755    /* GL 1.1 */
   9756    SET_BindTexture(table, save_BindTexture);
   9757    SET_CopyTexImage1D(table, save_CopyTexImage1D);
   9758    SET_CopyTexImage2D(table, save_CopyTexImage2D);
   9759    SET_CopyTexSubImage1D(table, save_CopyTexSubImage1D);
   9760    SET_CopyTexSubImage2D(table, save_CopyTexSubImage2D);
   9761    SET_PrioritizeTextures(table, save_PrioritizeTextures);
   9762    SET_TexSubImage1D(table, save_TexSubImage1D);
   9763    SET_TexSubImage2D(table, save_TexSubImage2D);
   9764 
   9765    /* GL 1.2 */
   9766    SET_CopyTexSubImage3D(table, save_CopyTexSubImage3D);
   9767    SET_TexImage3D(table, save_TexImage3D);
   9768    SET_TexSubImage3D(table, save_TexSubImage3D);
   9769 
   9770    /* GL 2.0 */
   9771    SET_StencilFuncSeparate(table, save_StencilFuncSeparate);
   9772    SET_StencilMaskSeparate(table, save_StencilMaskSeparate);
   9773    SET_StencilOpSeparate(table, save_StencilOpSeparate);
   9774 
   9775    /* ATI_separate_stencil */
   9776    SET_StencilFuncSeparateATI(table, save_StencilFuncSeparateATI);
   9777 
   9778    /* GL_ARB_imaging */
   9779    /* Not all are supported */
   9780    SET_BlendColor(table, save_BlendColor);
   9781    SET_BlendEquation(table, save_BlendEquation);
   9782 
   9783    /* 2. GL_EXT_blend_color */
   9784 #if 0
   9785    SET_BlendColorEXT(table, save_BlendColorEXT);
   9786 #endif
   9787 
   9788    /* 3. GL_EXT_polygon_offset */
   9789    SET_PolygonOffsetEXT(table, save_PolygonOffsetEXT);
   9790 
   9791    /* 6. GL_EXT_texture3d */
   9792 #if 0
   9793    SET_CopyTexSubImage3DEXT(table, save_CopyTexSubImage3D);
   9794    SET_TexImage3DEXT(table, save_TexImage3DEXT);
   9795    SET_TexSubImage3DEXT(table, save_TexSubImage3D);
   9796 #endif
   9797 
   9798    /* 37. GL_EXT_blend_minmax */
   9799 #if 0
   9800    SET_BlendEquationEXT(table, save_BlendEquationEXT);
   9801 #endif
   9802 
   9803    /* 54. GL_EXT_point_parameters */
   9804    SET_PointParameterf(table, save_PointParameterfEXT);
   9805    SET_PointParameterfv(table, save_PointParameterfvEXT);
   9806 
   9807    /* 173. GL_EXT_blend_func_separate */
   9808    SET_BlendFuncSeparate(table, save_BlendFuncSeparateEXT);
   9809 
   9810    /* 197. GL_MESA_window_pos */
   9811    SET_WindowPos2d(table, save_WindowPos2dMESA);
   9812    SET_WindowPos2dv(table, save_WindowPos2dvMESA);
   9813    SET_WindowPos2f(table, save_WindowPos2fMESA);
   9814    SET_WindowPos2fv(table, save_WindowPos2fvMESA);
   9815    SET_WindowPos2i(table, save_WindowPos2iMESA);
   9816    SET_WindowPos2iv(table, save_WindowPos2ivMESA);
   9817    SET_WindowPos2s(table, save_WindowPos2sMESA);
   9818    SET_WindowPos2sv(table, save_WindowPos2svMESA);
   9819    SET_WindowPos3d(table, save_WindowPos3dMESA);
   9820    SET_WindowPos3dv(table, save_WindowPos3dvMESA);
   9821    SET_WindowPos3f(table, save_WindowPos3fMESA);
   9822    SET_WindowPos3fv(table, save_WindowPos3fvMESA);
   9823    SET_WindowPos3i(table, save_WindowPos3iMESA);
   9824    SET_WindowPos3iv(table, save_WindowPos3ivMESA);
   9825    SET_WindowPos3s(table, save_WindowPos3sMESA);
   9826    SET_WindowPos3sv(table, save_WindowPos3svMESA);
   9827    SET_WindowPos4dMESA(table, save_WindowPos4dMESA);
   9828    SET_WindowPos4dvMESA(table, save_WindowPos4dvMESA);
   9829    SET_WindowPos4fMESA(table, save_WindowPos4fMESA);
   9830    SET_WindowPos4fvMESA(table, save_WindowPos4fvMESA);
   9831    SET_WindowPos4iMESA(table, save_WindowPos4iMESA);
   9832    SET_WindowPos4ivMESA(table, save_WindowPos4ivMESA);
   9833    SET_WindowPos4sMESA(table, save_WindowPos4sMESA);
   9834    SET_WindowPos4svMESA(table, save_WindowPos4svMESA);
   9835 
   9836    /* 245. GL_ATI_fragment_shader */
   9837    SET_BindFragmentShaderATI(table, save_BindFragmentShaderATI);
   9838    SET_SetFragmentShaderConstantATI(table, save_SetFragmentShaderConstantATI);
   9839 
   9840    /* 262. GL_NV_point_sprite */
   9841    SET_PointParameteri(table, save_PointParameteriNV);
   9842    SET_PointParameteriv(table, save_PointParameterivNV);
   9843 
   9844    /* 268. GL_EXT_stencil_two_side */
   9845    SET_ActiveStencilFaceEXT(table, save_ActiveStencilFaceEXT);
   9846 
   9847    /* ???. GL_EXT_depth_bounds_test */
   9848    SET_DepthBoundsEXT(table, save_DepthBoundsEXT);
   9849 
   9850    /* ARB 1. GL_ARB_multitexture */
   9851    SET_ActiveTexture(table, save_ActiveTextureARB);
   9852 
   9853    /* ARB 3. GL_ARB_transpose_matrix */
   9854    SET_LoadTransposeMatrixd(table, save_LoadTransposeMatrixdARB);
   9855    SET_LoadTransposeMatrixf(table, save_LoadTransposeMatrixfARB);
   9856    SET_MultTransposeMatrixd(table, save_MultTransposeMatrixdARB);
   9857    SET_MultTransposeMatrixf(table, save_MultTransposeMatrixfARB);
   9858 
   9859    /* ARB 5. GL_ARB_multisample */
   9860    SET_SampleCoverage(table, save_SampleCoverageARB);
   9861 
   9862    /* ARB 12. GL_ARB_texture_compression */
   9863    SET_CompressedTexImage3D(table, save_CompressedTexImage3DARB);
   9864    SET_CompressedTexImage2D(table, save_CompressedTexImage2DARB);
   9865    SET_CompressedTexImage1D(table, save_CompressedTexImage1DARB);
   9866    SET_CompressedTexSubImage3D(table, save_CompressedTexSubImage3DARB);
   9867    SET_CompressedTexSubImage2D(table, save_CompressedTexSubImage2DARB);
   9868    SET_CompressedTexSubImage1D(table, save_CompressedTexSubImage1DARB);
   9869 
   9870    /* ARB 14. GL_ARB_point_parameters */
   9871    /* aliased with EXT_point_parameters functions */
   9872 
   9873    /* ARB 25. GL_ARB_window_pos */
   9874    /* aliased with MESA_window_pos functions */
   9875 
   9876    /* ARB 26. GL_ARB_vertex_program */
   9877    /* ARB 27. GL_ARB_fragment_program */
   9878    /* glVertexAttrib* functions alias the NV ones, handled elsewhere */
   9879    SET_ProgramStringARB(table, save_ProgramStringARB);
   9880    SET_BindProgramARB(table, save_BindProgramARB);
   9881    SET_ProgramEnvParameter4dARB(table, save_ProgramEnvParameter4dARB);
   9882    SET_ProgramEnvParameter4dvARB(table, save_ProgramEnvParameter4dvARB);
   9883    SET_ProgramEnvParameter4fARB(table, save_ProgramEnvParameter4fARB);
   9884    SET_ProgramEnvParameter4fvARB(table, save_ProgramEnvParameter4fvARB);
   9885    SET_ProgramLocalParameter4dARB(table, save_ProgramLocalParameter4dARB);
   9886    SET_ProgramLocalParameter4dvARB(table, save_ProgramLocalParameter4dvARB);
   9887    SET_ProgramLocalParameter4fARB(table, save_ProgramLocalParameter4fARB);
   9888    SET_ProgramLocalParameter4fvARB(table, save_ProgramLocalParameter4fvARB);
   9889 
   9890    SET_BeginQuery(table, save_BeginQueryARB);
   9891    SET_EndQuery(table, save_EndQueryARB);
   9892    SET_QueryCounter(table, save_QueryCounter);
   9893 
   9894    SET_DrawBuffers(table, save_DrawBuffersARB);
   9895 
   9896    SET_BlitFramebuffer(table, save_BlitFramebufferEXT);
   9897 
   9898    SET_UseProgram(table, save_UseProgram);
   9899    SET_Uniform1f(table, save_Uniform1fARB);
   9900    SET_Uniform2f(table, save_Uniform2fARB);
   9901    SET_Uniform3f(table, save_Uniform3fARB);
   9902    SET_Uniform4f(table, save_Uniform4fARB);
   9903    SET_Uniform1fv(table, save_Uniform1fvARB);
   9904    SET_Uniform2fv(table, save_Uniform2fvARB);
   9905    SET_Uniform3fv(table, save_Uniform3fvARB);
   9906    SET_Uniform4fv(table, save_Uniform4fvARB);
   9907    SET_Uniform1i(table, save_Uniform1iARB);
   9908    SET_Uniform2i(table, save_Uniform2iARB);
   9909    SET_Uniform3i(table, save_Uniform3iARB);
   9910    SET_Uniform4i(table, save_Uniform4iARB);
   9911    SET_Uniform1iv(table, save_Uniform1ivARB);
   9912    SET_Uniform2iv(table, save_Uniform2ivARB);
   9913    SET_Uniform3iv(table, save_Uniform3ivARB);
   9914    SET_Uniform4iv(table, save_Uniform4ivARB);
   9915    SET_UniformMatrix2fv(table, save_UniformMatrix2fvARB);
   9916    SET_UniformMatrix3fv(table, save_UniformMatrix3fvARB);
   9917    SET_UniformMatrix4fv(table, save_UniformMatrix4fvARB);
   9918    SET_UniformMatrix2x3fv(table, save_UniformMatrix2x3fv);
   9919    SET_UniformMatrix3x2fv(table, save_UniformMatrix3x2fv);
   9920    SET_UniformMatrix2x4fv(table, save_UniformMatrix2x4fv);
   9921    SET_UniformMatrix4x2fv(table, save_UniformMatrix4x2fv);
   9922    SET_UniformMatrix3x4fv(table, save_UniformMatrix3x4fv);
   9923    SET_UniformMatrix4x3fv(table, save_UniformMatrix4x3fv);
   9924 
   9925    /* 299. GL_EXT_blend_equation_separate */
   9926    SET_BlendEquationSeparate(table, save_BlendEquationSeparateEXT);
   9927 
   9928    /* GL_EXT_gpu_program_parameters */
   9929    SET_ProgramEnvParameters4fvEXT(table, save_ProgramEnvParameters4fvEXT);
   9930    SET_ProgramLocalParameters4fvEXT(table, save_ProgramLocalParameters4fvEXT);
   9931 
   9932    /* 364. GL_EXT_provoking_vertex */
   9933    SET_ProvokingVertex(table, save_ProvokingVertexEXT);
   9934 
   9935    /* GL_EXT_texture_integer */
   9936    SET_ClearColorIiEXT(table, save_ClearColorIi);
   9937    SET_ClearColorIuiEXT(table, save_ClearColorIui);
   9938    SET_TexParameterIiv(table, save_TexParameterIiv);
   9939    SET_TexParameterIuiv(table, save_TexParameterIuiv);
   9940 
   9941    /* GL_ARB_clip_control */
   9942    SET_ClipControl(table, save_ClipControl);
   9943 
   9944    /* GL_ARB_color_buffer_float */
   9945    SET_ClampColor(table, save_ClampColorARB);
   9946 
   9947    /* GL 3.0 */
   9948    SET_ClearBufferiv(table, save_ClearBufferiv);
   9949    SET_ClearBufferuiv(table, save_ClearBufferuiv);
   9950    SET_ClearBufferfv(table, save_ClearBufferfv);
   9951    SET_ClearBufferfi(table, save_ClearBufferfi);
   9952 #if 0
   9953    SET_Uniform1ui(table, save_Uniform1ui);
   9954    SET_Uniform2ui(table, save_Uniform2ui);
   9955    SET_Uniform3ui(table, save_Uniform3ui);
   9956    SET_Uniform4ui(table, save_Uniform4ui);
   9957    SET_Uniform1uiv(table, save_Uniform1uiv);
   9958    SET_Uniform2uiv(table, save_Uniform2uiv);
   9959    SET_Uniform3uiv(table, save_Uniform3uiv);
   9960    SET_Uniform4uiv(table, save_Uniform4uiv);
   9961 #else
   9962    (void) save_Uniform1ui;
   9963    (void) save_Uniform2ui;
   9964    (void) save_Uniform3ui;
   9965    (void) save_Uniform4ui;
   9966    (void) save_Uniform1uiv;
   9967    (void) save_Uniform2uiv;
   9968    (void) save_Uniform3uiv;
   9969    (void) save_Uniform4uiv;
   9970 #endif
   9971 
   9972    /* These are: */
   9973    SET_BeginTransformFeedback(table, save_BeginTransformFeedback);
   9974    SET_EndTransformFeedback(table, save_EndTransformFeedback);
   9975    SET_BindTransformFeedback(table, save_BindTransformFeedback);
   9976    SET_PauseTransformFeedback(table, save_PauseTransformFeedback);
   9977    SET_ResumeTransformFeedback(table, save_ResumeTransformFeedback);
   9978    SET_DrawTransformFeedback(table, save_DrawTransformFeedback);
   9979    SET_DrawTransformFeedbackStream(table, save_DrawTransformFeedbackStream);
   9980    SET_DrawTransformFeedbackInstanced(table,
   9981                                       save_DrawTransformFeedbackInstanced);
   9982    SET_DrawTransformFeedbackStreamInstanced(table,
   9983                                 save_DrawTransformFeedbackStreamInstanced);
   9984    SET_BeginQueryIndexed(table, save_BeginQueryIndexed);
   9985    SET_EndQueryIndexed(table, save_EndQueryIndexed);
   9986 
   9987    /* GL_ARB_instanced_arrays */
   9988    SET_VertexAttribDivisor(table, save_VertexAttribDivisor);
   9989 
   9990    /* GL_NV_texture_barrier */
   9991    SET_TextureBarrierNV(table, save_TextureBarrierNV);
   9992 
   9993    SET_BindSampler(table, save_BindSampler);
   9994    SET_SamplerParameteri(table, save_SamplerParameteri);
   9995    SET_SamplerParameterf(table, save_SamplerParameterf);
   9996    SET_SamplerParameteriv(table, save_SamplerParameteriv);
   9997    SET_SamplerParameterfv(table, save_SamplerParameterfv);
   9998    SET_SamplerParameterIiv(table, save_SamplerParameterIiv);
   9999    SET_SamplerParameterIuiv(table, save_SamplerParameterIuiv);
   10000 
   10001    /* GL_ARB_draw_buffer_blend */
   10002    SET_BlendFunciARB(table, save_BlendFunci);
   10003    SET_BlendFuncSeparateiARB(table, save_BlendFuncSeparatei);
   10004    SET_BlendEquationiARB(table, save_BlendEquationi);
   10005    SET_BlendEquationSeparateiARB(table, save_BlendEquationSeparatei);
   10006 
   10007    /* GL_NV_conditional_render */
   10008    SET_BeginConditionalRender(table, save_BeginConditionalRender);
   10009    SET_EndConditionalRender(table, save_EndConditionalRender);
   10010 
   10011    /* GL_ARB_sync */
   10012    SET_WaitSync(table, save_WaitSync);
   10013 
   10014    /* GL_ARB_uniform_buffer_object */
   10015    SET_UniformBlockBinding(table, save_UniformBlockBinding);
   10016 
   10017    /* GL_ARB_draw_instanced */
   10018    SET_DrawArraysInstancedARB(table, save_DrawArraysInstancedARB);
   10019    SET_DrawElementsInstancedARB(table, save_DrawElementsInstancedARB);
   10020 
   10021    /* GL_ARB_draw_elements_base_vertex */
   10022    SET_DrawElementsInstancedBaseVertex(table, save_DrawElementsInstancedBaseVertexARB);
   10023 
   10024    /* GL_ARB_base_instance */
   10025    SET_DrawArraysInstancedBaseInstance(table, save_DrawArraysInstancedBaseInstance);
   10026    SET_DrawElementsInstancedBaseInstance(table, save_DrawElementsInstancedBaseInstance);
   10027    SET_DrawElementsInstancedBaseVertexBaseInstance(table, save_DrawElementsInstancedBaseVertexBaseInstance);
   10028 
   10029    /* OpenGL 4.2 / GL_ARB_separate_shader_objects */
   10030    SET_UseProgramStages(table, save_UseProgramStages);
   10031    SET_ProgramUniform1f(table, save_ProgramUniform1f);
   10032    SET_ProgramUniform2f(table, save_ProgramUniform2f);
   10033    SET_ProgramUniform3f(table, save_ProgramUniform3f);
   10034    SET_ProgramUniform4f(table, save_ProgramUniform4f);
   10035    SET_ProgramUniform1fv(table, save_ProgramUniform1fv);
   10036    SET_ProgramUniform2fv(table, save_ProgramUniform2fv);
   10037    SET_ProgramUniform3fv(table, save_ProgramUniform3fv);
   10038    SET_ProgramUniform4fv(table, save_ProgramUniform4fv);
   10039    SET_ProgramUniform1i(table, save_ProgramUniform1i);
   10040    SET_ProgramUniform2i(table, save_ProgramUniform2i);
   10041    SET_ProgramUniform3i(table, save_ProgramUniform3i);
   10042    SET_ProgramUniform4i(table, save_ProgramUniform4i);
   10043    SET_ProgramUniform1iv(table, save_ProgramUniform1iv);
   10044    SET_ProgramUniform2iv(table, save_ProgramUniform2iv);
   10045    SET_ProgramUniform3iv(table, save_ProgramUniform3iv);
   10046    SET_ProgramUniform4iv(table, save_ProgramUniform4iv);
   10047    SET_ProgramUniform1ui(table, save_ProgramUniform1ui);
   10048    SET_ProgramUniform2ui(table, save_ProgramUniform2ui);
   10049    SET_ProgramUniform3ui(table, save_ProgramUniform3ui);
   10050    SET_ProgramUniform4ui(table, save_ProgramUniform4ui);
   10051    SET_ProgramUniform1uiv(table, save_ProgramUniform1uiv);
   10052    SET_ProgramUniform2uiv(table, save_ProgramUniform2uiv);
   10053    SET_ProgramUniform3uiv(table, save_ProgramUniform3uiv);
   10054    SET_ProgramUniform4uiv(table, save_ProgramUniform4uiv);
   10055    SET_ProgramUniformMatrix2fv(table, save_ProgramUniformMatrix2fv);
   10056    SET_ProgramUniformMatrix3fv(table, save_ProgramUniformMatrix3fv);
   10057    SET_ProgramUniformMatrix4fv(table, save_ProgramUniformMatrix4fv);
   10058    SET_ProgramUniformMatrix2x3fv(table, save_ProgramUniformMatrix2x3fv);
   10059    SET_ProgramUniformMatrix3x2fv(table, save_ProgramUniformMatrix3x2fv);
   10060    SET_ProgramUniformMatrix2x4fv(table, save_ProgramUniformMatrix2x4fv);
   10061    SET_ProgramUniformMatrix4x2fv(table, save_ProgramUniformMatrix4x2fv);
   10062    SET_ProgramUniformMatrix3x4fv(table, save_ProgramUniformMatrix3x4fv);
   10063    SET_ProgramUniformMatrix4x3fv(table, save_ProgramUniformMatrix4x3fv);
   10064 
   10065    /* GL_{ARB,EXT}_polygon_offset_clamp */
   10066    SET_PolygonOffsetClampEXT(table, save_PolygonOffsetClampEXT);
   10067 
   10068    /* GL_EXT_window_rectangles */
   10069    SET_WindowRectanglesEXT(table, save_WindowRectanglesEXT);
   10070 }
   10071 
   10072 
   10073 
   10074 static const char *
   10075 enum_string(GLenum k)
   10076 {
   10077    return _mesa_enum_to_string(k);
   10078 }
   10079 
   10080 
   10081 /**
   10082  * Print the commands in a display list.  For debugging only.
   10083  * TODO: many commands aren't handled yet.
   10084  * \param fname  filename to write display list to.  If null, use stdout.
   10085  */
   10086 static void GLAPIENTRY
   10087 print_list(struct gl_context *ctx, GLuint list, const char *fname)
   10088 {
   10089    struct gl_display_list *dlist;
   10090    Node *n;
   10091    GLboolean done;
   10092    FILE *f = stdout;
   10093 
   10094    if (fname) {
   10095       f = fopen(fname, "w");
   10096       if (!f)
   10097          return;
   10098    }
   10099 
   10100    if (!islist(ctx, list)) {
   10101       fprintf(f, "%u is not a display list ID\n", list);
   10102       goto out;
   10103    }
   10104 
   10105    dlist = _mesa_lookup_list(ctx, list);
   10106    if (!dlist) {
   10107       goto out;
   10108    }
   10109 
   10110    n = dlist->Head;
   10111 
   10112    fprintf(f, "START-LIST %u, address %p\n", list, (void *) n);
   10113 
   10114    done = n ? GL_FALSE : GL_TRUE;
   10115    while (!done) {
   10116       const OpCode opcode = n[0].opcode;
   10117 
   10118       if (is_ext_opcode(opcode)) {
   10119          n += ext_opcode_print(ctx, n, f);
   10120       }
   10121       else {
   10122          switch (opcode) {
   10123          case OPCODE_ACCUM:
   10124             fprintf(f, "Accum %s %g\n", enum_string(n[1].e), n[2].f);
   10125             break;
   10126          case OPCODE_ACTIVE_TEXTURE:
   10127             fprintf(f, "ActiveTexture(%s)\n", enum_string(n[1].e));
   10128             break;
   10129          case OPCODE_BITMAP:
   10130             fprintf(f, "Bitmap %d %d %g %g %g %g %p\n", n[1].i, n[2].i,
   10131                    n[3].f, n[4].f, n[5].f, n[6].f,
   10132                    get_pointer(&n[7]));
   10133             break;
   10134          case OPCODE_BLEND_COLOR:
   10135             fprintf(f, "BlendColor %f, %f, %f, %f\n",
   10136                     n[1].f, n[2].f, n[3].f, n[4].f);
   10137             break;
   10138          case OPCODE_BLEND_EQUATION:
   10139             fprintf(f, "BlendEquation %s\n",
   10140                     enum_string(n[1].e));
   10141             break;
   10142          case OPCODE_BLEND_EQUATION_SEPARATE:
   10143             fprintf(f, "BlendEquationSeparate %s, %s\n",
   10144                     enum_string(n[1].e),
   10145                     enum_string(n[2].e));
   10146             break;
   10147          case OPCODE_BLEND_FUNC_SEPARATE:
   10148             fprintf(f, "BlendFuncSeparate %s, %s, %s, %s\n",
   10149                     enum_string(n[1].e),
   10150                     enum_string(n[2].e),
   10151                     enum_string(n[3].e),
   10152                     enum_string(n[4].e));
   10153             break;
   10154          case OPCODE_BLEND_EQUATION_I:
   10155             fprintf(f, "BlendEquationi %u, %s\n",
   10156                     n[1].ui, enum_string(n[2].e));
   10157             break;
   10158          case OPCODE_BLEND_EQUATION_SEPARATE_I:
   10159             fprintf(f, "BlendEquationSeparatei %u, %s, %s\n",
   10160                     n[1].ui, enum_string(n[2].e), enum_string(n[3].e));
   10161             break;
   10162          case OPCODE_BLEND_FUNC_I:
   10163             fprintf(f, "BlendFunci %u, %s, %s\n",
   10164                     n[1].ui, enum_string(n[2].e), enum_string(n[3].e));
   10165             break;
   10166          case OPCODE_BLEND_FUNC_SEPARATE_I:
   10167             fprintf(f, "BlendFuncSeparatei %u, %s, %s, %s, %s\n",
   10168                     n[1].ui,
   10169                     enum_string(n[2].e),
   10170                     enum_string(n[3].e),
   10171                     enum_string(n[4].e),
   10172                     enum_string(n[5].e));
   10173             break;
   10174          case OPCODE_CALL_LIST:
   10175             fprintf(f, "CallList %d\n", (int) n[1].ui);
   10176             break;
   10177          case OPCODE_CALL_LISTS:
   10178             fprintf(f, "CallLists %d, %s\n", n[1].i, enum_string(n[1].e));
   10179             break;
   10180          case OPCODE_DISABLE:
   10181             fprintf(f, "Disable %s\n", enum_string(n[1].e));
   10182             break;
   10183          case OPCODE_ENABLE:
   10184             fprintf(f, "Enable %s\n", enum_string(n[1].e));
   10185             break;
   10186          case OPCODE_FRUSTUM:
   10187             fprintf(f, "Frustum %g %g %g %g %g %g\n",
   10188                          n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f);
   10189             break;
   10190          case OPCODE_LINE_STIPPLE:
   10191             fprintf(f, "LineStipple %d %x\n", n[1].i, (int) n[2].us);
   10192             break;
   10193          case OPCODE_LINE_WIDTH:
   10194             fprintf(f, "LineWidth %f\n", n[1].f);
   10195             break;
   10196          case OPCODE_LOAD_IDENTITY:
   10197             fprintf(f, "LoadIdentity\n");
   10198             break;
   10199          case OPCODE_LOAD_MATRIX:
   10200             fprintf(f, "LoadMatrix\n");
   10201             fprintf(f, "  %8f %8f %8f %8f\n",
   10202                          n[1].f, n[5].f, n[9].f, n[13].f);
   10203             fprintf(f, "  %8f %8f %8f %8f\n",
   10204                          n[2].f, n[6].f, n[10].f, n[14].f);
   10205             fprintf(f, "  %8f %8f %8f %8f\n",
   10206                          n[3].f, n[7].f, n[11].f, n[15].f);
   10207             fprintf(f, "  %8f %8f %8f %8f\n",
   10208                          n[4].f, n[8].f, n[12].f, n[16].f);
   10209             break;
   10210          case OPCODE_MULT_MATRIX:
   10211             fprintf(f, "MultMatrix (or Rotate)\n");
   10212             fprintf(f, "  %8f %8f %8f %8f\n",
   10213                          n[1].f, n[5].f, n[9].f, n[13].f);
   10214             fprintf(f, "  %8f %8f %8f %8f\n",
   10215                          n[2].f, n[6].f, n[10].f, n[14].f);
   10216             fprintf(f, "  %8f %8f %8f %8f\n",
   10217                          n[3].f, n[7].f, n[11].f, n[15].f);
   10218             fprintf(f, "  %8f %8f %8f %8f\n",
   10219                          n[4].f, n[8].f, n[12].f, n[16].f);
   10220             break;
   10221          case OPCODE_ORTHO:
   10222             fprintf(f, "Ortho %g %g %g %g %g %g\n",
   10223                          n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f);
   10224             break;
   10225          case OPCODE_POINT_SIZE:
   10226             fprintf(f, "PointSize %f\n", n[1].f);
   10227             break;
   10228          case OPCODE_POP_ATTRIB:
   10229             fprintf(f, "PopAttrib\n");
   10230             break;
   10231          case OPCODE_POP_MATRIX:
   10232             fprintf(f, "PopMatrix\n");
   10233             break;
   10234          case OPCODE_POP_NAME:
   10235             fprintf(f, "PopName\n");
   10236             break;
   10237          case OPCODE_PUSH_ATTRIB:
   10238             fprintf(f, "PushAttrib %x\n", n[1].bf);
   10239             break;
   10240          case OPCODE_PUSH_MATRIX:
   10241             fprintf(f, "PushMatrix\n");
   10242             break;
   10243          case OPCODE_PUSH_NAME:
   10244             fprintf(f, "PushName %d\n", (int) n[1].ui);
   10245             break;
   10246          case OPCODE_RASTER_POS:
   10247             fprintf(f, "RasterPos %g %g %g %g\n",
   10248                          n[1].f, n[2].f, n[3].f, n[4].f);
   10249             break;
   10250          case OPCODE_ROTATE:
   10251             fprintf(f, "Rotate %g %g %g %g\n",
   10252                          n[1].f, n[2].f, n[3].f, n[4].f);
   10253             break;
   10254          case OPCODE_SCALE:
   10255             fprintf(f, "Scale %g %g %g\n", n[1].f, n[2].f, n[3].f);
   10256             break;
   10257          case OPCODE_TRANSLATE:
   10258             fprintf(f, "Translate %g %g %g\n", n[1].f, n[2].f, n[3].f);
   10259             break;
   10260          case OPCODE_BIND_TEXTURE:
   10261             fprintf(f, "BindTexture %s %d\n",
   10262                          _mesa_enum_to_string(n[1].ui), n[2].ui);
   10263             break;
   10264          case OPCODE_SHADE_MODEL:
   10265             fprintf(f, "ShadeModel %s\n", _mesa_enum_to_string(n[1].ui));
   10266             break;
   10267          case OPCODE_MAP1:
   10268             fprintf(f, "Map1 %s %.3f %.3f %d %d\n",
   10269                          _mesa_enum_to_string(n[1].ui),
   10270                          n[2].f, n[3].f, n[4].i, n[5].i);
   10271             break;
   10272          case OPCODE_MAP2:
   10273             fprintf(f, "Map2 %s %.3f %.3f %.3f %.3f %d %d %d %d\n",
   10274                          _mesa_enum_to_string(n[1].ui),
   10275                          n[2].f, n[3].f, n[4].f, n[5].f,
   10276                          n[6].i, n[7].i, n[8].i, n[9].i);
   10277             break;
   10278          case OPCODE_MAPGRID1:
   10279             fprintf(f, "MapGrid1 %d %.3f %.3f\n", n[1].i, n[2].f, n[3].f);
   10280             break;
   10281          case OPCODE_MAPGRID2:
   10282             fprintf(f, "MapGrid2 %d %.3f %.3f, %d %.3f %.3f\n",
   10283                          n[1].i, n[2].f, n[3].f, n[4].i, n[5].f, n[6].f);
   10284             break;
   10285          case OPCODE_EVALMESH1:
   10286             fprintf(f, "EvalMesh1 %d %d\n", n[1].i, n[2].i);
   10287             break;
   10288          case OPCODE_EVALMESH2:
   10289             fprintf(f, "EvalMesh2 %d %d %d %d\n",
   10290                          n[1].i, n[2].i, n[3].i, n[4].i);
   10291             break;
   10292 
   10293          case OPCODE_ATTR_1F_NV:
   10294             fprintf(f, "ATTR_1F_NV attr %d: %f\n", n[1].i, n[2].f);
   10295             break;
   10296          case OPCODE_ATTR_2F_NV:
   10297             fprintf(f, "ATTR_2F_NV attr %d: %f %f\n",
   10298                          n[1].i, n[2].f, n[3].f);
   10299             break;
   10300          case OPCODE_ATTR_3F_NV:
   10301             fprintf(f, "ATTR_3F_NV attr %d: %f %f %f\n",
   10302                          n[1].i, n[2].f, n[3].f, n[4].f);
   10303             break;
   10304          case OPCODE_ATTR_4F_NV:
   10305             fprintf(f, "ATTR_4F_NV attr %d: %f %f %f %f\n",
   10306                          n[1].i, n[2].f, n[3].f, n[4].f, n[5].f);
   10307             break;
   10308          case OPCODE_ATTR_1F_ARB:
   10309             fprintf(f, "ATTR_1F_ARB attr %d: %f\n", n[1].i, n[2].f);
   10310             break;
   10311          case OPCODE_ATTR_2F_ARB:
   10312             fprintf(f, "ATTR_2F_ARB attr %d: %f %f\n",
   10313                          n[1].i, n[2].f, n[3].f);
   10314             break;
   10315          case OPCODE_ATTR_3F_ARB:
   10316             fprintf(f, "ATTR_3F_ARB attr %d: %f %f %f\n",
   10317                          n[1].i, n[2].f, n[3].f, n[4].f);
   10318             break;
   10319          case OPCODE_ATTR_4F_ARB:
   10320             fprintf(f, "ATTR_4F_ARB attr %d: %f %f %f %f\n",
   10321                          n[1].i, n[2].f, n[3].f, n[4].f, n[5].f);
   10322             break;
   10323 
   10324          case OPCODE_MATERIAL:
   10325             fprintf(f, "MATERIAL %x %x: %f %f %f %f\n",
   10326                          n[1].i, n[2].i, n[3].f, n[4].f, n[5].f, n[6].f);
   10327             break;
   10328          case OPCODE_BEGIN:
   10329             fprintf(f, "BEGIN %x\n", n[1].i);
   10330             break;
   10331          case OPCODE_END:
   10332             fprintf(f, "END\n");
   10333             break;
   10334          case OPCODE_RECTF:
   10335             fprintf(f, "RECTF %f %f %f %f\n", n[1].f, n[2].f, n[3].f,
   10336                          n[4].f);
   10337             break;
   10338          case OPCODE_EVAL_C1:
   10339             fprintf(f, "EVAL_C1 %f\n", n[1].f);
   10340             break;
   10341          case OPCODE_EVAL_C2:
   10342             fprintf(f, "EVAL_C2 %f %f\n", n[1].f, n[2].f);
   10343             break;
   10344          case OPCODE_EVAL_P1:
   10345             fprintf(f, "EVAL_P1 %d\n", n[1].i);
   10346             break;
   10347          case OPCODE_EVAL_P2:
   10348             fprintf(f, "EVAL_P2 %d %d\n", n[1].i, n[2].i);
   10349             break;
   10350 
   10351          case OPCODE_PROVOKING_VERTEX:
   10352             fprintf(f, "ProvokingVertex %s\n",
   10353                          _mesa_enum_to_string(n[1].ui));
   10354             break;
   10355 
   10356             /*
   10357              * meta opcodes/commands
   10358              */
   10359          case OPCODE_ERROR:
   10360             fprintf(f, "Error: %s %s\n", enum_string(n[1].e),
   10361                    (const char *) get_pointer(&n[2]));
   10362             break;
   10363          case OPCODE_CONTINUE:
   10364             fprintf(f, "DISPLAY-LIST-CONTINUE\n");
   10365             n = (Node *) get_pointer(&n[1]);
   10366             break;
   10367          case OPCODE_NOP:
   10368             fprintf(f, "NOP\n");
   10369             break;
   10370          case OPCODE_END_OF_LIST:
   10371             fprintf(f, "END-LIST %u\n", list);
   10372             done = GL_TRUE;
   10373             break;
   10374          default:
   10375             if (opcode < 0 || opcode > OPCODE_END_OF_LIST) {
   10376                printf
   10377                   ("ERROR IN DISPLAY LIST: opcode = %d, address = %p\n",
   10378                    opcode, (void *) n);
   10379                goto out;
   10380             }
   10381             else {
   10382                fprintf(f, "command %d, %u operands\n", opcode,
   10383                             InstSize[opcode]);
   10384             }
   10385          }
   10386          /* increment n to point to next compiled command */
   10387          if (opcode != OPCODE_CONTINUE) {
   10388             n += InstSize[opcode];
   10389          }
   10390       }
   10391    }
   10392 
   10393  out:
   10394    fflush(f);
   10395    if (fname)
   10396       fclose(f);
   10397 }
   10398 
   10399 
   10400 
   10401 /**
   10402  * Clients may call this function to help debug display list problems.
   10403  * This function is _ONLY_FOR_DEBUGGING_PURPOSES_.  It may be removed,
   10404  * changed, or break in the future without notice.
   10405  */
   10406 void
   10407 mesa_print_display_list(GLuint list)
   10408 {
   10409    GET_CURRENT_CONTEXT(ctx);
   10410    print_list(ctx, list, NULL);
   10411 }
   10412 
   10413 
   10414 /**********************************************************************/
   10415 /*****                      Initialization                        *****/
   10416 /**********************************************************************/
   10417 
   10418 static void
   10419 save_vtxfmt_init(GLvertexformat * vfmt)
   10420 {
   10421    vfmt->ArrayElement = _ae_ArrayElement;
   10422 
   10423    vfmt->Begin = save_Begin;
   10424 
   10425    vfmt->CallList = save_CallList;
   10426    vfmt->CallLists = save_CallLists;
   10427 
   10428    vfmt->Color3f = save_Color3f;
   10429    vfmt->Color3fv = save_Color3fv;
   10430    vfmt->Color4f = save_Color4f;
   10431    vfmt->Color4fv = save_Color4fv;
   10432    vfmt->EdgeFlag = save_EdgeFlag;
   10433    vfmt->End = save_End;
   10434 
   10435    vfmt->EvalCoord1f = save_EvalCoord1f;
   10436    vfmt->EvalCoord1fv = save_EvalCoord1fv;
   10437    vfmt->EvalCoord2f = save_EvalCoord2f;
   10438    vfmt->EvalCoord2fv = save_EvalCoord2fv;
   10439    vfmt->EvalPoint1 = save_EvalPoint1;
   10440    vfmt->EvalPoint2 = save_EvalPoint2;
   10441 
   10442    vfmt->FogCoordfEXT = save_FogCoordfEXT;
   10443    vfmt->FogCoordfvEXT = save_FogCoordfvEXT;
   10444    vfmt->Indexf = save_Indexf;
   10445    vfmt->Indexfv = save_Indexfv;
   10446    vfmt->Materialfv = save_Materialfv;
   10447    vfmt->MultiTexCoord1fARB = save_MultiTexCoord1f;
   10448    vfmt->MultiTexCoord1fvARB = save_MultiTexCoord1fv;
   10449    vfmt->MultiTexCoord2fARB = save_MultiTexCoord2f;
   10450    vfmt->MultiTexCoord2fvARB = save_MultiTexCoord2fv;
   10451    vfmt->MultiTexCoord3fARB = save_MultiTexCoord3f;
   10452    vfmt->MultiTexCoord3fvARB = save_MultiTexCoord3fv;
   10453    vfmt->MultiTexCoord4fARB = save_MultiTexCoord4f;
   10454    vfmt->MultiTexCoord4fvARB = save_MultiTexCoord4fv;
   10455    vfmt->Normal3f = save_Normal3f;
   10456    vfmt->Normal3fv = save_Normal3fv;
   10457    vfmt->SecondaryColor3fEXT = save_SecondaryColor3fEXT;
   10458    vfmt->SecondaryColor3fvEXT = save_SecondaryColor3fvEXT;
   10459    vfmt->TexCoord1f = save_TexCoord1f;
   10460    vfmt->TexCoord1fv = save_TexCoord1fv;
   10461    vfmt->TexCoord2f = save_TexCoord2f;
   10462    vfmt->TexCoord2fv = save_TexCoord2fv;
   10463    vfmt->TexCoord3f = save_TexCoord3f;
   10464    vfmt->TexCoord3fv = save_TexCoord3fv;
   10465    vfmt->TexCoord4f = save_TexCoord4f;
   10466    vfmt->TexCoord4fv = save_TexCoord4fv;
   10467    vfmt->Vertex2f = save_Vertex2f;
   10468    vfmt->Vertex2fv = save_Vertex2fv;
   10469    vfmt->Vertex3f = save_Vertex3f;
   10470    vfmt->Vertex3fv = save_Vertex3fv;
   10471    vfmt->Vertex4f = save_Vertex4f;
   10472    vfmt->Vertex4fv = save_Vertex4fv;
   10473    vfmt->VertexAttrib1fARB = save_VertexAttrib1fARB;
   10474    vfmt->VertexAttrib1fvARB = save_VertexAttrib1fvARB;
   10475    vfmt->VertexAttrib2fARB = save_VertexAttrib2fARB;
   10476    vfmt->VertexAttrib2fvARB = save_VertexAttrib2fvARB;
   10477    vfmt->VertexAttrib3fARB = save_VertexAttrib3fARB;
   10478    vfmt->VertexAttrib3fvARB = save_VertexAttrib3fvARB;
   10479    vfmt->VertexAttrib4fARB = save_VertexAttrib4fARB;
   10480    vfmt->VertexAttrib4fvARB = save_VertexAttrib4fvARB;
   10481 
   10482    vfmt->PrimitiveRestartNV = save_PrimitiveRestartNV;
   10483 }
   10484 
   10485 
   10486 void
   10487 _mesa_install_dlist_vtxfmt(struct _glapi_table *disp,
   10488                            const GLvertexformat *vfmt)
   10489 {
   10490    SET_CallList(disp, vfmt->CallList);
   10491    SET_CallLists(disp, vfmt->CallLists);
   10492 }
   10493 
   10494 
   10495 /**
   10496  * Initialize display list state for given context.
   10497  */
   10498 void
   10499 _mesa_init_display_list(struct gl_context *ctx)
   10500 {
   10501    static GLboolean tableInitialized = GL_FALSE;
   10502 
   10503    /* zero-out the instruction size table, just once */
   10504    if (!tableInitialized) {
   10505       memset(InstSize, 0, sizeof(InstSize));
   10506       tableInitialized = GL_TRUE;
   10507    }
   10508 
   10509    /* extension info */
   10510    ctx->ListExt = CALLOC_STRUCT(gl_list_extensions);
   10511 
   10512    /* Display list */
   10513    ctx->ListState.CallDepth = 0;
   10514    ctx->ExecuteFlag = GL_TRUE;
   10515    ctx->CompileFlag = GL_FALSE;
   10516    ctx->ListState.CurrentBlock = NULL;
   10517    ctx->ListState.CurrentPos = 0;
   10518 
   10519    /* Display List group */
   10520    ctx->List.ListBase = 0;
   10521 
   10522    save_vtxfmt_init(&ctx->ListState.ListVtxfmt);
   10523 
   10524    InstSize[OPCODE_NOP] = 1;
   10525 }
   10526 
   10527 
   10528 void
   10529 _mesa_free_display_list_data(struct gl_context *ctx)
   10530 {
   10531    free(ctx->ListExt);
   10532    ctx->ListExt = NULL;
   10533 }
   10534