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