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