Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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