2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009 VMware, Inc. All Rights Reserved.
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:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
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.
29 * Display lists management functions.
33 #include "api_arrayelt.h"
34 #include "draw_validate.h"
46 #include "glthread_marshal.h"
48 #include "main/dispatch.h"
50 #include "vbo/vbo_save.h"
51 #include "util/u_inlines.h"
52 #include "util/u_memory.h"
53 #include "api_exec_decl.h"
55 #include "state_tracker/st_context.h"
56 #include "state_tracker/st_cb_texture.h"
57 #include "state_tracker/st_cb_bitmap.h"
58 #include "state_tracker/st_sampler_view.h"
61 _mesa_glthread_should_execute_list(struct gl_context *ctx,
62 struct gl_display_list *dlist);
67 * \param ctx GL context.
69 * Checks if dd_function_table::SaveNeedFlush is marked to flush
70 * stored (save) vertices, and calls vbo_save_SaveFlushVertices if so.
72 #define SAVE_FLUSH_VERTICES(ctx) \
74 if (ctx->Driver.SaveNeedFlush) \
75 vbo_save_SaveFlushVertices(ctx); \
80 * Macro to assert that the API call was made outside the
81 * glBegin()/glEnd() pair, with return value.
83 * \param ctx GL context.
84 * \param retval value to return value in case the assertion fails.
86 #define ASSERT_OUTSIDE_SAVE_BEGIN_END_WITH_RETVAL(ctx, retval) \
88 if (ctx->Driver.CurrentSavePrimitive <= PRIM_MAX) { \
89 _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glBegin/End" ); \
95 * Macro to assert that the API call was made outside the
96 * glBegin()/glEnd() pair.
98 * \param ctx GL context.
100 #define ASSERT_OUTSIDE_SAVE_BEGIN_END(ctx) \
102 if (ctx->Driver.CurrentSavePrimitive <= PRIM_MAX) { \
103 _mesa_compile_error( ctx, GL_INVALID_OPERATION, "glBegin/End" ); \
109 * Macro to assert that the API call was made outside the
110 * glBegin()/glEnd() pair and flush the vertices.
112 * \param ctx GL context.
114 #define ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx) \
116 ASSERT_OUTSIDE_SAVE_BEGIN_END(ctx); \
117 SAVE_FLUSH_VERTICES(ctx); \
121 * Macro to assert that the API call was made outside the
122 * glBegin()/glEnd() pair and flush the vertices, with return value.
124 * \param ctx GL context.
125 * \param retval value to return value in case the assertion fails.
127 #define ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, retval) \
129 ASSERT_OUTSIDE_SAVE_BEGIN_END_WITH_RETVAL(ctx, retval); \
130 SAVE_FLUSH_VERTICES(ctx); \
135 * Display list opcodes.
139 OPCODE_INVALID = -1, /* Force signed enum */
145 OPCODE_BLEND_EQUATION,
146 OPCODE_BLEND_EQUATION_SEPARATE,
147 OPCODE_BLEND_FUNC_SEPARATE,
149 OPCODE_BLEND_EQUATION_I,
150 OPCODE_BLEND_EQUATION_SEPARATE_I,
152 OPCODE_BLEND_FUNC_SEPARATE_I,
161 OPCODE_CLEAR_STENCIL,
162 OPCODE_CLEAR_BUFFER_IV,
163 OPCODE_CLEAR_BUFFER_UIV,
164 OPCODE_CLEAR_BUFFER_FV,
165 OPCODE_CLEAR_BUFFER_FI,
168 OPCODE_COLOR_MASK_INDEXED,
169 OPCODE_COLOR_MATERIAL,
171 OPCODE_COPY_TEX_IMAGE1D,
172 OPCODE_COPY_TEX_IMAGE2D,
173 OPCODE_COPY_TEX_SUB_IMAGE1D,
174 OPCODE_COPY_TEX_SUB_IMAGE2D,
175 OPCODE_COPY_TEX_SUB_IMAGE3D,
181 OPCODE_DISABLE_INDEXED,
185 OPCODE_ENABLE_INDEXED,
199 OPCODE_LOAD_IDENTITY,
212 OPCODE_PIXEL_TRANSFER,
215 OPCODE_POINT_PARAMETERS,
217 OPCODE_POLYGON_STIPPLE,
218 OPCODE_POLYGON_OFFSET,
222 OPCODE_PRIORITIZE_TEXTURE,
231 OPCODE_SELECT_TEXTURE_SGIS,
232 OPCODE_SELECT_TEXTURE_COORD_SET,
243 OPCODE_TEX_SUB_IMAGE1D,
244 OPCODE_TEX_SUB_IMAGE2D,
245 OPCODE_TEX_SUB_IMAGE3D,
249 /* ARB_viewport_array */
250 OPCODE_VIEWPORT_ARRAY_V,
251 OPCODE_VIEWPORT_INDEXED_F,
252 OPCODE_VIEWPORT_INDEXED_FV,
253 OPCODE_SCISSOR_ARRAY_V,
254 OPCODE_SCISSOR_INDEXED,
255 OPCODE_SCISSOR_INDEXED_V,
256 OPCODE_DEPTH_ARRAY_V,
257 OPCODE_DEPTH_INDEXED,
258 /* GL_ARB_multitexture */
259 OPCODE_ACTIVE_TEXTURE,
260 /* GL_ARB_texture_compression */
261 OPCODE_COMPRESSED_TEX_IMAGE_1D,
262 OPCODE_COMPRESSED_TEX_IMAGE_2D,
263 OPCODE_COMPRESSED_TEX_IMAGE_3D,
264 OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D,
265 OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D,
266 OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D,
267 /* GL_ARB_multisample */
268 OPCODE_SAMPLE_COVERAGE,
269 /* GL_ARB_window_pos */
270 OPCODE_WINDOW_POS_ARB,
271 /* GL_ARB_vertex_program */
272 OPCODE_BIND_PROGRAM_ARB,
273 OPCODE_PROGRAM_LOCAL_PARAMETER_ARB,
274 /* GL_EXT_stencil_two_side */
275 OPCODE_ACTIVE_STENCIL_FACE_EXT,
276 /* GL_EXT_depth_bounds_test */
277 OPCODE_DEPTH_BOUNDS_EXT,
278 /* GL_ARB_vertex/fragment_program */
279 OPCODE_PROGRAM_STRING_ARB,
280 OPCODE_PROGRAM_ENV_PARAMETER_ARB,
281 /* GL_ARB_occlusion_query */
282 OPCODE_BEGIN_QUERY_ARB,
283 OPCODE_END_QUERY_ARB,
284 /* GL_ARB_draw_buffers */
285 OPCODE_DRAW_BUFFERS_ARB,
286 /* GL_ATI_fragment_shader */
287 OPCODE_BIND_FRAGMENT_SHADER_ATI,
288 OPCODE_SET_FRAGMENT_SHADER_CONSTANTS_ATI,
290 OPCODE_STENCIL_FUNC_SEPARATE,
291 OPCODE_STENCIL_OP_SEPARATE,
292 OPCODE_STENCIL_MASK_SEPARATE,
293 /* GL_NV_primitive_restart */
294 OPCODE_PRIMITIVE_RESTART_NV,
295 /* GL_ARB_shader_objects */
313 OPCODE_UNIFORM_MATRIX22,
314 OPCODE_UNIFORM_MATRIX33,
315 OPCODE_UNIFORM_MATRIX44,
316 OPCODE_UNIFORM_MATRIX23,
317 OPCODE_UNIFORM_MATRIX32,
318 OPCODE_UNIFORM_MATRIX24,
319 OPCODE_UNIFORM_MATRIX42,
320 OPCODE_UNIFORM_MATRIX34,
321 OPCODE_UNIFORM_MATRIX43,
333 /* GL_ARB_gpu_shader_fp64 */
342 OPCODE_UNIFORM_MATRIX22D,
343 OPCODE_UNIFORM_MATRIX33D,
344 OPCODE_UNIFORM_MATRIX44D,
345 OPCODE_UNIFORM_MATRIX23D,
346 OPCODE_UNIFORM_MATRIX32D,
347 OPCODE_UNIFORM_MATRIX24D,
348 OPCODE_UNIFORM_MATRIX42D,
349 OPCODE_UNIFORM_MATRIX34D,
350 OPCODE_UNIFORM_MATRIX43D,
352 /* GL_ARB_gpu_shader_int64 */
357 OPCODE_UNIFORM_1I64V,
358 OPCODE_UNIFORM_2I64V,
359 OPCODE_UNIFORM_3I64V,
360 OPCODE_UNIFORM_4I64V,
361 OPCODE_UNIFORM_1UI64,
362 OPCODE_UNIFORM_2UI64,
363 OPCODE_UNIFORM_3UI64,
364 OPCODE_UNIFORM_4UI64,
365 OPCODE_UNIFORM_1UI64V,
366 OPCODE_UNIFORM_2UI64V,
367 OPCODE_UNIFORM_3UI64V,
368 OPCODE_UNIFORM_4UI64V,
369 OPCODE_PROGRAM_UNIFORM_1I64,
370 OPCODE_PROGRAM_UNIFORM_2I64,
371 OPCODE_PROGRAM_UNIFORM_3I64,
372 OPCODE_PROGRAM_UNIFORM_4I64,
373 OPCODE_PROGRAM_UNIFORM_1I64V,
374 OPCODE_PROGRAM_UNIFORM_2I64V,
375 OPCODE_PROGRAM_UNIFORM_3I64V,
376 OPCODE_PROGRAM_UNIFORM_4I64V,
377 OPCODE_PROGRAM_UNIFORM_1UI64,
378 OPCODE_PROGRAM_UNIFORM_2UI64,
379 OPCODE_PROGRAM_UNIFORM_3UI64,
380 OPCODE_PROGRAM_UNIFORM_4UI64,
381 OPCODE_PROGRAM_UNIFORM_1UI64V,
382 OPCODE_PROGRAM_UNIFORM_2UI64V,
383 OPCODE_PROGRAM_UNIFORM_3UI64V,
384 OPCODE_PROGRAM_UNIFORM_4UI64V,
386 /* OpenGL 4.0 / GL_ARB_tessellation_shader */
387 OPCODE_PATCH_PARAMETER_I,
388 OPCODE_PATCH_PARAMETER_FV_INNER,
389 OPCODE_PATCH_PARAMETER_FV_OUTER,
391 /* OpenGL 4.2 / GL_ARB_separate_shader_objects */
392 OPCODE_USE_PROGRAM_STAGES,
393 OPCODE_PROGRAM_UNIFORM_1F,
394 OPCODE_PROGRAM_UNIFORM_2F,
395 OPCODE_PROGRAM_UNIFORM_3F,
396 OPCODE_PROGRAM_UNIFORM_4F,
397 OPCODE_PROGRAM_UNIFORM_1FV,
398 OPCODE_PROGRAM_UNIFORM_2FV,
399 OPCODE_PROGRAM_UNIFORM_3FV,
400 OPCODE_PROGRAM_UNIFORM_4FV,
401 OPCODE_PROGRAM_UNIFORM_1D,
402 OPCODE_PROGRAM_UNIFORM_2D,
403 OPCODE_PROGRAM_UNIFORM_3D,
404 OPCODE_PROGRAM_UNIFORM_4D,
405 OPCODE_PROGRAM_UNIFORM_1DV,
406 OPCODE_PROGRAM_UNIFORM_2DV,
407 OPCODE_PROGRAM_UNIFORM_3DV,
408 OPCODE_PROGRAM_UNIFORM_4DV,
409 OPCODE_PROGRAM_UNIFORM_1I,
410 OPCODE_PROGRAM_UNIFORM_2I,
411 OPCODE_PROGRAM_UNIFORM_3I,
412 OPCODE_PROGRAM_UNIFORM_4I,
413 OPCODE_PROGRAM_UNIFORM_1IV,
414 OPCODE_PROGRAM_UNIFORM_2IV,
415 OPCODE_PROGRAM_UNIFORM_3IV,
416 OPCODE_PROGRAM_UNIFORM_4IV,
417 OPCODE_PROGRAM_UNIFORM_1UI,
418 OPCODE_PROGRAM_UNIFORM_2UI,
419 OPCODE_PROGRAM_UNIFORM_3UI,
420 OPCODE_PROGRAM_UNIFORM_4UI,
421 OPCODE_PROGRAM_UNIFORM_1UIV,
422 OPCODE_PROGRAM_UNIFORM_2UIV,
423 OPCODE_PROGRAM_UNIFORM_3UIV,
424 OPCODE_PROGRAM_UNIFORM_4UIV,
425 OPCODE_PROGRAM_UNIFORM_MATRIX22F,
426 OPCODE_PROGRAM_UNIFORM_MATRIX33F,
427 OPCODE_PROGRAM_UNIFORM_MATRIX44F,
428 OPCODE_PROGRAM_UNIFORM_MATRIX23F,
429 OPCODE_PROGRAM_UNIFORM_MATRIX32F,
430 OPCODE_PROGRAM_UNIFORM_MATRIX24F,
431 OPCODE_PROGRAM_UNIFORM_MATRIX42F,
432 OPCODE_PROGRAM_UNIFORM_MATRIX34F,
433 OPCODE_PROGRAM_UNIFORM_MATRIX43F,
434 OPCODE_PROGRAM_UNIFORM_MATRIX22D,
435 OPCODE_PROGRAM_UNIFORM_MATRIX33D,
436 OPCODE_PROGRAM_UNIFORM_MATRIX44D,
437 OPCODE_PROGRAM_UNIFORM_MATRIX23D,
438 OPCODE_PROGRAM_UNIFORM_MATRIX32D,
439 OPCODE_PROGRAM_UNIFORM_MATRIX24D,
440 OPCODE_PROGRAM_UNIFORM_MATRIX42D,
441 OPCODE_PROGRAM_UNIFORM_MATRIX34D,
442 OPCODE_PROGRAM_UNIFORM_MATRIX43D,
444 /* GL_ARB_clip_control */
447 /* GL_ARB_color_buffer_float */
450 /* GL_EXT_framebuffer_blit */
451 OPCODE_BLIT_FRAMEBUFFER,
453 /* Vertex attributes -- fallback for when optimized display
454 * list build isn't active.
481 /* GL_EXT_provoking_vertex */
482 OPCODE_PROVOKING_VERTEX,
484 /* GL_EXT_transform_feedback */
485 OPCODE_BEGIN_TRANSFORM_FEEDBACK,
486 OPCODE_END_TRANSFORM_FEEDBACK,
487 OPCODE_BIND_TRANSFORM_FEEDBACK,
488 OPCODE_PAUSE_TRANSFORM_FEEDBACK,
489 OPCODE_RESUME_TRANSFORM_FEEDBACK,
490 OPCODE_DRAW_TRANSFORM_FEEDBACK,
492 /* GL_EXT_texture_integer */
494 OPCODE_CLEARCOLOR_UI,
495 OPCODE_TEXPARAMETER_I,
496 OPCODE_TEXPARAMETER_UI,
498 /* GL_ARB_instanced_arrays */
499 OPCODE_VERTEX_ATTRIB_DIVISOR,
501 /* GL_NV_texture_barrier */
502 OPCODE_TEXTURE_BARRIER_NV,
504 /* GL_ARB_sampler_object */
506 OPCODE_SAMPLER_PARAMETERIV,
507 OPCODE_SAMPLER_PARAMETERFV,
508 OPCODE_SAMPLER_PARAMETERIIV,
509 OPCODE_SAMPLER_PARAMETERUIV,
511 /* ARB_compute_shader */
512 OPCODE_DISPATCH_COMPUTE,
517 /* GL_NV_conditional_render */
518 OPCODE_BEGIN_CONDITIONAL_RENDER,
519 OPCODE_END_CONDITIONAL_RENDER,
521 /* ARB_timer_query */
522 OPCODE_QUERY_COUNTER,
524 /* ARB_transform_feedback3 */
525 OPCODE_BEGIN_QUERY_INDEXED,
526 OPCODE_END_QUERY_INDEXED,
527 OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM,
529 /* ARB_transform_feedback_instanced */
530 OPCODE_DRAW_TRANSFORM_FEEDBACK_INSTANCED,
531 OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM_INSTANCED,
533 /* ARB_uniform_buffer_object */
534 OPCODE_UNIFORM_BLOCK_BINDING,
536 /* ARB_shader_subroutines */
537 OPCODE_UNIFORM_SUBROUTINES,
539 /* EXT_polygon_offset_clamp */
540 OPCODE_POLYGON_OFFSET_CLAMP,
542 /* EXT_window_rectangles */
543 OPCODE_WINDOW_RECTANGLES,
545 /* NV_conservative_raster */
546 OPCODE_SUBPIXEL_PRECISION_BIAS,
548 /* NV_conservative_raster_dilate */
549 OPCODE_CONSERVATIVE_RASTER_PARAMETER_F,
551 /* NV_conservative_raster_pre_snap_triangles */
552 OPCODE_CONSERVATIVE_RASTER_PARAMETER_I,
554 /* EXT_direct_state_access */
557 OPCODE_MATRIX_ROTATE,
559 OPCODE_MATRIX_TRANSLATE,
560 OPCODE_MATRIX_LOAD_IDENTITY,
562 OPCODE_MATRIX_FRUSTUM,
565 OPCODE_TEXTUREPARAMETER_F,
566 OPCODE_TEXTUREPARAMETER_I,
567 OPCODE_TEXTUREPARAMETER_II,
568 OPCODE_TEXTUREPARAMETER_IUI,
569 OPCODE_TEXTURE_IMAGE1D,
570 OPCODE_TEXTURE_IMAGE2D,
571 OPCODE_TEXTURE_IMAGE3D,
572 OPCODE_TEXTURE_SUB_IMAGE1D,
573 OPCODE_TEXTURE_SUB_IMAGE2D,
574 OPCODE_TEXTURE_SUB_IMAGE3D,
575 OPCODE_COPY_TEXTURE_IMAGE1D,
576 OPCODE_COPY_TEXTURE_IMAGE2D,
577 OPCODE_COPY_TEXTURE_SUB_IMAGE1D,
578 OPCODE_COPY_TEXTURE_SUB_IMAGE2D,
579 OPCODE_COPY_TEXTURE_SUB_IMAGE3D,
580 OPCODE_BIND_MULTITEXTURE,
581 OPCODE_MULTITEXPARAMETER_F,
582 OPCODE_MULTITEXPARAMETER_I,
583 OPCODE_MULTITEXPARAMETER_II,
584 OPCODE_MULTITEXPARAMETER_IUI,
585 OPCODE_MULTITEX_IMAGE1D,
586 OPCODE_MULTITEX_IMAGE2D,
587 OPCODE_MULTITEX_IMAGE3D,
588 OPCODE_MULTITEX_SUB_IMAGE1D,
589 OPCODE_MULTITEX_SUB_IMAGE2D,
590 OPCODE_MULTITEX_SUB_IMAGE3D,
591 OPCODE_COPY_MULTITEX_IMAGE1D,
592 OPCODE_COPY_MULTITEX_IMAGE2D,
593 OPCODE_COPY_MULTITEX_SUB_IMAGE1D,
594 OPCODE_COPY_MULTITEX_SUB_IMAGE2D,
595 OPCODE_COPY_MULTITEX_SUB_IMAGE3D,
597 OPCODE_COMPRESSED_TEXTURE_IMAGE_1D,
598 OPCODE_COMPRESSED_TEXTURE_IMAGE_2D,
599 OPCODE_COMPRESSED_TEXTURE_IMAGE_3D,
600 OPCODE_COMPRESSED_TEXTURE_SUB_IMAGE_1D,
601 OPCODE_COMPRESSED_TEXTURE_SUB_IMAGE_2D,
602 OPCODE_COMPRESSED_TEXTURE_SUB_IMAGE_3D,
603 OPCODE_COMPRESSED_MULTITEX_IMAGE_1D,
604 OPCODE_COMPRESSED_MULTITEX_IMAGE_2D,
605 OPCODE_COMPRESSED_MULTITEX_IMAGE_3D,
606 OPCODE_COMPRESSED_MULTITEX_SUB_IMAGE_1D,
607 OPCODE_COMPRESSED_MULTITEX_SUB_IMAGE_2D,
608 OPCODE_COMPRESSED_MULTITEX_SUB_IMAGE_3D,
609 OPCODE_NAMED_PROGRAM_STRING,
610 OPCODE_NAMED_PROGRAM_LOCAL_PARAMETER,
612 /* GL_ARB_ES3_2_compatibility */
613 OPCODE_PRIMITIVE_BOUNDING_BOX,
616 OPCODE_VERTEX_LIST_LOOPBACK,
617 OPCODE_VERTEX_LIST_COPY_CURRENT,
619 /* The following three are meta instructions */
620 OPCODE_ERROR, /* raise compiled-in error */
626 typedef union gl_dlist_node Node;
629 /** How many 4-byte dwords to store a pointer */
630 #define POINTER_DWORDS (sizeof(void *) / 4)
632 /* We want to keep sizeof(union gl_dlist_node) == 4 to minimize
633 * space for display lists. The following types and functions are
634 * used to help store 4- and 8-byte pointers in 1 or 2 dlist_nodes.
639 GLuint dwords[POINTER_DWORDS];
644 * Save a 4 or 8-byte pointer at dest (and dest+1).
647 save_pointer(Node *dest, void *src)
652 STATIC_ASSERT(POINTER_DWORDS == 1 || POINTER_DWORDS == 2);
653 STATIC_ASSERT(sizeof(Node) == 4);
657 for (i = 0; i < POINTER_DWORDS; i++)
658 dest[i].ui = p.dwords[i];
663 * Retrieve a 4 or 8-byte pointer from node (node+1).
666 get_pointer(const Node *node)
671 for (i = 0; i < POINTER_DWORDS; i++)
672 p.dwords[i] = node[i].ui;
679 * Used to store a 64-bit uint in a pair of "Nodes" for the sake of 32-bit
701 #define ASSIGN_DOUBLE_TO_NODES(n, idx, value) \
703 union float64_pair tmp; \
705 n[idx].ui = tmp.uint32[0]; \
706 n[idx+1].ui = tmp.uint32[1]; \
709 #define ASSIGN_UINT64_TO_NODES(n, idx, value) \
711 union uint64_pair tmp; \
712 tmp.uint64 = value; \
713 n[idx].ui = tmp.uint32[0]; \
714 n[idx+1].ui = tmp.uint32[1]; \
717 #define ASSIGN_INT64_TO_NODES(n, idx, value) \
719 union int64_pair tmp; \
721 n[idx].i = tmp.int32[0]; \
722 n[idx+1].i = tmp.int32[1]; \
726 * How many nodes to allocate at a time. Note that bulk vertex data
727 * from glBegin/glVertex/glEnd primitives will typically wind up in
728 * a VBO, and not directly in the display list itself.
730 #define BLOCK_SIZE 256
733 void mesa_print_display_list(GLuint list);
737 * Called by display list code when a display list is being deleted.
740 vbo_destroy_vertex_list(struct gl_context *ctx, struct vbo_save_vertex_list *node)
742 struct gl_buffer_object *bo = node->cold->VAO[0]->BufferBinding[0].BufferObj;
744 if (_mesa_bufferobj_mapped(bo, MAP_INTERNAL))
745 _mesa_bufferobj_unmap(ctx, bo, MAP_INTERNAL);
747 for (gl_vertex_processing_mode mode = VP_MODE_FF; mode < VP_MODE_MAX; ++mode) {
748 _mesa_reference_vao(ctx, &node->cold->VAO[mode], NULL);
749 if (node->private_refcount[mode]) {
750 assert(node->private_refcount[mode] > 0);
751 p_atomic_add(&node->state[mode]->reference.count,
752 -node->private_refcount[mode]);
754 pipe_vertex_state_reference(&node->state[mode], NULL);
759 free(node->start_counts);
762 _mesa_reference_buffer_object(ctx, &node->cold->ib.obj, NULL);
763 free(node->cold->current_data);
764 node->cold->current_data = NULL;
766 free(node->cold->prims);
771 vbo_print_vertex_list(struct gl_context *ctx, struct vbo_save_vertex_list *node, OpCode op, FILE *f)
774 struct gl_buffer_object *buffer = node->cold->VAO[0]->BufferBinding[0].BufferObj;
775 const GLuint vertex_size = _vbo_save_get_stride(node)/sizeof(GLfloat);
778 const char *label[] = {
779 "VBO-VERTEX-LIST", "VBO-VERTEX-LIST-LOOPBACK", "VBO-VERTEX-LIST-COPY-CURRENT"
782 fprintf(f, "%s, %u vertices, %d primitives, %d vertsize, "
784 label[op - OPCODE_VERTEX_LIST],
785 node->cold->vertex_count, node->cold->prim_count, vertex_size,
788 for (i = 0; i < node->cold->prim_count; i++) {
789 struct _mesa_prim *prim = &node->cold->prims[i];
790 fprintf(f, " prim %d: %s %d..%d %s %s\n",
792 _mesa_lookup_prim_by_nr(prim->mode),
794 prim->start + prim->count,
795 (prim->begin) ? "BEGIN" : "(wrap)",
796 (prim->end) ? "END" : "(wrap)");
802 Node *get_list_head(struct gl_context *ctx, struct gl_display_list *dlist)
804 return dlist->small_list ?
805 &ctx->Shared->small_dlist_store.ptr[dlist->start] :
811 * Allocate a gl_display_list object with an initial block of storage.
812 * \param count how many display list nodes/tokens to allocate
814 static struct gl_display_list *
815 make_list(GLuint name, GLuint count)
817 struct gl_display_list *dlist = CALLOC_STRUCT(gl_display_list);
819 dlist->Head = malloc(sizeof(Node) * count);
820 dlist->Head[0].opcode = OPCODE_END_OF_LIST;
826 * Lookup function to just encapsulate casting.
828 struct gl_display_list *
829 _mesa_lookup_list(struct gl_context *ctx, GLuint list, bool locked)
831 return (struct gl_display_list *)
832 _mesa_HashLookupMaybeLocked(ctx->Shared->DisplayList, list, locked);
837 * Delete the named display list, but don't remove from hash table.
838 * \param dlist - display list pointer
841 _mesa_delete_list(struct gl_context *ctx, struct gl_display_list *dlist)
845 n = block = get_list_head(ctx, dlist);
854 const OpCode opcode = n[0].opcode;
857 /* for some commands, we need to free malloc'd memory */
859 free(get_pointer(&n[6]));
862 free(get_pointer(&n[10]));
864 case OPCODE_CALL_LISTS:
865 free(get_pointer(&n[3]));
867 case OPCODE_DRAW_PIXELS:
868 free(get_pointer(&n[5]));
870 case OPCODE_BITMAP: {
871 struct pipe_resource *tex = get_pointer(&n[7]);
872 pipe_resource_reference(&tex, NULL);
875 case OPCODE_POLYGON_STIPPLE:
876 free(get_pointer(&n[1]));
878 case OPCODE_TEX_IMAGE1D:
879 free(get_pointer(&n[8]));
881 case OPCODE_TEX_IMAGE2D:
882 free(get_pointer(&n[9]));
884 case OPCODE_TEX_IMAGE3D:
885 free(get_pointer(&n[10]));
887 case OPCODE_TEX_SUB_IMAGE1D:
888 free(get_pointer(&n[7]));
890 case OPCODE_TEX_SUB_IMAGE2D:
891 free(get_pointer(&n[9]));
893 case OPCODE_TEX_SUB_IMAGE3D:
894 free(get_pointer(&n[11]));
896 case OPCODE_COMPRESSED_TEX_IMAGE_1D:
897 free(get_pointer(&n[7]));
899 case OPCODE_COMPRESSED_TEX_IMAGE_2D:
900 free(get_pointer(&n[8]));
902 case OPCODE_COMPRESSED_TEX_IMAGE_3D:
903 free(get_pointer(&n[9]));
905 case OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D:
906 free(get_pointer(&n[7]));
908 case OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D:
909 free(get_pointer(&n[9]));
911 case OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D:
912 free(get_pointer(&n[11]));
914 case OPCODE_PROGRAM_STRING_ARB:
915 free(get_pointer(&n[4])); /* program string */
917 case OPCODE_UNIFORM_1FV:
918 case OPCODE_UNIFORM_2FV:
919 case OPCODE_UNIFORM_3FV:
920 case OPCODE_UNIFORM_4FV:
921 case OPCODE_UNIFORM_1DV:
922 case OPCODE_UNIFORM_2DV:
923 case OPCODE_UNIFORM_3DV:
924 case OPCODE_UNIFORM_4DV:
925 case OPCODE_UNIFORM_1IV:
926 case OPCODE_UNIFORM_2IV:
927 case OPCODE_UNIFORM_3IV:
928 case OPCODE_UNIFORM_4IV:
929 case OPCODE_UNIFORM_1UIV:
930 case OPCODE_UNIFORM_2UIV:
931 case OPCODE_UNIFORM_3UIV:
932 case OPCODE_UNIFORM_4UIV:
933 case OPCODE_UNIFORM_1I64V:
934 case OPCODE_UNIFORM_2I64V:
935 case OPCODE_UNIFORM_3I64V:
936 case OPCODE_UNIFORM_4I64V:
937 case OPCODE_UNIFORM_1UI64V:
938 case OPCODE_UNIFORM_2UI64V:
939 case OPCODE_UNIFORM_3UI64V:
940 case OPCODE_UNIFORM_4UI64V:
941 free(get_pointer(&n[3]));
943 case OPCODE_UNIFORM_MATRIX22:
944 case OPCODE_UNIFORM_MATRIX33:
945 case OPCODE_UNIFORM_MATRIX44:
946 case OPCODE_UNIFORM_MATRIX24:
947 case OPCODE_UNIFORM_MATRIX42:
948 case OPCODE_UNIFORM_MATRIX23:
949 case OPCODE_UNIFORM_MATRIX32:
950 case OPCODE_UNIFORM_MATRIX34:
951 case OPCODE_UNIFORM_MATRIX43:
952 case OPCODE_UNIFORM_MATRIX22D:
953 case OPCODE_UNIFORM_MATRIX33D:
954 case OPCODE_UNIFORM_MATRIX44D:
955 case OPCODE_UNIFORM_MATRIX24D:
956 case OPCODE_UNIFORM_MATRIX42D:
957 case OPCODE_UNIFORM_MATRIX23D:
958 case OPCODE_UNIFORM_MATRIX32D:
959 case OPCODE_UNIFORM_MATRIX34D:
960 case OPCODE_UNIFORM_MATRIX43D:
961 free(get_pointer(&n[4]));
963 case OPCODE_PROGRAM_UNIFORM_1FV:
964 case OPCODE_PROGRAM_UNIFORM_2FV:
965 case OPCODE_PROGRAM_UNIFORM_3FV:
966 case OPCODE_PROGRAM_UNIFORM_4FV:
967 case OPCODE_PROGRAM_UNIFORM_1DV:
968 case OPCODE_PROGRAM_UNIFORM_2DV:
969 case OPCODE_PROGRAM_UNIFORM_3DV:
970 case OPCODE_PROGRAM_UNIFORM_4DV:
971 case OPCODE_PROGRAM_UNIFORM_1IV:
972 case OPCODE_PROGRAM_UNIFORM_2IV:
973 case OPCODE_PROGRAM_UNIFORM_3IV:
974 case OPCODE_PROGRAM_UNIFORM_4IV:
975 case OPCODE_PROGRAM_UNIFORM_1UIV:
976 case OPCODE_PROGRAM_UNIFORM_2UIV:
977 case OPCODE_PROGRAM_UNIFORM_3UIV:
978 case OPCODE_PROGRAM_UNIFORM_4UIV:
979 case OPCODE_PROGRAM_UNIFORM_1I64V:
980 case OPCODE_PROGRAM_UNIFORM_2I64V:
981 case OPCODE_PROGRAM_UNIFORM_3I64V:
982 case OPCODE_PROGRAM_UNIFORM_4I64V:
983 case OPCODE_PROGRAM_UNIFORM_1UI64V:
984 case OPCODE_PROGRAM_UNIFORM_2UI64V:
985 case OPCODE_PROGRAM_UNIFORM_3UI64V:
986 case OPCODE_PROGRAM_UNIFORM_4UI64V:
987 free(get_pointer(&n[4]));
989 case OPCODE_PROGRAM_UNIFORM_MATRIX22F:
990 case OPCODE_PROGRAM_UNIFORM_MATRIX33F:
991 case OPCODE_PROGRAM_UNIFORM_MATRIX44F:
992 case OPCODE_PROGRAM_UNIFORM_MATRIX24F:
993 case OPCODE_PROGRAM_UNIFORM_MATRIX42F:
994 case OPCODE_PROGRAM_UNIFORM_MATRIX23F:
995 case OPCODE_PROGRAM_UNIFORM_MATRIX32F:
996 case OPCODE_PROGRAM_UNIFORM_MATRIX34F:
997 case OPCODE_PROGRAM_UNIFORM_MATRIX43F:
998 case OPCODE_PROGRAM_UNIFORM_MATRIX22D:
999 case OPCODE_PROGRAM_UNIFORM_MATRIX33D:
1000 case OPCODE_PROGRAM_UNIFORM_MATRIX44D:
1001 case OPCODE_PROGRAM_UNIFORM_MATRIX24D:
1002 case OPCODE_PROGRAM_UNIFORM_MATRIX42D:
1003 case OPCODE_PROGRAM_UNIFORM_MATRIX23D:
1004 case OPCODE_PROGRAM_UNIFORM_MATRIX32D:
1005 case OPCODE_PROGRAM_UNIFORM_MATRIX34D:
1006 case OPCODE_PROGRAM_UNIFORM_MATRIX43D:
1007 free(get_pointer(&n[5]));
1009 case OPCODE_PIXEL_MAP:
1010 free(get_pointer(&n[3]));
1012 case OPCODE_VIEWPORT_ARRAY_V:
1013 case OPCODE_SCISSOR_ARRAY_V:
1014 case OPCODE_DEPTH_ARRAY_V:
1015 case OPCODE_UNIFORM_SUBROUTINES:
1016 case OPCODE_WINDOW_RECTANGLES:
1017 free(get_pointer(&n[3]));
1019 case OPCODE_TEXTURE_IMAGE1D:
1020 case OPCODE_MULTITEX_IMAGE1D:
1021 free(get_pointer(&n[9]));
1023 case OPCODE_TEXTURE_IMAGE2D:
1024 case OPCODE_MULTITEX_IMAGE2D:
1025 free(get_pointer(&n[10]));
1027 case OPCODE_TEXTURE_IMAGE3D:
1028 case OPCODE_MULTITEX_IMAGE3D:
1029 free(get_pointer(&n[11]));
1031 case OPCODE_TEXTURE_SUB_IMAGE1D:
1032 case OPCODE_MULTITEX_SUB_IMAGE1D:
1033 case OPCODE_COMPRESSED_TEXTURE_SUB_IMAGE_1D:
1034 case OPCODE_COMPRESSED_MULTITEX_SUB_IMAGE_1D:
1035 free(get_pointer(&n[8]));
1037 case OPCODE_TEXTURE_SUB_IMAGE2D:
1038 case OPCODE_MULTITEX_SUB_IMAGE2D:
1039 case OPCODE_COMPRESSED_TEXTURE_SUB_IMAGE_2D:
1040 case OPCODE_COMPRESSED_MULTITEX_SUB_IMAGE_2D:
1041 free(get_pointer(&n[10]));
1043 case OPCODE_TEXTURE_SUB_IMAGE3D:
1044 case OPCODE_MULTITEX_SUB_IMAGE3D:
1045 case OPCODE_COMPRESSED_TEXTURE_SUB_IMAGE_3D:
1046 case OPCODE_COMPRESSED_MULTITEX_SUB_IMAGE_3D:
1047 free(get_pointer(&n[12]));
1049 case OPCODE_COMPRESSED_TEXTURE_IMAGE_1D:
1050 case OPCODE_COMPRESSED_MULTITEX_IMAGE_1D:
1051 free(get_pointer(&n[8]));
1053 case OPCODE_COMPRESSED_TEXTURE_IMAGE_2D:
1054 case OPCODE_COMPRESSED_MULTITEX_IMAGE_2D:
1055 free(get_pointer(&n[9]));
1057 case OPCODE_COMPRESSED_TEXTURE_IMAGE_3D:
1058 case OPCODE_COMPRESSED_MULTITEX_IMAGE_3D:
1059 free(get_pointer(&n[10]));
1061 case OPCODE_NAMED_PROGRAM_STRING:
1062 free(get_pointer(&n[5]));
1064 case OPCODE_VERTEX_LIST:
1065 case OPCODE_VERTEX_LIST_LOOPBACK:
1066 case OPCODE_VERTEX_LIST_COPY_CURRENT:
1067 vbo_destroy_vertex_list(ctx, (struct vbo_save_vertex_list *) &n[0]);
1069 case OPCODE_CONTINUE:
1070 n = (Node *) get_pointer(&n[1]);
1071 assert (!dlist->small_list);
1075 case OPCODE_END_OF_LIST:
1076 if (dlist->small_list) {
1077 unsigned start = dlist->start;
1078 for (int i = 0; i < dlist->count; i++) {
1079 util_idalloc_free(&ctx->Shared->small_dlist_store.free_idx,
1089 /* just increment 'n' pointer, below */
1093 assert(n[0].InstSize > 0);
1100 * Destroy a display list and remove from hash table.
1101 * \param list - display list number
1104 destroy_list(struct gl_context *ctx, GLuint list)
1106 struct gl_display_list *dlist;
1111 dlist = _mesa_lookup_list(ctx, list, true);
1115 _mesa_delete_list(ctx, dlist);
1116 _mesa_HashRemoveLocked(ctx->Shared->DisplayList, list);
1121 * Wrapper for _mesa_unpack_image/bitmap() that handles pixel buffer objects.
1122 * If width < 0 or height < 0 or format or type are invalid we'll just
1123 * return NULL. We will not generate an error since OpenGL command
1124 * arguments aren't error-checked until the command is actually executed
1125 * (not when they're compiled).
1126 * But if we run out of memory, GL_OUT_OF_MEMORY will be recorded.
1129 unpack_image(struct gl_context *ctx, GLuint dimensions,
1130 GLsizei width, GLsizei height, GLsizei depth,
1131 GLenum format, GLenum type, const GLvoid * pixels,
1132 const struct gl_pixelstore_attrib *unpack)
1134 if (width <= 0 || height <= 0) {
1138 if (_mesa_bytes_per_pixel(format, type) < 0) {
1139 /* bad format and/or type */
1143 if (!unpack->BufferObj) {
1147 image = _mesa_unpack_image(dimensions, width, height, depth,
1148 format, type, pixels, unpack);
1149 if (pixels && !image) {
1150 _mesa_error(ctx, GL_OUT_OF_MEMORY, "display list construction");
1154 else if (_mesa_validate_pbo_access(dimensions, unpack, width, height,
1155 depth, format, type, INT_MAX, pixels)) {
1156 const GLubyte *map, *src;
1160 _mesa_bufferobj_map_range(ctx, 0, unpack->BufferObj->Size,
1161 GL_MAP_READ_BIT, unpack->BufferObj,
1164 /* unable to map src buffer! */
1165 _mesa_error(ctx, GL_INVALID_OPERATION, "unable to map PBO");
1169 src = ADD_POINTERS(map, pixels);
1170 image = _mesa_unpack_image(dimensions, width, height, depth,
1171 format, type, src, unpack);
1173 _mesa_bufferobj_unmap(ctx, unpack->BufferObj, MAP_INTERNAL);
1176 _mesa_error(ctx, GL_OUT_OF_MEMORY, "display list construction");
1182 _mesa_error(ctx, GL_INVALID_OPERATION, "invalid PBO access");
1187 /** Return copy of memory */
1189 memdup(const void *src, GLsizei bytes)
1191 void *b = bytes >= 0 ? malloc(bytes) : NULL;
1193 memcpy(b, src, bytes);
1199 * Allocate space for a display list instruction (opcode + payload space).
1200 * \param opcode the instruction opcode (OPCODE_* value)
1201 * \param bytes instruction payload size (not counting opcode)
1202 * \param align8 does the payload need to be 8-byte aligned?
1203 * This is only relevant in 64-bit environments.
1204 * \return pointer to allocated memory (the payload will be at pointer+1)
1207 dlist_alloc(struct gl_context *ctx, OpCode opcode, GLuint bytes, bool align8)
1209 const GLuint numNodes = 1 + (bytes + sizeof(Node) - 1) / sizeof(Node);
1210 const GLuint contNodes = 1 + POINTER_DWORDS; /* size of continue info */
1212 assert(bytes <= BLOCK_SIZE * sizeof(Node));
1214 /* If this node needs to start on an 8-byte boundary, pad the last node. */
1215 if (sizeof(void *) == 8 && align8 &&
1216 ctx->ListState.CurrentPos % 2 == 1) {
1217 Node *last = ctx->ListState.CurrentBlock + ctx->ListState.CurrentPos -
1218 ctx->ListState.LastInstSize;
1220 ctx->ListState.CurrentPos++;
1223 if (ctx->ListState.CurrentPos + numNodes + contNodes > BLOCK_SIZE) {
1224 /* This block is full. Allocate a new block and chain to it */
1226 Node *n = ctx->ListState.CurrentBlock + ctx->ListState.CurrentPos;
1227 n[0].opcode = OPCODE_CONTINUE;
1228 newblock = malloc(sizeof(Node) * BLOCK_SIZE);
1230 _mesa_error(ctx, GL_OUT_OF_MEMORY, "Building display list");
1234 /* a fresh block should be 8-byte aligned on 64-bit systems */
1235 assert(((GLintptr) newblock) % sizeof(void *) == 0);
1237 save_pointer(&n[1], newblock);
1238 ctx->ListState.CurrentBlock = newblock;
1239 ctx->ListState.CurrentPos = 0;
1242 Node *n = ctx->ListState.CurrentBlock + ctx->ListState.CurrentPos;
1243 ctx->ListState.CurrentPos += numNodes;
1245 n[0].opcode = opcode;
1246 n[0].InstSize = numNodes;
1247 ctx->ListState.LastInstSize = numNodes;
1254 _mesa_dlist_alloc_vertex_list(struct gl_context *ctx, bool copy_to_current)
1256 Node *n = dlist_alloc(ctx,
1257 copy_to_current ? OPCODE_VERTEX_LIST_COPY_CURRENT :
1259 sizeof(struct vbo_save_vertex_list) - sizeof(Node),
1264 /* Clear all nodes except the header */
1265 memset(n + 1, 0, sizeof(struct vbo_save_vertex_list) - sizeof(Node));
1271 * Allocate space for a display list instruction. The space is basically
1272 * an array of Nodes where node[0] holds the opcode, node[1] is the first
1273 * function parameter, node[2] is the second parameter, etc.
1275 * \param opcode one of OPCODE_x
1276 * \param nparams number of function parameters
1277 * \return pointer to start of instruction space
1279 static inline Node *
1280 alloc_instruction(struct gl_context *ctx, OpCode opcode, GLuint nparams)
1282 return dlist_alloc(ctx, opcode, nparams * sizeof(Node), false);
1287 * Display List compilation functions
1290 save_Accum(GLenum op, GLfloat value)
1292 GET_CURRENT_CONTEXT(ctx);
1294 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1295 n = alloc_instruction(ctx, OPCODE_ACCUM, 2);
1300 if (ctx->ExecuteFlag) {
1301 CALL_Accum(ctx->Exec, (op, value));
1307 save_AlphaFunc(GLenum func, GLclampf ref)
1309 GET_CURRENT_CONTEXT(ctx);
1311 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1312 n = alloc_instruction(ctx, OPCODE_ALPHA_FUNC, 2);
1315 n[2].f = (GLfloat) ref;
1317 if (ctx->ExecuteFlag) {
1318 CALL_AlphaFunc(ctx->Exec, (func, ref));
1324 save_BindTexture(GLenum target, GLuint texture)
1326 GET_CURRENT_CONTEXT(ctx);
1328 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1329 n = alloc_instruction(ctx, OPCODE_BIND_TEXTURE, 2);
1334 if (ctx->ExecuteFlag) {
1335 CALL_BindTexture(ctx->Exec, (target, texture));
1341 save_Bitmap(GLsizei width, GLsizei height,
1342 GLfloat xorig, GLfloat yorig,
1343 GLfloat xmove, GLfloat ymove, const GLubyte * pixels)
1345 GET_CURRENT_CONTEXT(ctx);
1347 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1348 struct pipe_resource *tex =
1349 st_make_bitmap_texture(ctx, width, height, &ctx->Unpack, pixels);
1352 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glNewList -> glBitmap");
1356 n = alloc_instruction(ctx, OPCODE_BITMAP, 6 + POINTER_DWORDS);
1358 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glNewList -> glBitmap (3)");
1359 pipe_resource_reference(&tex, NULL);
1363 n[1].i = (GLint) width;
1364 n[2].i = (GLint) height;
1369 save_pointer(&n[7], tex);
1371 if (ctx->ExecuteFlag) {
1372 ASSERT_OUTSIDE_BEGIN_END(ctx);
1373 _mesa_bitmap(ctx, width, height, xorig, yorig, xmove, ymove, NULL, tex);
1379 save_BlendEquation(GLenum mode)
1381 GET_CURRENT_CONTEXT(ctx);
1383 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1384 n = alloc_instruction(ctx, OPCODE_BLEND_EQUATION, 1);
1388 if (ctx->ExecuteFlag) {
1389 CALL_BlendEquation(ctx->Exec, (mode));
1395 save_BlendEquationSeparate(GLenum modeRGB, GLenum modeA)
1397 GET_CURRENT_CONTEXT(ctx);
1399 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1400 n = alloc_instruction(ctx, OPCODE_BLEND_EQUATION_SEPARATE, 2);
1405 if (ctx->ExecuteFlag) {
1406 CALL_BlendEquationSeparate(ctx->Exec, (modeRGB, modeA));
1412 save_BlendFuncSeparate(GLenum sfactorRGB, GLenum dfactorRGB,
1413 GLenum sfactorA, GLenum dfactorA)
1415 GET_CURRENT_CONTEXT(ctx);
1417 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1418 n = alloc_instruction(ctx, OPCODE_BLEND_FUNC_SEPARATE, 4);
1420 n[1].e = sfactorRGB;
1421 n[2].e = dfactorRGB;
1425 if (ctx->ExecuteFlag) {
1426 CALL_BlendFuncSeparate(ctx->Exec,
1427 (sfactorRGB, dfactorRGB, sfactorA, dfactorA));
1433 save_BlendFunc(GLenum srcfactor, GLenum dstfactor)
1435 save_BlendFuncSeparate(srcfactor, dstfactor, srcfactor, dstfactor);
1440 save_BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
1442 GET_CURRENT_CONTEXT(ctx);
1444 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1445 n = alloc_instruction(ctx, OPCODE_BLEND_COLOR, 4);
1452 if (ctx->ExecuteFlag) {
1453 CALL_BlendColor(ctx->Exec, (red, green, blue, alpha));
1457 /* GL_ARB_draw_buffers_blend */
1459 save_BlendFuncSeparateiARB(GLuint buf, GLenum sfactorRGB, GLenum dfactorRGB,
1460 GLenum sfactorA, GLenum dfactorA)
1462 GET_CURRENT_CONTEXT(ctx);
1464 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1465 n = alloc_instruction(ctx, OPCODE_BLEND_FUNC_SEPARATE_I, 5);
1468 n[2].e = sfactorRGB;
1469 n[3].e = dfactorRGB;
1473 if (ctx->ExecuteFlag) {
1474 CALL_BlendFuncSeparateiARB(ctx->Exec, (buf, sfactorRGB, dfactorRGB,
1475 sfactorA, dfactorA));
1479 /* GL_ARB_draw_buffers_blend */
1481 save_BlendFunciARB(GLuint buf, GLenum sfactor, GLenum dfactor)
1483 GET_CURRENT_CONTEXT(ctx);
1485 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1486 n = alloc_instruction(ctx, OPCODE_BLEND_FUNC_I, 3);
1492 if (ctx->ExecuteFlag) {
1493 CALL_BlendFunciARB(ctx->Exec, (buf, sfactor, dfactor));
1497 /* GL_ARB_draw_buffers_blend */
1499 save_BlendEquationiARB(GLuint buf, GLenum mode)
1501 GET_CURRENT_CONTEXT(ctx);
1503 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1504 n = alloc_instruction(ctx, OPCODE_BLEND_EQUATION_I, 2);
1509 if (ctx->ExecuteFlag) {
1510 CALL_BlendEquationiARB(ctx->Exec, (buf, mode));
1514 /* GL_ARB_draw_buffers_blend */
1516 save_BlendEquationSeparateiARB(GLuint buf, GLenum modeRGB, GLenum modeA)
1518 GET_CURRENT_CONTEXT(ctx);
1520 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1521 n = alloc_instruction(ctx, OPCODE_BLEND_EQUATION_SEPARATE_I, 3);
1527 if (ctx->ExecuteFlag) {
1528 CALL_BlendEquationSeparateiARB(ctx->Exec, (buf, modeRGB, modeA));
1533 /* GL_ARB_draw_instanced. */
1535 save_DrawArraysInstancedARB(UNUSED GLenum mode,
1537 UNUSED GLsizei count,
1538 UNUSED GLsizei primcount)
1540 GET_CURRENT_CONTEXT(ctx);
1541 _mesa_error(ctx, GL_INVALID_OPERATION,
1542 "glDrawArraysInstanced() during display list compile");
1546 save_DrawElementsInstancedARB(UNUSED GLenum mode,
1547 UNUSED GLsizei count,
1549 UNUSED const GLvoid *indices,
1550 UNUSED GLsizei primcount)
1552 GET_CURRENT_CONTEXT(ctx);
1553 _mesa_error(ctx, GL_INVALID_OPERATION,
1554 "glDrawElementsInstanced() during display list compile");
1558 save_DrawElementsInstancedBaseVertex(UNUSED GLenum mode,
1559 UNUSED GLsizei count,
1561 UNUSED const GLvoid *indices,
1562 UNUSED GLsizei primcount,
1563 UNUSED GLint basevertex)
1565 GET_CURRENT_CONTEXT(ctx);
1566 _mesa_error(ctx, GL_INVALID_OPERATION,
1567 "glDrawElementsInstancedBaseVertex() during display list compile");
1570 /* GL_ARB_base_instance. */
1572 save_DrawArraysInstancedBaseInstance(UNUSED GLenum mode,
1574 UNUSED GLsizei count,
1575 UNUSED GLsizei primcount,
1576 UNUSED GLuint baseinstance)
1578 GET_CURRENT_CONTEXT(ctx);
1579 _mesa_error(ctx, GL_INVALID_OPERATION,
1580 "glDrawArraysInstancedBaseInstance() during display list compile");
1584 save_DrawElementsInstancedBaseInstance(UNUSED GLenum mode,
1585 UNUSED GLsizei count,
1587 UNUSED const void *indices,
1588 UNUSED GLsizei primcount,
1589 UNUSED GLuint baseinstance)
1591 GET_CURRENT_CONTEXT(ctx);
1592 _mesa_error(ctx, GL_INVALID_OPERATION,
1593 "glDrawElementsInstancedBaseInstance() during display list compile");
1597 save_DrawElementsInstancedBaseVertexBaseInstance(UNUSED GLenum mode,
1598 UNUSED GLsizei count,
1600 UNUSED const void *indices,
1601 UNUSED GLsizei primcount,
1602 UNUSED GLint basevertex,
1603 UNUSED GLuint baseinstance)
1605 GET_CURRENT_CONTEXT(ctx);
1606 _mesa_error(ctx, GL_INVALID_OPERATION,
1607 "glDrawElementsInstancedBaseVertexBaseInstance() during display list compile");
1611 save_DrawArraysIndirect(UNUSED GLenum mode,
1612 UNUSED const void *indirect)
1614 GET_CURRENT_CONTEXT(ctx);
1615 _mesa_error(ctx, GL_INVALID_OPERATION,
1616 "glDrawArraysIndirect() during display list compile");
1620 save_DrawElementsIndirect(UNUSED GLenum mode,
1622 UNUSED const void *indirect)
1624 GET_CURRENT_CONTEXT(ctx);
1625 _mesa_error(ctx, GL_INVALID_OPERATION,
1626 "glDrawElementsIndirect() during display list compile");
1630 save_MultiDrawArraysIndirect(UNUSED GLenum mode,
1631 UNUSED const void *indirect,
1632 UNUSED GLsizei primcount,
1633 UNUSED GLsizei stride)
1635 GET_CURRENT_CONTEXT(ctx);
1636 _mesa_error(ctx, GL_INVALID_OPERATION,
1637 "glMultiDrawArraysIndirect() during display list compile");
1641 save_MultiDrawElementsIndirect(UNUSED GLenum mode,
1643 UNUSED const void *indirect,
1644 UNUSED GLsizei primcount,
1645 UNUSED GLsizei stride)
1647 GET_CURRENT_CONTEXT(ctx);
1648 _mesa_error(ctx, GL_INVALID_OPERATION,
1649 "glMultiDrawElementsIndirect() during display list compile");
1653 * While building a display list we cache some OpenGL state.
1654 * Under some circumstances we need to invalidate that state (immediately
1655 * when we start compiling a list, or after glCallList(s)).
1658 invalidate_saved_current_state(struct gl_context *ctx)
1662 for (i = 0; i < VERT_ATTRIB_MAX; i++)
1663 ctx->ListState.ActiveAttribSize[i] = 0;
1665 for (i = 0; i < MAT_ATTRIB_MAX; i++)
1666 ctx->ListState.ActiveMaterialSize[i] = 0;
1668 /* Loopback usage applies recursively, so remember this state */
1669 bool use_loopback = ctx->ListState.Current.UseLoopback;
1670 memset(&ctx->ListState.Current, 0, sizeof ctx->ListState.Current);
1671 ctx->ListState.Current.UseLoopback = use_loopback;
1673 ctx->Driver.CurrentSavePrimitive = PRIM_UNKNOWN;
1677 static void GLAPIENTRY
1678 save_CallList(GLuint list)
1680 GET_CURRENT_CONTEXT(ctx);
1682 SAVE_FLUSH_VERTICES(ctx);
1684 n = alloc_instruction(ctx, OPCODE_CALL_LIST, 1);
1689 /* After this, we don't know what state we're in. Invalidate all
1690 * cached information previously gathered:
1692 invalidate_saved_current_state( ctx );
1694 if (ctx->ExecuteFlag) {
1695 _mesa_CallList(list);
1700 static void GLAPIENTRY
1701 save_CallLists(GLsizei num, GLenum type, const GLvoid * lists)
1703 GET_CURRENT_CONTEXT(ctx);
1708 SAVE_FLUSH_VERTICES(ctx);
1712 case GL_UNSIGNED_BYTE:
1716 case GL_UNSIGNED_SHORT:
1724 case GL_UNSIGNED_INT:
1733 if (num > 0 && type_size > 0) {
1734 /* create a copy of the array of list IDs to save in the display list */
1735 lists_copy = memdup(lists, num * type_size);
1740 n = alloc_instruction(ctx, OPCODE_CALL_LISTS, 2 + POINTER_DWORDS);
1744 save_pointer(&n[3], lists_copy);
1747 /* After this, we don't know what state we're in. Invalidate all
1748 * cached information previously gathered:
1750 invalidate_saved_current_state( ctx );
1752 if (ctx->ExecuteFlag) {
1753 CALL_CallLists(ctx->Exec, (num, type, lists));
1759 save_Clear(GLbitfield mask)
1761 GET_CURRENT_CONTEXT(ctx);
1763 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1764 n = alloc_instruction(ctx, OPCODE_CLEAR, 1);
1768 if (ctx->ExecuteFlag) {
1769 CALL_Clear(ctx->Exec, (mask));
1775 save_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
1777 GET_CURRENT_CONTEXT(ctx);
1779 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1780 n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_IV, 6);
1783 n[2].i = drawbuffer;
1785 if (buffer == GL_COLOR) {
1796 if (ctx->ExecuteFlag) {
1797 CALL_ClearBufferiv(ctx->Exec, (buffer, drawbuffer, value));
1803 save_ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
1805 GET_CURRENT_CONTEXT(ctx);
1807 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1808 n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_UIV, 6);
1811 n[2].i = drawbuffer;
1813 if (buffer == GL_COLOR) {
1824 if (ctx->ExecuteFlag) {
1825 CALL_ClearBufferuiv(ctx->Exec, (buffer, drawbuffer, value));
1831 save_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
1833 GET_CURRENT_CONTEXT(ctx);
1835 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1836 n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_FV, 6);
1839 n[2].i = drawbuffer;
1841 if (buffer == GL_COLOR) {
1852 if (ctx->ExecuteFlag) {
1853 CALL_ClearBufferfv(ctx->Exec, (buffer, drawbuffer, value));
1859 save_ClearBufferfi(GLenum buffer, GLint drawbuffer,
1860 GLfloat depth, GLint stencil)
1862 GET_CURRENT_CONTEXT(ctx);
1864 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1865 n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_FI, 4);
1868 n[2].i = drawbuffer;
1872 if (ctx->ExecuteFlag) {
1873 CALL_ClearBufferfi(ctx->Exec, (buffer, drawbuffer, depth, stencil));
1879 save_ClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
1881 GET_CURRENT_CONTEXT(ctx);
1883 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1884 n = alloc_instruction(ctx, OPCODE_CLEAR_ACCUM, 4);
1891 if (ctx->ExecuteFlag) {
1892 CALL_ClearAccum(ctx->Exec, (red, green, blue, alpha));
1898 save_ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
1900 GET_CURRENT_CONTEXT(ctx);
1902 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1903 n = alloc_instruction(ctx, OPCODE_CLEAR_COLOR, 4);
1910 if (ctx->ExecuteFlag) {
1911 CALL_ClearColor(ctx->Exec, (red, green, blue, alpha));
1917 save_ClearDepth(GLclampd depth)
1919 GET_CURRENT_CONTEXT(ctx);
1921 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1922 n = alloc_instruction(ctx, OPCODE_CLEAR_DEPTH, 1);
1924 n[1].f = (GLfloat) depth;
1926 if (ctx->ExecuteFlag) {
1927 CALL_ClearDepth(ctx->Exec, (depth));
1933 save_ClearIndex(GLfloat c)
1935 GET_CURRENT_CONTEXT(ctx);
1937 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1938 n = alloc_instruction(ctx, OPCODE_CLEAR_INDEX, 1);
1942 if (ctx->ExecuteFlag) {
1943 CALL_ClearIndex(ctx->Exec, (c));
1949 save_ClearStencil(GLint s)
1951 GET_CURRENT_CONTEXT(ctx);
1953 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1954 n = alloc_instruction(ctx, OPCODE_CLEAR_STENCIL, 1);
1958 if (ctx->ExecuteFlag) {
1959 CALL_ClearStencil(ctx->Exec, (s));
1965 save_ClipPlane(GLenum plane, const GLdouble * equ)
1967 GET_CURRENT_CONTEXT(ctx);
1969 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1970 n = alloc_instruction(ctx, OPCODE_CLIP_PLANE, 5);
1973 n[2].f = (GLfloat) equ[0];
1974 n[3].f = (GLfloat) equ[1];
1975 n[4].f = (GLfloat) equ[2];
1976 n[5].f = (GLfloat) equ[3];
1978 if (ctx->ExecuteFlag) {
1979 CALL_ClipPlane(ctx->Exec, (plane, equ));
1986 save_ColorMask(GLboolean red, GLboolean green,
1987 GLboolean blue, GLboolean alpha)
1989 GET_CURRENT_CONTEXT(ctx);
1991 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
1992 n = alloc_instruction(ctx, OPCODE_COLOR_MASK, 4);
1999 if (ctx->ExecuteFlag) {
2000 CALL_ColorMask(ctx->Exec, (red, green, blue, alpha));
2006 save_ColorMaski(GLuint buf, GLboolean red, GLboolean green,
2007 GLboolean blue, GLboolean alpha)
2009 GET_CURRENT_CONTEXT(ctx);
2011 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2012 n = alloc_instruction(ctx, OPCODE_COLOR_MASK_INDEXED, 5);
2020 if (ctx->ExecuteFlag) {
2021 /*CALL_ColorMaski(ctx->Exec, (buf, red, green, blue, alpha));*/
2027 save_ColorMaterial(GLenum face, GLenum mode)
2029 GET_CURRENT_CONTEXT(ctx);
2031 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2033 n = alloc_instruction(ctx, OPCODE_COLOR_MATERIAL, 2);
2038 if (ctx->ExecuteFlag) {
2039 CALL_ColorMaterial(ctx->Exec, (face, mode));
2045 save_CopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)
2047 GET_CURRENT_CONTEXT(ctx);
2049 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2050 n = alloc_instruction(ctx, OPCODE_COPY_PIXELS, 5);
2054 n[3].i = (GLint) width;
2055 n[4].i = (GLint) height;
2058 if (ctx->ExecuteFlag) {
2059 CALL_CopyPixels(ctx->Exec, (x, y, width, height, type));
2066 save_CopyTexImage1D(GLenum target, GLint level, GLenum internalformat,
2067 GLint x, GLint y, GLsizei width, GLint border)
2069 GET_CURRENT_CONTEXT(ctx);
2071 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2072 n = alloc_instruction(ctx, OPCODE_COPY_TEX_IMAGE1D, 7);
2076 n[3].e = internalformat;
2082 if (ctx->ExecuteFlag) {
2083 CALL_CopyTexImage1D(ctx->Exec, (target, level, internalformat,
2084 x, y, width, border));
2090 save_CopyTexImage2D(GLenum target, GLint level,
2091 GLenum internalformat,
2092 GLint x, GLint y, GLsizei width,
2093 GLsizei height, GLint border)
2095 GET_CURRENT_CONTEXT(ctx);
2097 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2098 n = alloc_instruction(ctx, OPCODE_COPY_TEX_IMAGE2D, 8);
2102 n[3].e = internalformat;
2109 if (ctx->ExecuteFlag) {
2110 CALL_CopyTexImage2D(ctx->Exec, (target, level, internalformat,
2111 x, y, width, height, border));
2118 save_CopyTexSubImage1D(GLenum target, GLint level,
2119 GLint xoffset, GLint x, GLint y, GLsizei width)
2121 GET_CURRENT_CONTEXT(ctx);
2123 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2124 n = alloc_instruction(ctx, OPCODE_COPY_TEX_SUB_IMAGE1D, 6);
2133 if (ctx->ExecuteFlag) {
2134 CALL_CopyTexSubImage1D(ctx->Exec,
2135 (target, level, xoffset, x, y, width));
2141 save_CopyTexSubImage2D(GLenum target, GLint level,
2142 GLint xoffset, GLint yoffset,
2143 GLint x, GLint y, GLsizei width, GLint height)
2145 GET_CURRENT_CONTEXT(ctx);
2147 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2148 n = alloc_instruction(ctx, OPCODE_COPY_TEX_SUB_IMAGE2D, 8);
2159 if (ctx->ExecuteFlag) {
2160 CALL_CopyTexSubImage2D(ctx->Exec, (target, level, xoffset, yoffset,
2161 x, y, width, height));
2167 save_CopyTexSubImage3D(GLenum target, GLint level,
2168 GLint xoffset, GLint yoffset, GLint zoffset,
2169 GLint x, GLint y, GLsizei width, GLint height)
2171 GET_CURRENT_CONTEXT(ctx);
2173 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2174 n = alloc_instruction(ctx, OPCODE_COPY_TEX_SUB_IMAGE3D, 9);
2186 if (ctx->ExecuteFlag) {
2187 CALL_CopyTexSubImage3D(ctx->Exec, (target, level,
2188 xoffset, yoffset, zoffset,
2189 x, y, width, height));
2195 save_CullFace(GLenum mode)
2197 GET_CURRENT_CONTEXT(ctx);
2199 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2200 n = alloc_instruction(ctx, OPCODE_CULL_FACE, 1);
2204 if (ctx->ExecuteFlag) {
2205 CALL_CullFace(ctx->Exec, (mode));
2211 save_DepthFunc(GLenum func)
2213 GET_CURRENT_CONTEXT(ctx);
2215 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2216 n = alloc_instruction(ctx, OPCODE_DEPTH_FUNC, 1);
2220 if (ctx->ExecuteFlag) {
2221 CALL_DepthFunc(ctx->Exec, (func));
2227 save_DepthMask(GLboolean mask)
2229 GET_CURRENT_CONTEXT(ctx);
2231 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2232 n = alloc_instruction(ctx, OPCODE_DEPTH_MASK, 1);
2236 if (ctx->ExecuteFlag) {
2237 CALL_DepthMask(ctx->Exec, (mask));
2243 save_DepthRange(GLclampd nearval, GLclampd farval)
2245 GET_CURRENT_CONTEXT(ctx);
2247 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2248 n = alloc_instruction(ctx, OPCODE_DEPTH_RANGE, 2);
2250 n[1].f = (GLfloat) nearval;
2251 n[2].f = (GLfloat) farval;
2253 if (ctx->ExecuteFlag) {
2254 CALL_DepthRange(ctx->Exec, (nearval, farval));
2260 save_Disable(GLenum cap)
2262 GET_CURRENT_CONTEXT(ctx);
2264 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2265 n = alloc_instruction(ctx, OPCODE_DISABLE, 1);
2269 if (ctx->ExecuteFlag) {
2270 CALL_Disable(ctx->Exec, (cap));
2276 save_Disablei(GLuint index, GLenum cap)
2278 GET_CURRENT_CONTEXT(ctx);
2280 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2281 n = alloc_instruction(ctx, OPCODE_DISABLE_INDEXED, 2);
2286 if (ctx->ExecuteFlag) {
2287 CALL_Disablei(ctx->Exec, (index, cap));
2293 save_DrawBuffer(GLenum mode)
2295 GET_CURRENT_CONTEXT(ctx);
2297 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2298 n = alloc_instruction(ctx, OPCODE_DRAW_BUFFER, 1);
2302 if (ctx->ExecuteFlag) {
2303 CALL_DrawBuffer(ctx->Exec, (mode));
2309 save_DrawPixels(GLsizei width, GLsizei height,
2310 GLenum format, GLenum type, const GLvoid * pixels)
2312 GET_CURRENT_CONTEXT(ctx);
2315 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2317 n = alloc_instruction(ctx, OPCODE_DRAW_PIXELS, 4 + POINTER_DWORDS);
2324 unpack_image(ctx, 2, width, height, 1, format, type,
2325 pixels, &ctx->Unpack));
2327 if (ctx->ExecuteFlag) {
2328 CALL_DrawPixels(ctx->Exec, (width, height, format, type, pixels));
2335 save_Enable(GLenum cap)
2337 GET_CURRENT_CONTEXT(ctx);
2339 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2340 n = alloc_instruction(ctx, OPCODE_ENABLE, 1);
2344 if (ctx->ExecuteFlag) {
2345 CALL_Enable(ctx->Exec, (cap));
2352 save_Enablei(GLuint index, GLenum cap)
2354 GET_CURRENT_CONTEXT(ctx);
2356 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2357 n = alloc_instruction(ctx, OPCODE_ENABLE_INDEXED, 2);
2362 if (ctx->ExecuteFlag) {
2363 CALL_Enablei(ctx->Exec, (index, cap));
2370 save_EvalMesh1(GLenum mode, GLint i1, GLint i2)
2372 GET_CURRENT_CONTEXT(ctx);
2374 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2375 n = alloc_instruction(ctx, OPCODE_EVALMESH1, 3);
2381 if (ctx->ExecuteFlag) {
2382 CALL_EvalMesh1(ctx->Exec, (mode, i1, i2));
2388 save_EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)
2390 GET_CURRENT_CONTEXT(ctx);
2392 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2393 n = alloc_instruction(ctx, OPCODE_EVALMESH2, 5);
2401 if (ctx->ExecuteFlag) {
2402 CALL_EvalMesh2(ctx->Exec, (mode, i1, i2, j1, j2));
2410 save_Fogfv(GLenum pname, const GLfloat *params)
2412 GET_CURRENT_CONTEXT(ctx);
2414 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2415 n = alloc_instruction(ctx, OPCODE_FOG, 5);
2423 if (ctx->ExecuteFlag) {
2424 CALL_Fogfv(ctx->Exec, (pname, params));
2430 save_Fogf(GLenum pname, GLfloat param)
2434 parray[1] = parray[2] = parray[3] = 0.0F;
2435 save_Fogfv(pname, parray);
2440 save_Fogiv(GLenum pname, const GLint *params)
2445 case GL_FOG_DENSITY:
2449 case GL_FOG_COORDINATE_SOURCE:
2450 p[0] = (GLfloat) *params;
2456 p[0] = INT_TO_FLOAT(params[0]);
2457 p[1] = INT_TO_FLOAT(params[1]);
2458 p[2] = INT_TO_FLOAT(params[2]);
2459 p[3] = INT_TO_FLOAT(params[3]);
2462 /* Error will be caught later in gl_Fogfv */
2463 ASSIGN_4V(p, 0.0F, 0.0F, 0.0F, 0.0F);
2465 save_Fogfv(pname, p);
2470 save_Fogi(GLenum pname, GLint param)
2474 parray[1] = parray[2] = parray[3] = 0;
2475 save_Fogiv(pname, parray);
2480 save_FrontFace(GLenum mode)
2482 GET_CURRENT_CONTEXT(ctx);
2484 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2485 n = alloc_instruction(ctx, OPCODE_FRONT_FACE, 1);
2489 if (ctx->ExecuteFlag) {
2490 CALL_FrontFace(ctx->Exec, (mode));
2496 save_Frustum(GLdouble left, GLdouble right,
2497 GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval)
2499 GET_CURRENT_CONTEXT(ctx);
2501 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2502 n = alloc_instruction(ctx, OPCODE_FRUSTUM, 6);
2504 n[1].f = (GLfloat) left;
2505 n[2].f = (GLfloat) right;
2506 n[3].f = (GLfloat) bottom;
2507 n[4].f = (GLfloat) top;
2508 n[5].f = (GLfloat) nearval;
2509 n[6].f = (GLfloat) farval;
2511 if (ctx->ExecuteFlag) {
2512 CALL_Frustum(ctx->Exec, (left, right, bottom, top, nearval, farval));
2518 save_Hint(GLenum target, GLenum mode)
2520 GET_CURRENT_CONTEXT(ctx);
2522 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2523 n = alloc_instruction(ctx, OPCODE_HINT, 2);
2528 if (ctx->ExecuteFlag) {
2529 CALL_Hint(ctx->Exec, (target, mode));
2535 save_IndexMask(GLuint mask)
2537 GET_CURRENT_CONTEXT(ctx);
2539 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2540 n = alloc_instruction(ctx, OPCODE_INDEX_MASK, 1);
2544 if (ctx->ExecuteFlag) {
2545 CALL_IndexMask(ctx->Exec, (mask));
2551 save_InitNames(void)
2553 GET_CURRENT_CONTEXT(ctx);
2554 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2555 (void) alloc_instruction(ctx, OPCODE_INIT_NAMES, 0);
2556 if (ctx->ExecuteFlag) {
2557 CALL_InitNames(ctx->Exec, ());
2563 save_Lightfv(GLenum light, GLenum pname, const GLfloat *params)
2565 GET_CURRENT_CONTEXT(ctx);
2567 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2568 n = alloc_instruction(ctx, OPCODE_LIGHT, 6);
2586 case GL_SPOT_DIRECTION:
2589 case GL_SPOT_EXPONENT:
2592 case GL_SPOT_CUTOFF:
2595 case GL_CONSTANT_ATTENUATION:
2598 case GL_LINEAR_ATTENUATION:
2601 case GL_QUADRATIC_ATTENUATION:
2607 for (i = 0; i < nParams; i++) {
2608 n[3 + i].f = params[i];
2611 if (ctx->ExecuteFlag) {
2612 CALL_Lightfv(ctx->Exec, (light, pname, params));
2618 save_Lightf(GLenum light, GLenum pname, GLfloat param)
2622 parray[1] = parray[2] = parray[3] = 0.0F;
2623 save_Lightfv(light, pname, parray);
2628 save_Lightiv(GLenum light, GLenum pname, const GLint *params)
2635 fparam[0] = INT_TO_FLOAT(params[0]);
2636 fparam[1] = INT_TO_FLOAT(params[1]);
2637 fparam[2] = INT_TO_FLOAT(params[2]);
2638 fparam[3] = INT_TO_FLOAT(params[3]);
2641 fparam[0] = (GLfloat) params[0];
2642 fparam[1] = (GLfloat) params[1];
2643 fparam[2] = (GLfloat) params[2];
2644 fparam[3] = (GLfloat) params[3];
2646 case GL_SPOT_DIRECTION:
2647 fparam[0] = (GLfloat) params[0];
2648 fparam[1] = (GLfloat) params[1];
2649 fparam[2] = (GLfloat) params[2];
2651 case GL_SPOT_EXPONENT:
2652 case GL_SPOT_CUTOFF:
2653 case GL_CONSTANT_ATTENUATION:
2654 case GL_LINEAR_ATTENUATION:
2655 case GL_QUADRATIC_ATTENUATION:
2656 fparam[0] = (GLfloat) params[0];
2659 /* error will be caught later in gl_Lightfv */
2662 save_Lightfv(light, pname, fparam);
2667 save_Lighti(GLenum light, GLenum pname, GLint param)
2671 parray[1] = parray[2] = parray[3] = 0;
2672 save_Lightiv(light, pname, parray);
2677 save_LightModelfv(GLenum pname, const GLfloat *params)
2679 GET_CURRENT_CONTEXT(ctx);
2681 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2682 n = alloc_instruction(ctx, OPCODE_LIGHT_MODEL, 5);
2690 if (ctx->ExecuteFlag) {
2691 CALL_LightModelfv(ctx->Exec, (pname, params));
2697 save_LightModelf(GLenum pname, GLfloat param)
2701 parray[1] = parray[2] = parray[3] = 0.0F;
2702 save_LightModelfv(pname, parray);
2707 save_LightModeliv(GLenum pname, const GLint *params)
2711 case GL_LIGHT_MODEL_AMBIENT:
2712 fparam[0] = INT_TO_FLOAT(params[0]);
2713 fparam[1] = INT_TO_FLOAT(params[1]);
2714 fparam[2] = INT_TO_FLOAT(params[2]);
2715 fparam[3] = INT_TO_FLOAT(params[3]);
2717 case GL_LIGHT_MODEL_LOCAL_VIEWER:
2718 case GL_LIGHT_MODEL_TWO_SIDE:
2719 case GL_LIGHT_MODEL_COLOR_CONTROL:
2720 fparam[0] = (GLfloat) params[0];
2726 /* Error will be caught later in gl_LightModelfv */
2727 ASSIGN_4V(fparam, 0.0F, 0.0F, 0.0F, 0.0F);
2729 save_LightModelfv(pname, fparam);
2734 save_LightModeli(GLenum pname, GLint param)
2738 parray[1] = parray[2] = parray[3] = 0;
2739 save_LightModeliv(pname, parray);
2744 save_LineStipple(GLint factor, GLushort pattern)
2746 GET_CURRENT_CONTEXT(ctx);
2748 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2749 n = alloc_instruction(ctx, OPCODE_LINE_STIPPLE, 2);
2754 if (ctx->ExecuteFlag) {
2755 CALL_LineStipple(ctx->Exec, (factor, pattern));
2761 save_LineWidth(GLfloat width)
2763 GET_CURRENT_CONTEXT(ctx);
2765 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2766 n = alloc_instruction(ctx, OPCODE_LINE_WIDTH, 1);
2770 if (ctx->ExecuteFlag) {
2771 CALL_LineWidth(ctx->Exec, (width));
2777 save_ListBase(GLuint base)
2779 GET_CURRENT_CONTEXT(ctx);
2781 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2782 n = alloc_instruction(ctx, OPCODE_LIST_BASE, 1);
2786 if (ctx->ExecuteFlag) {
2787 CALL_ListBase(ctx->Exec, (base));
2793 save_LoadIdentity(void)
2795 GET_CURRENT_CONTEXT(ctx);
2796 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2797 (void) alloc_instruction(ctx, OPCODE_LOAD_IDENTITY, 0);
2798 if (ctx->ExecuteFlag) {
2799 CALL_LoadIdentity(ctx->Exec, ());
2805 save_LoadMatrixf(const GLfloat * m)
2807 GET_CURRENT_CONTEXT(ctx);
2809 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2810 n = alloc_instruction(ctx, OPCODE_LOAD_MATRIX, 16);
2813 for (i = 0; i < 16; i++) {
2817 if (ctx->ExecuteFlag) {
2818 CALL_LoadMatrixf(ctx->Exec, (m));
2824 save_LoadMatrixd(const GLdouble * m)
2828 for (i = 0; i < 16; i++) {
2829 f[i] = (GLfloat) m[i];
2831 save_LoadMatrixf(f);
2836 save_LoadName(GLuint name)
2838 GET_CURRENT_CONTEXT(ctx);
2840 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2841 n = alloc_instruction(ctx, OPCODE_LOAD_NAME, 1);
2845 if (ctx->ExecuteFlag) {
2846 CALL_LoadName(ctx->Exec, (name));
2852 save_LogicOp(GLenum opcode)
2854 GET_CURRENT_CONTEXT(ctx);
2856 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2857 n = alloc_instruction(ctx, OPCODE_LOGIC_OP, 1);
2861 if (ctx->ExecuteFlag) {
2862 CALL_LogicOp(ctx->Exec, (opcode));
2868 save_Map1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride,
2869 GLint order, const GLdouble * points)
2871 GET_CURRENT_CONTEXT(ctx);
2873 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2874 n = alloc_instruction(ctx, OPCODE_MAP1, 5 + POINTER_DWORDS);
2876 GLfloat *pnts = _mesa_copy_map_points1d(target, stride, order, points);
2878 n[2].f = (GLfloat) u1;
2879 n[3].f = (GLfloat) u2;
2880 n[4].i = _mesa_evaluator_components(target); /* stride */
2882 save_pointer(&n[6], pnts);
2884 if (ctx->ExecuteFlag) {
2885 CALL_Map1d(ctx->Exec, (target, u1, u2, stride, order, points));
2890 save_Map1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride,
2891 GLint order, const GLfloat * points)
2893 GET_CURRENT_CONTEXT(ctx);
2895 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2896 n = alloc_instruction(ctx, OPCODE_MAP1, 5 + POINTER_DWORDS);
2898 GLfloat *pnts = _mesa_copy_map_points1f(target, stride, order, points);
2902 n[4].i = _mesa_evaluator_components(target); /* stride */
2904 save_pointer(&n[6], pnts);
2906 if (ctx->ExecuteFlag) {
2907 CALL_Map1f(ctx->Exec, (target, u1, u2, stride, order, points));
2913 save_Map2d(GLenum target,
2914 GLdouble u1, GLdouble u2, GLint ustride, GLint uorder,
2915 GLdouble v1, GLdouble v2, GLint vstride, GLint vorder,
2916 const GLdouble * points)
2918 GET_CURRENT_CONTEXT(ctx);
2920 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2921 n = alloc_instruction(ctx, OPCODE_MAP2, 9 + POINTER_DWORDS);
2923 GLfloat *pnts = _mesa_copy_map_points2d(target, ustride, uorder,
2924 vstride, vorder, points);
2926 n[2].f = (GLfloat) u1;
2927 n[3].f = (GLfloat) u2;
2928 n[4].f = (GLfloat) v1;
2929 n[5].f = (GLfloat) v2;
2930 /* XXX verify these strides are correct */
2931 n[6].i = _mesa_evaluator_components(target) * vorder; /*ustride */
2932 n[7].i = _mesa_evaluator_components(target); /*vstride */
2935 save_pointer(&n[10], pnts);
2937 if (ctx->ExecuteFlag) {
2938 CALL_Map2d(ctx->Exec, (target,
2939 u1, u2, ustride, uorder,
2940 v1, v2, vstride, vorder, points));
2946 save_Map2f(GLenum target,
2947 GLfloat u1, GLfloat u2, GLint ustride, GLint uorder,
2948 GLfloat v1, GLfloat v2, GLint vstride, GLint vorder,
2949 const GLfloat * points)
2951 GET_CURRENT_CONTEXT(ctx);
2953 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2954 n = alloc_instruction(ctx, OPCODE_MAP2, 9 + POINTER_DWORDS);
2956 GLfloat *pnts = _mesa_copy_map_points2f(target, ustride, uorder,
2957 vstride, vorder, points);
2963 /* XXX verify these strides are correct */
2964 n[6].i = _mesa_evaluator_components(target) * vorder; /*ustride */
2965 n[7].i = _mesa_evaluator_components(target); /*vstride */
2968 save_pointer(&n[10], pnts);
2970 if (ctx->ExecuteFlag) {
2971 CALL_Map2f(ctx->Exec, (target, u1, u2, ustride, uorder,
2972 v1, v2, vstride, vorder, points));
2978 save_MapGrid1f(GLint un, GLfloat u1, GLfloat u2)
2980 GET_CURRENT_CONTEXT(ctx);
2982 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
2983 n = alloc_instruction(ctx, OPCODE_MAPGRID1, 3);
2989 if (ctx->ExecuteFlag) {
2990 CALL_MapGrid1f(ctx->Exec, (un, u1, u2));
2996 save_MapGrid1d(GLint un, GLdouble u1, GLdouble u2)
2998 save_MapGrid1f(un, (GLfloat) u1, (GLfloat) u2);
3003 save_MapGrid2f(GLint un, GLfloat u1, GLfloat u2,
3004 GLint vn, GLfloat v1, GLfloat v2)
3006 GET_CURRENT_CONTEXT(ctx);
3008 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3009 n = alloc_instruction(ctx, OPCODE_MAPGRID2, 6);
3018 if (ctx->ExecuteFlag) {
3019 CALL_MapGrid2f(ctx->Exec, (un, u1, u2, vn, v1, v2));
3026 save_MapGrid2d(GLint un, GLdouble u1, GLdouble u2,
3027 GLint vn, GLdouble v1, GLdouble v2)
3029 save_MapGrid2f(un, (GLfloat) u1, (GLfloat) u2,
3030 vn, (GLfloat) v1, (GLfloat) v2);
3035 save_MatrixMode(GLenum mode)
3037 GET_CURRENT_CONTEXT(ctx);
3039 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3040 n = alloc_instruction(ctx, OPCODE_MATRIX_MODE, 1);
3044 if (ctx->ExecuteFlag) {
3045 CALL_MatrixMode(ctx->Exec, (mode));
3051 save_MultMatrixf(const GLfloat * m)
3053 GET_CURRENT_CONTEXT(ctx);
3055 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3056 n = alloc_instruction(ctx, OPCODE_MULT_MATRIX, 16);
3059 for (i = 0; i < 16; i++) {
3063 if (ctx->ExecuteFlag) {
3064 CALL_MultMatrixf(ctx->Exec, (m));
3070 save_MultMatrixd(const GLdouble * m)
3074 for (i = 0; i < 16; i++) {
3075 f[i] = (GLfloat) m[i];
3077 save_MultMatrixf(f);
3082 save_NewList(GLuint name, GLenum mode)
3084 GET_CURRENT_CONTEXT(ctx);
3085 /* It's an error to call this function while building a display list */
3086 _mesa_error(ctx, GL_INVALID_OPERATION, "glNewList");
3094 save_Ortho(GLdouble left, GLdouble right,
3095 GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval)
3097 GET_CURRENT_CONTEXT(ctx);
3099 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3100 n = alloc_instruction(ctx, OPCODE_ORTHO, 6);
3102 n[1].f = (GLfloat) left;
3103 n[2].f = (GLfloat) right;
3104 n[3].f = (GLfloat) bottom;
3105 n[4].f = (GLfloat) top;
3106 n[5].f = (GLfloat) nearval;
3107 n[6].f = (GLfloat) farval;
3109 if (ctx->ExecuteFlag) {
3110 CALL_Ortho(ctx->Exec, (left, right, bottom, top, nearval, farval));
3116 save_PatchParameteri(GLenum pname, const GLint value)
3118 GET_CURRENT_CONTEXT(ctx);
3120 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3121 n = alloc_instruction(ctx, OPCODE_PATCH_PARAMETER_I, 2);
3126 if (ctx->ExecuteFlag) {
3127 CALL_PatchParameteri(ctx->Exec, (pname, value));
3133 save_PatchParameterfv(GLenum pname, const GLfloat *params)
3135 GET_CURRENT_CONTEXT(ctx);
3137 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3139 if (pname == GL_PATCH_DEFAULT_OUTER_LEVEL) {
3140 n = alloc_instruction(ctx, OPCODE_PATCH_PARAMETER_FV_OUTER, 5);
3142 assert(pname == GL_PATCH_DEFAULT_INNER_LEVEL);
3143 n = alloc_instruction(ctx, OPCODE_PATCH_PARAMETER_FV_INNER, 3);
3147 if (pname == GL_PATCH_DEFAULT_OUTER_LEVEL) {
3157 if (ctx->ExecuteFlag) {
3158 CALL_PatchParameterfv(ctx->Exec, (pname, params));
3164 save_PixelMapfv(GLenum map, GLint mapsize, const GLfloat *values)
3166 GET_CURRENT_CONTEXT(ctx);
3168 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3169 n = alloc_instruction(ctx, OPCODE_PIXEL_MAP, 2 + POINTER_DWORDS);
3173 save_pointer(&n[3], memdup(values, mapsize * sizeof(GLfloat)));
3175 if (ctx->ExecuteFlag) {
3176 CALL_PixelMapfv(ctx->Exec, (map, mapsize, values));
3182 save_PixelMapuiv(GLenum map, GLint mapsize, const GLuint *values)
3184 GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
3186 if (map == GL_PIXEL_MAP_I_TO_I || map == GL_PIXEL_MAP_S_TO_S) {
3187 for (i = 0; i < mapsize; i++) {
3188 fvalues[i] = (GLfloat) values[i];
3192 for (i = 0; i < mapsize; i++) {
3193 fvalues[i] = UINT_TO_FLOAT(values[i]);
3196 save_PixelMapfv(map, mapsize, fvalues);
3201 save_PixelMapusv(GLenum map, GLint mapsize, const GLushort *values)
3203 GLfloat fvalues[MAX_PIXEL_MAP_TABLE];
3205 if (map == GL_PIXEL_MAP_I_TO_I || map == GL_PIXEL_MAP_S_TO_S) {
3206 for (i = 0; i < mapsize; i++) {
3207 fvalues[i] = (GLfloat) values[i];
3211 for (i = 0; i < mapsize; i++) {
3212 fvalues[i] = USHORT_TO_FLOAT(values[i]);
3215 save_PixelMapfv(map, mapsize, fvalues);
3220 save_PixelTransferf(GLenum pname, GLfloat param)
3222 GET_CURRENT_CONTEXT(ctx);
3224 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3225 n = alloc_instruction(ctx, OPCODE_PIXEL_TRANSFER, 2);
3230 if (ctx->ExecuteFlag) {
3231 CALL_PixelTransferf(ctx->Exec, (pname, param));
3237 save_PixelTransferi(GLenum pname, GLint param)
3239 save_PixelTransferf(pname, (GLfloat) param);
3244 save_PixelZoom(GLfloat xfactor, GLfloat yfactor)
3246 GET_CURRENT_CONTEXT(ctx);
3248 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3249 n = alloc_instruction(ctx, OPCODE_PIXEL_ZOOM, 2);
3254 if (ctx->ExecuteFlag) {
3255 CALL_PixelZoom(ctx->Exec, (xfactor, yfactor));
3261 save_PointParameterfv(GLenum pname, const GLfloat *params)
3263 GET_CURRENT_CONTEXT(ctx);
3265 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3266 n = alloc_instruction(ctx, OPCODE_POINT_PARAMETERS, 4);
3273 if (ctx->ExecuteFlag) {
3274 CALL_PointParameterfv(ctx->Exec, (pname, params));
3280 save_PointParameterf(GLenum pname, GLfloat param)
3284 parray[1] = parray[2] = 0.0F;
3285 save_PointParameterfv(pname, parray);
3289 save_PointParameteri(GLenum pname, GLint param)
3292 parray[0] = (GLfloat) param;
3293 parray[1] = parray[2] = 0.0F;
3294 save_PointParameterfv(pname, parray);
3298 save_PointParameteriv(GLenum pname, const GLint * param)
3301 parray[0] = (GLfloat) param[0];
3302 parray[1] = parray[2] = 0.0F;
3303 save_PointParameterfv(pname, parray);
3308 save_PointSize(GLfloat size)
3310 GET_CURRENT_CONTEXT(ctx);
3312 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3313 n = alloc_instruction(ctx, OPCODE_POINT_SIZE, 1);
3317 if (ctx->ExecuteFlag) {
3318 CALL_PointSize(ctx->Exec, (size));
3324 save_PolygonMode(GLenum face, GLenum mode)
3326 GET_CURRENT_CONTEXT(ctx);
3328 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3329 n = alloc_instruction(ctx, OPCODE_POLYGON_MODE, 2);
3334 if (ctx->ExecuteFlag) {
3335 CALL_PolygonMode(ctx->Exec, (face, mode));
3341 save_PolygonStipple(const GLubyte * pattern)
3343 GET_CURRENT_CONTEXT(ctx);
3346 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3348 n = alloc_instruction(ctx, OPCODE_POLYGON_STIPPLE, POINTER_DWORDS);
3351 unpack_image(ctx, 2, 32, 32, 1, GL_COLOR_INDEX, GL_BITMAP,
3352 pattern, &ctx->Unpack));
3354 if (ctx->ExecuteFlag) {
3355 CALL_PolygonStipple(ctx->Exec, ((GLubyte *) pattern));
3361 save_PolygonOffset(GLfloat factor, GLfloat units)
3363 GET_CURRENT_CONTEXT(ctx);
3365 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3366 n = alloc_instruction(ctx, OPCODE_POLYGON_OFFSET, 2);
3371 if (ctx->ExecuteFlag) {
3372 CALL_PolygonOffset(ctx->Exec, (factor, units));
3378 save_PolygonOffsetClampEXT(GLfloat factor, GLfloat units, GLfloat clamp)
3380 GET_CURRENT_CONTEXT(ctx);
3382 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3383 n = alloc_instruction(ctx, OPCODE_POLYGON_OFFSET_CLAMP, 3);
3389 if (ctx->ExecuteFlag) {
3390 CALL_PolygonOffsetClampEXT(ctx->Exec, (factor, units, clamp));
3395 save_PopAttrib(void)
3397 GET_CURRENT_CONTEXT(ctx);
3398 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3399 (void) alloc_instruction(ctx, OPCODE_POP_ATTRIB, 0);
3400 if (ctx->ExecuteFlag) {
3401 CALL_PopAttrib(ctx->Exec, ());
3407 save_PopMatrix(void)
3409 GET_CURRENT_CONTEXT(ctx);
3410 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3411 (void) alloc_instruction(ctx, OPCODE_POP_MATRIX, 0);
3412 if (ctx->ExecuteFlag) {
3413 CALL_PopMatrix(ctx->Exec, ());
3421 GET_CURRENT_CONTEXT(ctx);
3422 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3423 (void) alloc_instruction(ctx, OPCODE_POP_NAME, 0);
3424 if (ctx->ExecuteFlag) {
3425 CALL_PopName(ctx->Exec, ());
3431 save_PrioritizeTextures(GLsizei num, const GLuint * textures,
3432 const GLclampf * priorities)
3434 GET_CURRENT_CONTEXT(ctx);
3436 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3438 for (i = 0; i < num; i++) {
3440 n = alloc_instruction(ctx, OPCODE_PRIORITIZE_TEXTURE, 2);
3442 n[1].ui = textures[i];
3443 n[2].f = priorities[i];
3446 if (ctx->ExecuteFlag) {
3447 CALL_PrioritizeTextures(ctx->Exec, (num, textures, priorities));
3453 save_PushAttrib(GLbitfield mask)
3455 GET_CURRENT_CONTEXT(ctx);
3457 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3458 n = alloc_instruction(ctx, OPCODE_PUSH_ATTRIB, 1);
3462 if (ctx->ExecuteFlag) {
3463 CALL_PushAttrib(ctx->Exec, (mask));
3469 save_PushMatrix(void)
3471 GET_CURRENT_CONTEXT(ctx);
3472 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3473 (void) alloc_instruction(ctx, OPCODE_PUSH_MATRIX, 0);
3474 if (ctx->ExecuteFlag) {
3475 CALL_PushMatrix(ctx->Exec, ());
3481 save_PushName(GLuint name)
3483 GET_CURRENT_CONTEXT(ctx);
3485 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3486 n = alloc_instruction(ctx, OPCODE_PUSH_NAME, 1);
3490 if (ctx->ExecuteFlag) {
3491 CALL_PushName(ctx->Exec, (name));
3497 save_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
3499 GET_CURRENT_CONTEXT(ctx);
3501 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3502 n = alloc_instruction(ctx, OPCODE_RASTER_POS, 4);
3509 if (ctx->ExecuteFlag) {
3510 CALL_RasterPos4f(ctx->Exec, (x, y, z, w));
3515 save_RasterPos2d(GLdouble x, GLdouble y)
3517 save_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
3521 save_RasterPos2f(GLfloat x, GLfloat y)
3523 save_RasterPos4f(x, y, 0.0F, 1.0F);
3527 save_RasterPos2i(GLint x, GLint y)
3529 save_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
3533 save_RasterPos2s(GLshort x, GLshort y)
3535 save_RasterPos4f(x, y, 0.0F, 1.0F);
3539 save_RasterPos3d(GLdouble x, GLdouble y, GLdouble z)
3541 save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
3545 save_RasterPos3f(GLfloat x, GLfloat y, GLfloat z)
3547 save_RasterPos4f(x, y, z, 1.0F);
3551 save_RasterPos3i(GLint x, GLint y, GLint z)
3553 save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
3557 save_RasterPos3s(GLshort x, GLshort y, GLshort z)
3559 save_RasterPos4f(x, y, z, 1.0F);
3563 save_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
3565 save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
3569 save_RasterPos4i(GLint x, GLint y, GLint z, GLint w)
3571 save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
3575 save_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w)
3577 save_RasterPos4f(x, y, z, w);
3581 save_RasterPos2dv(const GLdouble * v)
3583 save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
3587 save_RasterPos2fv(const GLfloat * v)
3589 save_RasterPos4f(v[0], v[1], 0.0F, 1.0F);
3593 save_RasterPos2iv(const GLint * v)
3595 save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
3599 save_RasterPos2sv(const GLshort * v)
3601 save_RasterPos4f(v[0], v[1], 0.0F, 1.0F);
3605 save_RasterPos3dv(const GLdouble * v)
3607 save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
3611 save_RasterPos3fv(const GLfloat * v)
3613 save_RasterPos4f(v[0], v[1], v[2], 1.0F);
3617 save_RasterPos3iv(const GLint * v)
3619 save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
3623 save_RasterPos3sv(const GLshort * v)
3625 save_RasterPos4f(v[0], v[1], v[2], 1.0F);
3629 save_RasterPos4dv(const GLdouble * v)
3631 save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1],
3632 (GLfloat) v[2], (GLfloat) v[3]);
3636 save_RasterPos4fv(const GLfloat * v)
3638 save_RasterPos4f(v[0], v[1], v[2], v[3]);
3642 save_RasterPos4iv(const GLint * v)
3644 save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1],
3645 (GLfloat) v[2], (GLfloat) v[3]);
3649 save_RasterPos4sv(const GLshort * v)
3651 save_RasterPos4f(v[0], v[1], v[2], v[3]);
3656 save_PassThrough(GLfloat token)
3658 GET_CURRENT_CONTEXT(ctx);
3660 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3661 n = alloc_instruction(ctx, OPCODE_PASSTHROUGH, 1);
3665 if (ctx->ExecuteFlag) {
3666 CALL_PassThrough(ctx->Exec, (token));
3672 save_ReadBuffer(GLenum mode)
3674 GET_CURRENT_CONTEXT(ctx);
3676 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3677 n = alloc_instruction(ctx, OPCODE_READ_BUFFER, 1);
3681 if (ctx->ExecuteFlag) {
3682 CALL_ReadBuffer(ctx->Exec, (mode));
3688 save_Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
3690 GET_CURRENT_CONTEXT(ctx);
3692 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3693 n = alloc_instruction(ctx, OPCODE_ROTATE, 4);
3700 if (ctx->ExecuteFlag) {
3701 CALL_Rotatef(ctx->Exec, (angle, x, y, z));
3707 save_Rotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
3709 save_Rotatef((GLfloat) angle, (GLfloat) x, (GLfloat) y, (GLfloat) z);
3714 save_Scalef(GLfloat x, GLfloat y, GLfloat z)
3716 GET_CURRENT_CONTEXT(ctx);
3718 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3719 n = alloc_instruction(ctx, OPCODE_SCALE, 3);
3725 if (ctx->ExecuteFlag) {
3726 CALL_Scalef(ctx->Exec, (x, y, z));
3732 save_Scaled(GLdouble x, GLdouble y, GLdouble z)
3734 save_Scalef((GLfloat) x, (GLfloat) y, (GLfloat) z);
3739 save_Scissor(GLint x, GLint y, GLsizei width, GLsizei height)
3741 GET_CURRENT_CONTEXT(ctx);
3743 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3744 n = alloc_instruction(ctx, OPCODE_SCISSOR, 4);
3751 if (ctx->ExecuteFlag) {
3752 CALL_Scissor(ctx->Exec, (x, y, width, height));
3758 save_ShadeModel(GLenum mode)
3760 GET_CURRENT_CONTEXT(ctx);
3762 ASSERT_OUTSIDE_SAVE_BEGIN_END(ctx);
3764 if (ctx->ExecuteFlag) {
3765 CALL_ShadeModel(ctx->Exec, (mode));
3768 /* Don't compile this call if it's a no-op.
3769 * By avoiding this state change we have a better chance of
3770 * coalescing subsequent drawing commands into one batch.
3772 if (ctx->ListState.Current.ShadeModel == mode)
3775 SAVE_FLUSH_VERTICES(ctx);
3777 ctx->ListState.Current.ShadeModel = mode;
3779 n = alloc_instruction(ctx, OPCODE_SHADE_MODEL, 1);
3787 save_StencilFunc(GLenum func, GLint ref, GLuint mask)
3789 GET_CURRENT_CONTEXT(ctx);
3791 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3792 n = alloc_instruction(ctx, OPCODE_STENCIL_FUNC, 3);
3798 if (ctx->ExecuteFlag) {
3799 CALL_StencilFunc(ctx->Exec, (func, ref, mask));
3805 save_StencilMask(GLuint mask)
3807 GET_CURRENT_CONTEXT(ctx);
3809 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3810 n = alloc_instruction(ctx, OPCODE_STENCIL_MASK, 1);
3814 if (ctx->ExecuteFlag) {
3815 CALL_StencilMask(ctx->Exec, (mask));
3821 save_StencilOp(GLenum fail, GLenum zfail, GLenum zpass)
3823 GET_CURRENT_CONTEXT(ctx);
3825 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3826 n = alloc_instruction(ctx, OPCODE_STENCIL_OP, 3);
3832 if (ctx->ExecuteFlag) {
3833 CALL_StencilOp(ctx->Exec, (fail, zfail, zpass));
3839 save_StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask)
3841 GET_CURRENT_CONTEXT(ctx);
3843 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3844 n = alloc_instruction(ctx, OPCODE_STENCIL_FUNC_SEPARATE, 4);
3851 if (ctx->ExecuteFlag) {
3852 CALL_StencilFuncSeparate(ctx->Exec, (face, func, ref, mask));
3858 save_StencilFuncSeparateATI(GLenum frontfunc, GLenum backfunc, GLint ref,
3861 GET_CURRENT_CONTEXT(ctx);
3863 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3865 n = alloc_instruction(ctx, OPCODE_STENCIL_FUNC_SEPARATE, 4);
3873 n = alloc_instruction(ctx, OPCODE_STENCIL_FUNC_SEPARATE, 4);
3880 if (ctx->ExecuteFlag) {
3881 CALL_StencilFuncSeparate(ctx->Exec, (GL_FRONT, frontfunc, ref, mask));
3882 CALL_StencilFuncSeparate(ctx->Exec, (GL_BACK, backfunc, ref, mask));
3888 save_StencilMaskSeparate(GLenum face, GLuint mask)
3890 GET_CURRENT_CONTEXT(ctx);
3892 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3893 n = alloc_instruction(ctx, OPCODE_STENCIL_MASK_SEPARATE, 2);
3898 if (ctx->ExecuteFlag) {
3899 CALL_StencilMaskSeparate(ctx->Exec, (face, mask));
3905 save_StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
3907 GET_CURRENT_CONTEXT(ctx);
3909 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3910 n = alloc_instruction(ctx, OPCODE_STENCIL_OP_SEPARATE, 4);
3917 if (ctx->ExecuteFlag) {
3918 CALL_StencilOpSeparate(ctx->Exec, (face, fail, zfail, zpass));
3924 save_TexEnvfv(GLenum target, GLenum pname, const GLfloat *params)
3926 GET_CURRENT_CONTEXT(ctx);
3928 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3929 n = alloc_instruction(ctx, OPCODE_TEXENV, 6);
3933 if (pname == GL_TEXTURE_ENV_COLOR) {
3941 n[4].f = n[5].f = n[6].f = 0.0F;
3944 if (ctx->ExecuteFlag) {
3945 CALL_TexEnvfv(ctx->Exec, (target, pname, params));
3951 save_TexEnvf(GLenum target, GLenum pname, GLfloat param)
3954 parray[0] = (GLfloat) param;
3955 parray[1] = parray[2] = parray[3] = 0.0F;
3956 save_TexEnvfv(target, pname, parray);
3961 save_TexEnvi(GLenum target, GLenum pname, GLint param)
3964 p[0] = (GLfloat) param;
3965 p[1] = p[2] = p[3] = 0.0F;
3966 save_TexEnvfv(target, pname, p);
3971 save_TexEnviv(GLenum target, GLenum pname, const GLint * param)
3974 if (pname == GL_TEXTURE_ENV_COLOR) {
3975 p[0] = INT_TO_FLOAT(param[0]);
3976 p[1] = INT_TO_FLOAT(param[1]);
3977 p[2] = INT_TO_FLOAT(param[2]);
3978 p[3] = INT_TO_FLOAT(param[3]);
3981 p[0] = (GLfloat) param[0];
3982 p[1] = p[2] = p[3] = 0.0F;
3984 save_TexEnvfv(target, pname, p);
3989 save_TexGenfv(GLenum coord, GLenum pname, const GLfloat *params)
3991 GET_CURRENT_CONTEXT(ctx);
3993 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
3994 n = alloc_instruction(ctx, OPCODE_TEXGEN, 6);
4003 if (ctx->ExecuteFlag) {
4004 CALL_TexGenfv(ctx->Exec, (coord, pname, params));
4010 save_TexGeniv(GLenum coord, GLenum pname, const GLint *params)
4013 p[0] = (GLfloat) params[0];
4014 p[1] = (GLfloat) params[1];
4015 p[2] = (GLfloat) params[2];
4016 p[3] = (GLfloat) params[3];
4017 save_TexGenfv(coord, pname, p);
4022 save_TexGend(GLenum coord, GLenum pname, GLdouble param)
4025 parray[0] = (GLfloat) param;
4026 parray[1] = parray[2] = parray[3] = 0.0F;
4027 save_TexGenfv(coord, pname, parray);
4032 save_TexGendv(GLenum coord, GLenum pname, const GLdouble *params)
4035 p[0] = (GLfloat) params[0];
4036 p[1] = (GLfloat) params[1];
4037 p[2] = (GLfloat) params[2];
4038 p[3] = (GLfloat) params[3];
4039 save_TexGenfv(coord, pname, p);
4044 save_TexGenf(GLenum coord, GLenum pname, GLfloat param)
4048 parray[1] = parray[2] = parray[3] = 0.0F;
4049 save_TexGenfv(coord, pname, parray);
4054 save_TexGeni(GLenum coord, GLenum pname, GLint param)
4058 parray[1] = parray[2] = parray[3] = 0;
4059 save_TexGeniv(coord, pname, parray);
4064 save_TexParameterfv(GLenum target, GLenum pname, const GLfloat *params)
4066 GET_CURRENT_CONTEXT(ctx);
4068 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4069 n = alloc_instruction(ctx, OPCODE_TEXPARAMETER, 6);
4078 if (ctx->ExecuteFlag) {
4079 CALL_TexParameterfv(ctx->Exec, (target, pname, params));
4085 save_TexParameterf(GLenum target, GLenum pname, GLfloat param)
4089 parray[1] = parray[2] = parray[3] = 0.0F;
4090 save_TexParameterfv(target, pname, parray);
4095 save_TexParameteri(GLenum target, GLenum pname, GLint param)
4098 fparam[0] = (GLfloat) param;
4099 fparam[1] = fparam[2] = fparam[3] = 0.0F;
4100 save_TexParameterfv(target, pname, fparam);
4105 save_TexParameteriv(GLenum target, GLenum pname, const GLint *params)
4108 fparam[0] = (GLfloat) params[0];
4109 fparam[1] = fparam[2] = fparam[3] = 0.0F;
4110 save_TexParameterfv(target, pname, fparam);
4115 save_TexImage1D(GLenum target,
4116 GLint level, GLint components,
4117 GLsizei width, GLint border,
4118 GLenum format, GLenum type, const GLvoid * pixels)
4120 GET_CURRENT_CONTEXT(ctx);
4121 if (target == GL_PROXY_TEXTURE_1D) {
4122 /* don't compile, execute immediately */
4123 CALL_TexImage1D(ctx->Exec, (target, level, components, width,
4124 border, format, type, pixels));
4128 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4129 n = alloc_instruction(ctx, OPCODE_TEX_IMAGE1D, 7 + POINTER_DWORDS);
4133 n[3].i = components;
4134 n[4].i = (GLint) width;
4139 unpack_image(ctx, 1, width, 1, 1, format, type,
4140 pixels, &ctx->Unpack));
4142 if (ctx->ExecuteFlag) {
4143 CALL_TexImage1D(ctx->Exec, (target, level, components, width,
4144 border, format, type, pixels));
4151 save_TexImage2D(GLenum target,
4152 GLint level, GLint components,
4153 GLsizei width, GLsizei height, GLint border,
4154 GLenum format, GLenum type, const GLvoid * pixels)
4156 GET_CURRENT_CONTEXT(ctx);
4157 if (target == GL_PROXY_TEXTURE_2D) {
4158 /* don't compile, execute immediately */
4159 CALL_TexImage2D(ctx->Exec, (target, level, components, width,
4160 height, border, format, type, pixels));
4164 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4165 n = alloc_instruction(ctx, OPCODE_TEX_IMAGE2D, 8 + POINTER_DWORDS);
4169 n[3].i = components;
4170 n[4].i = (GLint) width;
4171 n[5].i = (GLint) height;
4176 unpack_image(ctx, 2, width, height, 1, format, type,
4177 pixels, &ctx->Unpack));
4179 if (ctx->ExecuteFlag) {
4180 CALL_TexImage2D(ctx->Exec, (target, level, components, width,
4181 height, border, format, type, pixels));
4188 save_TexImage3D(GLenum target,
4189 GLint level, GLint internalFormat,
4190 GLsizei width, GLsizei height, GLsizei depth,
4192 GLenum format, GLenum type, const GLvoid * pixels)
4194 GET_CURRENT_CONTEXT(ctx);
4195 if (target == GL_PROXY_TEXTURE_3D) {
4196 /* don't compile, execute immediately */
4197 CALL_TexImage3D(ctx->Exec, (target, level, internalFormat, width,
4198 height, depth, border, format, type,
4203 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4204 n = alloc_instruction(ctx, OPCODE_TEX_IMAGE3D, 9 + POINTER_DWORDS);
4208 n[3].i = (GLint) internalFormat;
4209 n[4].i = (GLint) width;
4210 n[5].i = (GLint) height;
4211 n[6].i = (GLint) depth;
4215 save_pointer(&n[10],
4216 unpack_image(ctx, 3, width, height, depth, format, type,
4217 pixels, &ctx->Unpack));
4219 if (ctx->ExecuteFlag) {
4220 CALL_TexImage3D(ctx->Exec, (target, level, internalFormat, width,
4221 height, depth, border, format, type,
4229 save_TexSubImage1D(GLenum target, GLint level, GLint xoffset,
4230 GLsizei width, GLenum format, GLenum type,
4231 const GLvoid * pixels)
4233 GET_CURRENT_CONTEXT(ctx);
4236 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4238 n = alloc_instruction(ctx, OPCODE_TEX_SUB_IMAGE1D, 6 + POINTER_DWORDS);
4243 n[4].i = (GLint) width;
4247 unpack_image(ctx, 1, width, 1, 1, format, type,
4248 pixels, &ctx->Unpack));
4250 if (ctx->ExecuteFlag) {
4251 CALL_TexSubImage1D(ctx->Exec, (target, level, xoffset, width,
4252 format, type, pixels));
4258 save_TexSubImage2D(GLenum target, GLint level,
4259 GLint xoffset, GLint yoffset,
4260 GLsizei width, GLsizei height,
4261 GLenum format, GLenum type, const GLvoid * pixels)
4263 GET_CURRENT_CONTEXT(ctx);
4266 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4268 n = alloc_instruction(ctx, OPCODE_TEX_SUB_IMAGE2D, 8 + POINTER_DWORDS);
4274 n[5].i = (GLint) width;
4275 n[6].i = (GLint) height;
4279 unpack_image(ctx, 2, width, height, 1, format, type,
4280 pixels, &ctx->Unpack));
4282 if (ctx->ExecuteFlag) {
4283 CALL_TexSubImage2D(ctx->Exec, (target, level, xoffset, yoffset,
4284 width, height, format, type, pixels));
4290 save_TexSubImage3D(GLenum target, GLint level,
4291 GLint xoffset, GLint yoffset, GLint zoffset,
4292 GLsizei width, GLsizei height, GLsizei depth,
4293 GLenum format, GLenum type, const GLvoid * pixels)
4295 GET_CURRENT_CONTEXT(ctx);
4298 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4300 n = alloc_instruction(ctx, OPCODE_TEX_SUB_IMAGE3D, 10 + POINTER_DWORDS);
4307 n[6].i = (GLint) width;
4308 n[7].i = (GLint) height;
4309 n[8].i = (GLint) depth;
4312 save_pointer(&n[11],
4313 unpack_image(ctx, 3, width, height, depth, format, type,
4314 pixels, &ctx->Unpack));
4316 if (ctx->ExecuteFlag) {
4317 CALL_TexSubImage3D(ctx->Exec, (target, level,
4318 xoffset, yoffset, zoffset,
4319 width, height, depth, format, type,
4326 save_Translatef(GLfloat x, GLfloat y, GLfloat z)
4328 GET_CURRENT_CONTEXT(ctx);
4330 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4331 n = alloc_instruction(ctx, OPCODE_TRANSLATE, 3);
4337 if (ctx->ExecuteFlag) {
4338 CALL_Translatef(ctx->Exec, (x, y, z));
4344 save_Translated(GLdouble x, GLdouble y, GLdouble z)
4346 save_Translatef((GLfloat) x, (GLfloat) y, (GLfloat) z);
4352 save_Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
4354 GET_CURRENT_CONTEXT(ctx);
4356 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4357 n = alloc_instruction(ctx, OPCODE_VIEWPORT, 4);
4361 n[3].i = (GLint) width;
4362 n[4].i = (GLint) height;
4364 if (ctx->ExecuteFlag) {
4365 CALL_Viewport(ctx->Exec, (x, y, width, height));
4370 save_ViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat width,
4373 GET_CURRENT_CONTEXT(ctx);
4375 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4376 n = alloc_instruction(ctx, OPCODE_VIEWPORT_INDEXED_F, 5);
4384 if (ctx->ExecuteFlag) {
4385 CALL_ViewportIndexedf(ctx->Exec, (index, x, y, width, height));
4390 save_ViewportIndexedfv(GLuint index, const GLfloat *v)
4392 GET_CURRENT_CONTEXT(ctx);
4394 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4395 n = alloc_instruction(ctx, OPCODE_VIEWPORT_INDEXED_FV, 5);
4403 if (ctx->ExecuteFlag) {
4404 CALL_ViewportIndexedfv(ctx->Exec, (index, v));
4409 save_ViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
4411 GET_CURRENT_CONTEXT(ctx);
4413 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4414 n = alloc_instruction(ctx, OPCODE_VIEWPORT_ARRAY_V, 2 + POINTER_DWORDS);
4418 save_pointer(&n[3], memdup(v, count * 4 * sizeof(GLfloat)));
4420 if (ctx->ExecuteFlag) {
4421 CALL_ViewportArrayv(ctx->Exec, (first, count, v));
4426 save_ScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width,
4429 GET_CURRENT_CONTEXT(ctx);
4431 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4432 n = alloc_instruction(ctx, OPCODE_SCISSOR_INDEXED, 5);
4440 if (ctx->ExecuteFlag) {
4441 CALL_ScissorIndexed(ctx->Exec, (index, left, bottom, width, height));
4446 save_ScissorIndexedv(GLuint index, const GLint *v)
4448 GET_CURRENT_CONTEXT(ctx);
4450 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4451 n = alloc_instruction(ctx, OPCODE_SCISSOR_INDEXED_V, 5);
4459 if (ctx->ExecuteFlag) {
4460 CALL_ScissorIndexedv(ctx->Exec, (index, v));
4465 save_ScissorArrayv(GLuint first, GLsizei count, const GLint *v)
4467 GET_CURRENT_CONTEXT(ctx);
4469 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4470 n = alloc_instruction(ctx, OPCODE_SCISSOR_ARRAY_V, 2 + POINTER_DWORDS);
4474 save_pointer(&n[3], memdup(v, count * 4 * sizeof(GLint)));
4476 if (ctx->ExecuteFlag) {
4477 CALL_ScissorArrayv(ctx->Exec, (first, count, v));
4482 save_DepthRangeIndexed(GLuint index, GLclampd n, GLclampd f)
4484 GET_CURRENT_CONTEXT(ctx);
4486 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4487 node = alloc_instruction(ctx, OPCODE_DEPTH_INDEXED, 3);
4490 /* Mesa stores these as floats internally so we deliberately convert
4491 * them to a float here.
4496 if (ctx->ExecuteFlag) {
4497 CALL_DepthRangeIndexed(ctx->Exec, (index, n, f));
4502 save_DepthRangeArrayv(GLuint first, GLsizei count, const GLclampd *v)
4504 GET_CURRENT_CONTEXT(ctx);
4506 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4507 n = alloc_instruction(ctx, OPCODE_DEPTH_ARRAY_V, 2 + POINTER_DWORDS);
4511 save_pointer(&n[3], memdup(v, count * 2 * sizeof(GLclampd)));
4513 if (ctx->ExecuteFlag) {
4514 CALL_DepthRangeArrayv(ctx->Exec, (first, count, v));
4519 save_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
4521 GET_CURRENT_CONTEXT(ctx);
4523 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4524 n = alloc_instruction(ctx, OPCODE_WINDOW_POS, 4);
4531 if (ctx->ExecuteFlag) {
4532 CALL_WindowPos4fMESA(ctx->Exec, (x, y, z, w));
4537 save_WindowPos2d(GLdouble x, GLdouble y)
4539 save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
4543 save_WindowPos2f(GLfloat x, GLfloat y)
4545 save_WindowPos4fMESA(x, y, 0.0F, 1.0F);
4549 save_WindowPos2i(GLint x, GLint y)
4551 save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, 0.0F, 1.0F);
4555 save_WindowPos2s(GLshort x, GLshort y)
4557 save_WindowPos4fMESA(x, y, 0.0F, 1.0F);
4561 save_WindowPos3d(GLdouble x, GLdouble y, GLdouble z)
4563 save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
4567 save_WindowPos3f(GLfloat x, GLfloat y, GLfloat z)
4569 save_WindowPos4fMESA(x, y, z, 1.0F);
4573 save_WindowPos3i(GLint x, GLint y, GLint z)
4575 save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
4579 save_WindowPos3s(GLshort x, GLshort y, GLshort z)
4581 save_WindowPos4fMESA(x, y, z, 1.0F);
4585 save_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
4587 save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
4591 save_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w)
4593 save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
4597 save_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w)
4599 save_WindowPos4fMESA(x, y, z, w);
4603 save_WindowPos2dv(const GLdouble * v)
4605 save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
4609 save_WindowPos2fv(const GLfloat * v)
4611 save_WindowPos4fMESA(v[0], v[1], 0.0F, 1.0F);
4615 save_WindowPos2iv(const GLint * v)
4617 save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F);
4621 save_WindowPos2sv(const GLshort * v)
4623 save_WindowPos4fMESA(v[0], v[1], 0.0F, 1.0F);
4627 save_WindowPos3dv(const GLdouble * v)
4629 save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
4633 save_WindowPos3fv(const GLfloat * v)
4635 save_WindowPos4fMESA(v[0], v[1], v[2], 1.0F);
4639 save_WindowPos3iv(const GLint * v)
4641 save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F);
4645 save_WindowPos3sv(const GLshort * v)
4647 save_WindowPos4fMESA(v[0], v[1], v[2], 1.0F);
4651 save_WindowPos4dvMESA(const GLdouble * v)
4653 save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1],
4654 (GLfloat) v[2], (GLfloat) v[3]);
4658 save_WindowPos4fvMESA(const GLfloat * v)
4660 save_WindowPos4fMESA(v[0], v[1], v[2], v[3]);
4664 save_WindowPos4ivMESA(const GLint * v)
4666 save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1],
4667 (GLfloat) v[2], (GLfloat) v[3]);
4671 save_WindowPos4svMESA(const GLshort * v)
4673 save_WindowPos4fMESA(v[0], v[1], v[2], v[3]);
4678 /* GL_ARB_multitexture */
4680 save_ActiveTexture(GLenum target)
4682 GET_CURRENT_CONTEXT(ctx);
4684 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4685 n = alloc_instruction(ctx, OPCODE_ACTIVE_TEXTURE, 1);
4689 if (ctx->ExecuteFlag) {
4690 CALL_ActiveTexture(ctx->Exec, (target));
4695 /* GL_ARB_transpose_matrix */
4698 save_LoadTransposeMatrixd(const GLdouble *m)
4701 _math_transposefd(tm, m);
4702 save_LoadMatrixf(tm);
4707 save_LoadTransposeMatrixf(const GLfloat *m)
4710 _math_transposef(tm, m);
4711 save_LoadMatrixf(tm);
4716 save_MultTransposeMatrixd(const GLdouble *m)
4719 _math_transposefd(tm, m);
4720 save_MultMatrixf(tm);
4725 save_MultTransposeMatrixf(const GLfloat *m)
4728 _math_transposef(tm, m);
4729 save_MultMatrixf(tm);
4732 static GLvoid *copy_data(const GLvoid *data, GLsizei size, const char *func)
4734 GET_CURRENT_CONTEXT(ctx);
4740 image = malloc(size);
4742 _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func);
4745 memcpy(image, data, size);
4751 /* GL_ARB_texture_compression */
4753 save_CompressedTexImage1D(GLenum target, GLint level,
4754 GLenum internalFormat, GLsizei width,
4755 GLint border, GLsizei imageSize,
4756 const GLvoid * data)
4758 GET_CURRENT_CONTEXT(ctx);
4759 if (target == GL_PROXY_TEXTURE_1D) {
4760 /* don't compile, execute immediately */
4761 CALL_CompressedTexImage1D(ctx->Exec, (target, level, internalFormat,
4762 width, border, imageSize,
4767 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4769 n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_IMAGE_1D,
4770 6 + POINTER_DWORDS);
4774 n[3].e = internalFormat;
4775 n[4].i = (GLint) width;
4779 copy_data(data, imageSize, "glCompressedTexImage1DARB"));
4781 if (ctx->ExecuteFlag) {
4782 CALL_CompressedTexImage1D(ctx->Exec,
4783 (target, level, internalFormat, width,
4784 border, imageSize, data));
4791 save_CompressedTexImage2D(GLenum target, GLint level,
4792 GLenum internalFormat, GLsizei width,
4793 GLsizei height, GLint border, GLsizei imageSize,
4794 const GLvoid * data)
4796 GET_CURRENT_CONTEXT(ctx);
4797 if (target == GL_PROXY_TEXTURE_2D) {
4798 /* don't compile, execute immediately */
4799 CALL_CompressedTexImage2D(ctx->Exec, (target, level, internalFormat,
4800 width, height, border,
4805 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4807 n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_IMAGE_2D,
4808 7 + POINTER_DWORDS);
4812 n[3].e = internalFormat;
4813 n[4].i = (GLint) width;
4814 n[5].i = (GLint) height;
4818 copy_data(data, imageSize, "glCompressedTexImage2DARB"));
4820 if (ctx->ExecuteFlag) {
4821 CALL_CompressedTexImage2D(ctx->Exec,
4822 (target, level, internalFormat, width,
4823 height, border, imageSize, data));
4830 save_CompressedTexImage3D(GLenum target, GLint level,
4831 GLenum internalFormat, GLsizei width,
4832 GLsizei height, GLsizei depth, GLint border,
4833 GLsizei imageSize, const GLvoid * data)
4835 GET_CURRENT_CONTEXT(ctx);
4836 if (target == GL_PROXY_TEXTURE_3D) {
4837 /* don't compile, execute immediately */
4838 CALL_CompressedTexImage3D(ctx->Exec, (target, level, internalFormat,
4839 width, height, depth, border,
4844 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4846 n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_IMAGE_3D,
4847 8 + POINTER_DWORDS);
4851 n[3].e = internalFormat;
4852 n[4].i = (GLint) width;
4853 n[5].i = (GLint) height;
4854 n[6].i = (GLint) depth;
4858 copy_data(data, imageSize, "glCompressedTexImage3DARB"));
4860 if (ctx->ExecuteFlag) {
4861 CALL_CompressedTexImage3D(ctx->Exec,
4862 (target, level, internalFormat, width,
4863 height, depth, border, imageSize,
4871 save_CompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset,
4872 GLsizei width, GLenum format,
4873 GLsizei imageSize, const GLvoid * data)
4876 GET_CURRENT_CONTEXT(ctx);
4877 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4879 n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D,
4880 6 + POINTER_DWORDS);
4885 n[4].i = (GLint) width;
4889 copy_data(data, imageSize, "glCompressedTexSubImage1DARB"));
4891 if (ctx->ExecuteFlag) {
4892 CALL_CompressedTexSubImage1D(ctx->Exec, (target, level, xoffset,
4893 width, format, imageSize,
4900 save_CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset,
4901 GLint yoffset, GLsizei width, GLsizei height,
4902 GLenum format, GLsizei imageSize,
4903 const GLvoid * data)
4906 GET_CURRENT_CONTEXT(ctx);
4907 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4909 n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D,
4910 8 + POINTER_DWORDS);
4916 n[5].i = (GLint) width;
4917 n[6].i = (GLint) height;
4921 copy_data(data, imageSize, "glCompressedTexSubImage2DARB"));
4923 if (ctx->ExecuteFlag) {
4924 CALL_CompressedTexSubImage2D(ctx->Exec,
4925 (target, level, xoffset, yoffset, width,
4926 height, format, imageSize, data));
4932 save_CompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset,
4933 GLint yoffset, GLint zoffset, GLsizei width,
4934 GLsizei height, GLsizei depth, GLenum format,
4935 GLsizei imageSize, const GLvoid * data)
4938 GET_CURRENT_CONTEXT(ctx);
4939 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4941 n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D,
4942 10 + POINTER_DWORDS);
4949 n[6].i = (GLint) width;
4950 n[7].i = (GLint) height;
4951 n[8].i = (GLint) depth;
4953 n[10].i = imageSize;
4954 save_pointer(&n[11],
4955 copy_data(data, imageSize, "glCompressedTexSubImage3DARB"));
4957 if (ctx->ExecuteFlag) {
4958 CALL_CompressedTexSubImage3D(ctx->Exec,
4959 (target, level, xoffset, yoffset,
4960 zoffset, width, height, depth, format,
4966 /* GL_ARB_multisample */
4968 save_SampleCoverage(GLclampf value, GLboolean invert)
4970 GET_CURRENT_CONTEXT(ctx);
4972 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4973 n = alloc_instruction(ctx, OPCODE_SAMPLE_COVERAGE, 2);
4978 if (ctx->ExecuteFlag) {
4979 CALL_SampleCoverage(ctx->Exec, (value, invert));
4985 * GL_ARB_vertex_program
4988 save_BindProgramARB(GLenum target, GLuint id)
4990 GET_CURRENT_CONTEXT(ctx);
4992 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
4993 n = alloc_instruction(ctx, OPCODE_BIND_PROGRAM_ARB, 2);
4998 if (ctx->ExecuteFlag) {
4999 CALL_BindProgramARB(ctx->Exec, (target, id));
5004 save_ProgramEnvParameter4fARB(GLenum target, GLuint index,
5005 GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5007 GET_CURRENT_CONTEXT(ctx);
5009 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5010 n = alloc_instruction(ctx, OPCODE_PROGRAM_ENV_PARAMETER_ARB, 6);
5019 if (ctx->ExecuteFlag) {
5020 CALL_ProgramEnvParameter4fARB(ctx->Exec, (target, index, x, y, z, w));
5026 save_ProgramEnvParameter4fvARB(GLenum target, GLuint index,
5027 const GLfloat *params)
5029 save_ProgramEnvParameter4fARB(target, index, params[0], params[1],
5030 params[2], params[3]);
5035 save_ProgramEnvParameters4fvEXT(GLenum target, GLuint index, GLsizei count,
5036 const GLfloat * params)
5038 GET_CURRENT_CONTEXT(ctx);
5040 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5044 const GLfloat * p = params;
5046 for (i = 0 ; i < count ; i++) {
5047 n = alloc_instruction(ctx, OPCODE_PROGRAM_ENV_PARAMETER_ARB, 6);
5060 if (ctx->ExecuteFlag) {
5061 CALL_ProgramEnvParameters4fvEXT(ctx->Exec, (target, index, count, params));
5067 save_ProgramEnvParameter4dARB(GLenum target, GLuint index,
5068 GLdouble x, GLdouble y, GLdouble z, GLdouble w)
5070 save_ProgramEnvParameter4fARB(target, index,
5072 (GLfloat) y, (GLfloat) z, (GLfloat) w);
5077 save_ProgramEnvParameter4dvARB(GLenum target, GLuint index,
5078 const GLdouble *params)
5080 save_ProgramEnvParameter4fARB(target, index,
5081 (GLfloat) params[0],
5082 (GLfloat) params[1],
5083 (GLfloat) params[2], (GLfloat) params[3]);
5088 save_ProgramLocalParameter4fARB(GLenum target, GLuint index,
5089 GLfloat x, GLfloat y, GLfloat z, GLfloat w)
5091 GET_CURRENT_CONTEXT(ctx);
5093 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5094 n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6);
5103 if (ctx->ExecuteFlag) {
5104 CALL_ProgramLocalParameter4fARB(ctx->Exec, (target, index, x, y, z, w));
5110 save_ProgramLocalParameter4fvARB(GLenum target, GLuint index,
5111 const GLfloat *params)
5113 GET_CURRENT_CONTEXT(ctx);
5115 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5116 n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6);
5125 if (ctx->ExecuteFlag) {
5126 CALL_ProgramLocalParameter4fvARB(ctx->Exec, (target, index, params));
5132 save_ProgramLocalParameters4fvEXT(GLenum target, GLuint index, GLsizei count,
5133 const GLfloat *params)
5135 GET_CURRENT_CONTEXT(ctx);
5137 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5141 const GLfloat * p = params;
5143 for (i = 0 ; i < count ; i++) {
5144 n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6);
5157 if (ctx->ExecuteFlag) {
5158 CALL_ProgramLocalParameters4fvEXT(ctx->Exec, (target, index, count, params));
5164 save_ProgramLocalParameter4dARB(GLenum target, GLuint index,
5165 GLdouble x, GLdouble y,
5166 GLdouble z, GLdouble w)
5168 GET_CURRENT_CONTEXT(ctx);
5170 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5171 n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6);
5175 n[3].f = (GLfloat) x;
5176 n[4].f = (GLfloat) y;
5177 n[5].f = (GLfloat) z;
5178 n[6].f = (GLfloat) w;
5180 if (ctx->ExecuteFlag) {
5181 CALL_ProgramLocalParameter4dARB(ctx->Exec, (target, index, x, y, z, w));
5187 save_ProgramLocalParameter4dvARB(GLenum target, GLuint index,
5188 const GLdouble *params)
5190 GET_CURRENT_CONTEXT(ctx);
5192 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5193 n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6);
5197 n[3].f = (GLfloat) params[0];
5198 n[4].f = (GLfloat) params[1];
5199 n[5].f = (GLfloat) params[2];
5200 n[6].f = (GLfloat) params[3];
5202 if (ctx->ExecuteFlag) {
5203 CALL_ProgramLocalParameter4dvARB(ctx->Exec, (target, index, params));
5208 /* GL_EXT_stencil_two_side */
5210 save_ActiveStencilFaceEXT(GLenum face)
5212 GET_CURRENT_CONTEXT(ctx);
5214 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5215 n = alloc_instruction(ctx, OPCODE_ACTIVE_STENCIL_FACE_EXT, 1);
5219 if (ctx->ExecuteFlag) {
5220 CALL_ActiveStencilFaceEXT(ctx->Exec, (face));
5225 /* GL_EXT_depth_bounds_test */
5227 save_DepthBoundsEXT(GLclampd zmin, GLclampd zmax)
5229 GET_CURRENT_CONTEXT(ctx);
5231 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5232 n = alloc_instruction(ctx, OPCODE_DEPTH_BOUNDS_EXT, 2);
5234 n[1].f = (GLfloat) zmin;
5235 n[2].f = (GLfloat) zmax;
5237 if (ctx->ExecuteFlag) {
5238 CALL_DepthBoundsEXT(ctx->Exec, (zmin, zmax));
5245 save_ProgramStringARB(GLenum target, GLenum format, GLsizei len,
5246 const GLvoid * string)
5248 GET_CURRENT_CONTEXT(ctx);
5251 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5253 n = alloc_instruction(ctx, OPCODE_PROGRAM_STRING_ARB, 3 + POINTER_DWORDS);
5255 GLubyte *programCopy = malloc(len);
5257 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB");
5260 memcpy(programCopy, string, len);
5264 save_pointer(&n[4], programCopy);
5266 if (ctx->ExecuteFlag) {
5267 CALL_ProgramStringARB(ctx->Exec, (target, format, len, string));
5273 save_BeginQuery(GLenum target, GLuint id)
5275 GET_CURRENT_CONTEXT(ctx);
5277 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5278 n = alloc_instruction(ctx, OPCODE_BEGIN_QUERY_ARB, 2);
5283 if (ctx->ExecuteFlag) {
5284 CALL_BeginQuery(ctx->Exec, (target, id));
5289 save_EndQuery(GLenum target)
5291 GET_CURRENT_CONTEXT(ctx);
5293 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5294 n = alloc_instruction(ctx, OPCODE_END_QUERY_ARB, 1);
5298 if (ctx->ExecuteFlag) {
5299 CALL_EndQuery(ctx->Exec, (target));
5304 save_QueryCounter(GLuint id, GLenum target)
5306 GET_CURRENT_CONTEXT(ctx);
5308 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5309 n = alloc_instruction(ctx, OPCODE_QUERY_COUNTER, 2);
5314 if (ctx->ExecuteFlag) {
5315 CALL_QueryCounter(ctx->Exec, (id, target));
5320 save_BeginQueryIndexed(GLenum target, GLuint index, GLuint id)
5322 GET_CURRENT_CONTEXT(ctx);
5324 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5325 n = alloc_instruction(ctx, OPCODE_BEGIN_QUERY_INDEXED, 3);
5331 if (ctx->ExecuteFlag) {
5332 CALL_BeginQueryIndexed(ctx->Exec, (target, index, id));
5337 save_EndQueryIndexed(GLenum target, GLuint index)
5339 GET_CURRENT_CONTEXT(ctx);
5341 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5342 n = alloc_instruction(ctx, OPCODE_END_QUERY_INDEXED, 2);
5347 if (ctx->ExecuteFlag) {
5348 CALL_EndQueryIndexed(ctx->Exec, (target, index));
5354 save_DrawBuffers(GLsizei count, const GLenum * buffers)
5356 GET_CURRENT_CONTEXT(ctx);
5358 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5359 n = alloc_instruction(ctx, OPCODE_DRAW_BUFFERS_ARB, 1 + MAX_DRAW_BUFFERS);
5363 if (count > MAX_DRAW_BUFFERS)
5364 count = MAX_DRAW_BUFFERS;
5365 for (i = 0; i < count; i++) {
5366 n[2 + i].e = buffers[i];
5369 if (ctx->ExecuteFlag) {
5370 CALL_DrawBuffers(ctx->Exec, (count, buffers));
5375 save_BindFragmentShaderATI(GLuint id)
5377 GET_CURRENT_CONTEXT(ctx);
5380 n = alloc_instruction(ctx, OPCODE_BIND_FRAGMENT_SHADER_ATI, 1);
5384 if (ctx->ExecuteFlag) {
5385 CALL_BindFragmentShaderATI(ctx->Exec, (id));
5390 save_SetFragmentShaderConstantATI(GLuint dst, const GLfloat *value)
5392 GET_CURRENT_CONTEXT(ctx);
5395 n = alloc_instruction(ctx, OPCODE_SET_FRAGMENT_SHADER_CONSTANTS_ATI, 5);
5403 if (ctx->ExecuteFlag) {
5404 CALL_SetFragmentShaderConstantATI(ctx->Exec, (dst, value));
5408 static void GLAPIENTRY
5409 save_EvalCoord1f(GLfloat x)
5411 GET_CURRENT_CONTEXT(ctx);
5413 SAVE_FLUSH_VERTICES(ctx);
5414 n = alloc_instruction(ctx, OPCODE_EVAL_C1, 1);
5418 if (ctx->ExecuteFlag) {
5419 CALL_EvalCoord1f(ctx->Exec, (x));
5423 static void GLAPIENTRY
5424 save_EvalCoord1fv(const GLfloat * v)
5426 save_EvalCoord1f(v[0]);
5429 static void GLAPIENTRY
5430 save_EvalCoord2f(GLfloat x, GLfloat y)
5432 GET_CURRENT_CONTEXT(ctx);
5434 SAVE_FLUSH_VERTICES(ctx);
5435 n = alloc_instruction(ctx, OPCODE_EVAL_C2, 2);
5440 if (ctx->ExecuteFlag) {
5441 CALL_EvalCoord2f(ctx->Exec, (x, y));
5445 static void GLAPIENTRY
5446 save_EvalCoord2fv(const GLfloat * v)
5448 save_EvalCoord2f(v[0], v[1]);
5452 static void GLAPIENTRY
5453 save_EvalPoint1(GLint x)
5455 GET_CURRENT_CONTEXT(ctx);
5457 SAVE_FLUSH_VERTICES(ctx);
5458 n = alloc_instruction(ctx, OPCODE_EVAL_P1, 1);
5462 if (ctx->ExecuteFlag) {
5463 CALL_EvalPoint1(ctx->Exec, (x));
5467 static void GLAPIENTRY
5468 save_EvalPoint2(GLint x, GLint y)
5470 GET_CURRENT_CONTEXT(ctx);
5472 SAVE_FLUSH_VERTICES(ctx);
5473 n = alloc_instruction(ctx, OPCODE_EVAL_P2, 2);
5478 if (ctx->ExecuteFlag) {
5479 CALL_EvalPoint2(ctx->Exec, (x, y));
5485 * Compare 'count' elements of vectors 'a' and 'b'.
5486 * \return GL_TRUE if equal, GL_FALSE if different.
5488 static inline GLboolean
5489 compare_vec(const GLfloat *a, const GLfloat *b, GLuint count)
5491 return memcmp( a, b, count * sizeof(GLfloat) ) == 0;
5496 * This glMaterial function is used for glMaterial calls that are outside
5497 * a glBegin/End pair. For glMaterial inside glBegin/End, see the VBO code.
5499 static void GLAPIENTRY
5500 save_Materialfv(GLenum face, GLenum pname, const GLfloat * param)
5502 GET_CURRENT_CONTEXT(ctx);
5510 case GL_FRONT_AND_BACK:
5513 _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(face)");
5522 case GL_AMBIENT_AND_DIFFUSE:
5528 case GL_COLOR_INDEXES:
5532 _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(pname)");
5536 if (ctx->ExecuteFlag) {
5537 CALL_Materialfv(ctx->Exec, (face, pname, param));
5540 bitmask = _mesa_material_bitmask(ctx, face, pname, ~0, NULL);
5542 /* Try to eliminate redundant statechanges. Because it is legal to
5543 * call glMaterial even inside begin/end calls, don't need to worry
5544 * about ctx->Driver.CurrentSavePrimitive here.
5546 for (i = 0; i < MAT_ATTRIB_MAX; i++) {
5547 if (bitmask & (1 << i)) {
5548 if (ctx->ListState.ActiveMaterialSize[i] == args &&
5549 compare_vec(ctx->ListState.CurrentMaterial[i], param, args)) {
5550 /* no change in material value */
5551 bitmask &= ~(1 << i);
5554 ctx->ListState.ActiveMaterialSize[i] = args;
5555 COPY_SZ_4V(ctx->ListState.CurrentMaterial[i], args, param);
5560 /* If this call has no effect, return early */
5564 SAVE_FLUSH_VERTICES(ctx);
5566 n = alloc_instruction(ctx, OPCODE_MATERIAL, 6);
5570 for (i = 0; i < args; i++)
5571 n[3 + i].f = param[i];
5575 static void GLAPIENTRY
5576 save_Begin(GLenum mode)
5578 GET_CURRENT_CONTEXT(ctx);
5580 if (!_mesa_is_valid_prim_mode(ctx, mode)) {
5581 /* compile this error into the display list */
5582 _mesa_compile_error(ctx, GL_INVALID_ENUM, "glBegin(mode)");
5584 else if (_mesa_inside_dlist_begin_end(ctx)) {
5585 /* compile this error into the display list */
5586 _mesa_compile_error(ctx, GL_INVALID_OPERATION, "recursive glBegin");
5589 ctx->Driver.CurrentSavePrimitive = mode;
5591 vbo_save_NotifyBegin(ctx, mode, false);
5595 static void GLAPIENTRY
5598 GET_CURRENT_CONTEXT(ctx);
5599 SAVE_FLUSH_VERTICES(ctx);
5600 (void) alloc_instruction(ctx, OPCODE_END, 0);
5601 ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END;
5602 if (ctx->ExecuteFlag) {
5603 CALL_End(ctx->Exec, ());
5607 static void GLAPIENTRY
5608 save_PrimitiveRestartNV(void)
5610 /* Note: this is used when outside a glBegin/End pair in a display list */
5611 GET_CURRENT_CONTEXT(ctx);
5612 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5613 (void) alloc_instruction(ctx, OPCODE_PRIMITIVE_RESTART_NV, 0);
5614 if (ctx->ExecuteFlag) {
5615 CALL_PrimitiveRestartNV(ctx->Exec, ());
5621 save_BlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
5622 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
5623 GLbitfield mask, GLenum filter)
5625 GET_CURRENT_CONTEXT(ctx);
5627 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5628 n = alloc_instruction(ctx, OPCODE_BLIT_FRAMEBUFFER, 10);
5641 if (ctx->ExecuteFlag) {
5642 CALL_BlitFramebuffer(ctx->Exec, (srcX0, srcY0, srcX1, srcY1,
5643 dstX0, dstY0, dstX1, dstY1,
5649 /** GL_EXT_provoking_vertex */
5651 save_ProvokingVertex(GLenum mode)
5653 GET_CURRENT_CONTEXT(ctx);
5655 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5656 n = alloc_instruction(ctx, OPCODE_PROVOKING_VERTEX, 1);
5660 if (ctx->ExecuteFlag) {
5661 /*CALL_ProvokingVertex(ctx->Exec, (mode));*/
5662 _mesa_ProvokingVertex(mode);
5667 /** GL_EXT_transform_feedback */
5669 save_BeginTransformFeedback(GLenum mode)
5671 GET_CURRENT_CONTEXT(ctx);
5673 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5674 n = alloc_instruction(ctx, OPCODE_BEGIN_TRANSFORM_FEEDBACK, 1);
5678 if (ctx->ExecuteFlag) {
5679 CALL_BeginTransformFeedback(ctx->Exec, (mode));
5684 /** GL_EXT_transform_feedback */
5686 save_EndTransformFeedback(void)
5688 GET_CURRENT_CONTEXT(ctx);
5689 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5690 (void) alloc_instruction(ctx, OPCODE_END_TRANSFORM_FEEDBACK, 0);
5691 if (ctx->ExecuteFlag) {
5692 CALL_EndTransformFeedback(ctx->Exec, ());
5697 save_BindTransformFeedback(GLenum target, GLuint name)
5699 GET_CURRENT_CONTEXT(ctx);
5701 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5702 n = alloc_instruction(ctx, OPCODE_BIND_TRANSFORM_FEEDBACK, 2);
5707 if (ctx->ExecuteFlag) {
5708 CALL_BindTransformFeedback(ctx->Exec, (target, name));
5713 save_PauseTransformFeedback(void)
5715 GET_CURRENT_CONTEXT(ctx);
5716 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5717 (void) alloc_instruction(ctx, OPCODE_PAUSE_TRANSFORM_FEEDBACK, 0);
5718 if (ctx->ExecuteFlag) {
5719 CALL_PauseTransformFeedback(ctx->Exec, ());
5724 save_ResumeTransformFeedback(void)
5726 GET_CURRENT_CONTEXT(ctx);
5727 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5728 (void) alloc_instruction(ctx, OPCODE_RESUME_TRANSFORM_FEEDBACK, 0);
5729 if (ctx->ExecuteFlag) {
5730 CALL_ResumeTransformFeedback(ctx->Exec, ());
5735 save_DrawTransformFeedback(GLenum mode, GLuint name)
5737 GET_CURRENT_CONTEXT(ctx);
5739 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5740 n = alloc_instruction(ctx, OPCODE_DRAW_TRANSFORM_FEEDBACK, 2);
5745 if (ctx->ExecuteFlag) {
5746 CALL_DrawTransformFeedback(ctx->Exec, (mode, name));
5751 save_DrawTransformFeedbackStream(GLenum mode, GLuint name, GLuint stream)
5753 GET_CURRENT_CONTEXT(ctx);
5755 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5756 n = alloc_instruction(ctx, OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM, 3);
5762 if (ctx->ExecuteFlag) {
5763 CALL_DrawTransformFeedbackStream(ctx->Exec, (mode, name, stream));
5768 save_DrawTransformFeedbackInstanced(GLenum mode, GLuint name,
5771 GET_CURRENT_CONTEXT(ctx);
5773 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5774 n = alloc_instruction(ctx, OPCODE_DRAW_TRANSFORM_FEEDBACK_INSTANCED, 3);
5778 n[3].si = primcount;
5780 if (ctx->ExecuteFlag) {
5781 CALL_DrawTransformFeedbackInstanced(ctx->Exec, (mode, name, primcount));
5786 save_DrawTransformFeedbackStreamInstanced(GLenum mode, GLuint name,
5787 GLuint stream, GLsizei primcount)
5789 GET_CURRENT_CONTEXT(ctx);
5791 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5792 n = alloc_instruction(ctx, OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM_INSTANCED, 4);
5797 n[4].si = primcount;
5799 if (ctx->ExecuteFlag) {
5800 CALL_DrawTransformFeedbackStreamInstanced(ctx->Exec, (mode, name, stream,
5806 save_DispatchCompute(GLuint num_groups_x, GLuint num_groups_y,
5807 GLuint num_groups_z)
5809 GET_CURRENT_CONTEXT(ctx);
5811 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
5812 n = alloc_instruction(ctx, OPCODE_DISPATCH_COMPUTE, 3);
5814 n[1].ui = num_groups_x;
5815 n[2].ui = num_groups_y;
5816 n[3].ui = num_groups_z;
5818 if (ctx->ExecuteFlag) {
5819 CALL_DispatchCompute(ctx->Exec, (num_groups_x, num_groups_y,
5825 save_DispatchComputeIndirect(GLintptr indirect)
5827 GET_CURRENT_CONTEXT(ctx);
5828 _mesa_error(ctx, GL_INVALID_OPERATION,
5829 "glDispatchComputeIndirect() during display list compile");
5832 static void ALWAYS_INLINE
5833 save_Attr32bit(struct gl_context *ctx, unsigned attr, unsigned size,
5834 GLenum type, uint32_t x, uint32_t y, uint32_t z, uint32_t w)
5837 SAVE_FLUSH_VERTICES(ctx);
5839 unsigned index = attr;
5841 /* We don't care about GL_INT vs GL_UNSIGNED_INT. The idea is to get W=1
5842 * right for 3 or lower number of components, so only distinguish between
5845 if (type == GL_FLOAT) {
5846 if (VERT_BIT(attr) & VERT_BIT_GENERIC_ALL) {
5847 base_op = OPCODE_ATTR_1F_ARB;
5848 attr -= VERT_ATTRIB_GENERIC0;
5850 base_op = OPCODE_ATTR_1F_NV;
5853 base_op = OPCODE_ATTR_1I;
5854 attr -= VERT_ATTRIB_GENERIC0;
5857 n = alloc_instruction(ctx, base_op + size - 1, 1 + size);
5861 if (size >= 2) n[3].ui = y;
5862 if (size >= 3) n[4].ui = z;
5863 if (size >= 4) n[5].ui = w;
5866 ctx->ListState.ActiveAttribSize[index] = size;
5867 ASSIGN_4V(ctx->ListState.CurrentAttrib[index], x, y, z, w);
5869 if (ctx->ExecuteFlag) {
5870 if (type == GL_FLOAT) {
5871 if (base_op == OPCODE_ATTR_1F_NV) {
5873 CALL_VertexAttrib4fNV(ctx->Exec, (attr, uif(x), uif(y), uif(z), uif(w)));
5875 CALL_VertexAttrib3fNV(ctx->Exec, (attr, uif(x), uif(y), uif(z)));
5877 CALL_VertexAttrib2fNV(ctx->Exec, (attr, uif(x), uif(y)));
5879 CALL_VertexAttrib1fNV(ctx->Exec, (attr, uif(x)));
5882 CALL_VertexAttrib4fARB(ctx->Exec, (attr, uif(x), uif(y), uif(z), uif(w)));
5884 CALL_VertexAttrib3fARB(ctx->Exec, (attr, uif(x), uif(y), uif(z)));
5886 CALL_VertexAttrib2fARB(ctx->Exec, (attr, uif(x), uif(y)));
5888 CALL_VertexAttrib1fARB(ctx->Exec, (attr, uif(x)));
5892 CALL_VertexAttribI4iEXT(ctx->Exec, (attr, x, y, z, w));
5894 CALL_VertexAttribI3iEXT(ctx->Exec, (attr, x, y, z));
5896 CALL_VertexAttribI2iEXT(ctx->Exec, (attr, x, y));
5898 CALL_VertexAttribI1iEXT(ctx->Exec, (attr, x));
5903 static void ALWAYS_INLINE
5904 save_Attr64bit(struct gl_context *ctx, unsigned attr, unsigned size,
5905 GLenum type, uint64_t x, uint64_t y, uint64_t z, uint64_t w)
5908 SAVE_FLUSH_VERTICES(ctx);
5910 unsigned index = attr;
5912 if (type == GL_DOUBLE) {
5913 base_op = OPCODE_ATTR_1D;
5915 base_op = OPCODE_ATTR_1UI64;
5919 attr -= VERT_ATTRIB_GENERIC0;
5920 n = alloc_instruction(ctx, base_op + size - 1, 1 + size * 2);
5923 ASSIGN_UINT64_TO_NODES(n, 2, x);
5924 if (size >= 2) ASSIGN_UINT64_TO_NODES(n, 4, y);
5925 if (size >= 3) ASSIGN_UINT64_TO_NODES(n, 6, z);
5926 if (size >= 4) ASSIGN_UINT64_TO_NODES(n, 8, w);
5929 ctx->ListState.ActiveAttribSize[index] = size;
5930 memcpy(ctx->ListState.CurrentAttrib[index], &n[2], size * sizeof(uint64_t));
5932 if (ctx->ExecuteFlag) {
5933 uint64_t v[] = {x, y, z, w};
5934 if (type == GL_DOUBLE) {
5936 CALL_VertexAttribL4dv(ctx->Exec, (attr, (GLdouble*)v));
5938 CALL_VertexAttribL3dv(ctx->Exec, (attr, (GLdouble*)v));
5940 CALL_VertexAttribL2dv(ctx->Exec, (attr, (GLdouble*)v));
5942 CALL_VertexAttribL1d(ctx->Exec, (attr, UINT64_AS_DOUBLE(x)));
5944 CALL_VertexAttribL1ui64ARB(ctx->Exec, (attr, x));
5950 * If index=0, does glVertexAttrib*() alias glVertex() to emit a vertex?
5951 * It depends on a few things, including whether we're inside or outside
5955 is_vertex_position(const struct gl_context *ctx, GLuint index)
5957 return (index == 0 &&
5958 _mesa_attr_zero_aliases_vertex(ctx) &&
5959 _mesa_inside_dlist_begin_end(ctx));
5963 * This macro is used to implement all the glVertex, glColor, glTexCoord,
5964 * glVertexAttrib, etc functions.
5965 * \param A VBO_ATTRIB_x attribute index
5966 * \param N attribute size (1..4)
5967 * \param T type (GL_FLOAT, GL_DOUBLE, GL_INT, GL_UNSIGNED_INT)
5968 * \param C cast type (uint32_t or uint64_t)
5969 * \param V0, V1, v2, V3 attribute value
5971 #define ATTR_UNION(A, N, T, C, V0, V1, V2, V3) \
5973 if (sizeof(C) == 4) { \
5974 save_Attr32bit(ctx, A, N, T, V0, V1, V2, V3); \
5976 save_Attr64bit(ctx, A, N, T, V0, V1, V2, V3); \
5981 #define ERROR(err) _mesa_error(ctx, err, __func__)
5982 #define TAG(x) save_##x
5984 #define VBO_ATTRIB_POS VERT_ATTRIB_POS
5985 #define VBO_ATTRIB_NORMAL VERT_ATTRIB_NORMAL
5986 #define VBO_ATTRIB_COLOR0 VERT_ATTRIB_COLOR0
5987 #define VBO_ATTRIB_COLOR1 VERT_ATTRIB_COLOR1
5988 #define VBO_ATTRIB_FOG VERT_ATTRIB_FOG
5989 #define VBO_ATTRIB_COLOR_INDEX VERT_ATTRIB_COLOR_INDEX
5990 #define VBO_ATTRIB_EDGEFLAG VERT_ATTRIB_EDGEFLAG
5991 #define VBO_ATTRIB_TEX0 VERT_ATTRIB_TEX0
5992 #define VBO_ATTRIB_GENERIC0 VERT_ATTRIB_GENERIC0
5993 #define VBO_ATTRIB_MAX VERT_ATTRIB_MAX
5995 #include "vbo/vbo_attrib_tmp.h"
5998 save_UseProgram(GLuint program)
6000 GET_CURRENT_CONTEXT(ctx);
6002 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6003 n = alloc_instruction(ctx, OPCODE_USE_PROGRAM, 1);
6007 if (ctx->ExecuteFlag) {
6008 CALL_UseProgram(ctx->Exec, (program));
6014 save_Uniform1f(GLint location, GLfloat x)
6016 GET_CURRENT_CONTEXT(ctx);
6018 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6019 n = alloc_instruction(ctx, OPCODE_UNIFORM_1F, 2);
6024 if (ctx->ExecuteFlag) {
6025 CALL_Uniform1f(ctx->Exec, (location, x));
6031 save_Uniform2f(GLint location, GLfloat x, GLfloat y)
6033 GET_CURRENT_CONTEXT(ctx);
6035 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6036 n = alloc_instruction(ctx, OPCODE_UNIFORM_2F, 3);
6042 if (ctx->ExecuteFlag) {
6043 CALL_Uniform2f(ctx->Exec, (location, x, y));
6049 save_Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z)
6051 GET_CURRENT_CONTEXT(ctx);
6053 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6054 n = alloc_instruction(ctx, OPCODE_UNIFORM_3F, 4);
6061 if (ctx->ExecuteFlag) {
6062 CALL_Uniform3f(ctx->Exec, (location, x, y, z));
6068 save_Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6070 GET_CURRENT_CONTEXT(ctx);
6072 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6073 n = alloc_instruction(ctx, OPCODE_UNIFORM_4F, 5);
6081 if (ctx->ExecuteFlag) {
6082 CALL_Uniform4f(ctx->Exec, (location, x, y, z, w));
6088 save_Uniform1fv(GLint location, GLsizei count, const GLfloat *v)
6090 GET_CURRENT_CONTEXT(ctx);
6092 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6093 n = alloc_instruction(ctx, OPCODE_UNIFORM_1FV, 2 + POINTER_DWORDS);
6097 save_pointer(&n[3], memdup(v, count * 1 * sizeof(GLfloat)));
6099 if (ctx->ExecuteFlag) {
6100 CALL_Uniform1fv(ctx->Exec, (location, count, v));
6105 save_Uniform2fv(GLint location, GLsizei count, const GLfloat *v)
6107 GET_CURRENT_CONTEXT(ctx);
6109 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6110 n = alloc_instruction(ctx, OPCODE_UNIFORM_2FV, 2 + POINTER_DWORDS);
6114 save_pointer(&n[3], memdup(v, count * 2 * sizeof(GLfloat)));
6116 if (ctx->ExecuteFlag) {
6117 CALL_Uniform2fv(ctx->Exec, (location, count, v));
6122 save_Uniform3fv(GLint location, GLsizei count, const GLfloat *v)
6124 GET_CURRENT_CONTEXT(ctx);
6126 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6127 n = alloc_instruction(ctx, OPCODE_UNIFORM_3FV, 2 + POINTER_DWORDS);
6131 save_pointer(&n[3], memdup(v, count * 3 * sizeof(GLfloat)));
6133 if (ctx->ExecuteFlag) {
6134 CALL_Uniform3fv(ctx->Exec, (location, count, v));
6139 save_Uniform4fv(GLint location, GLsizei count, const GLfloat *v)
6141 GET_CURRENT_CONTEXT(ctx);
6143 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6144 n = alloc_instruction(ctx, OPCODE_UNIFORM_4FV, 2 + POINTER_DWORDS);
6148 save_pointer(&n[3], memdup(v, count * 4 * sizeof(GLfloat)));
6150 if (ctx->ExecuteFlag) {
6151 CALL_Uniform4fv(ctx->Exec, (location, count, v));
6157 save_Uniform1d(GLint location, GLdouble x)
6159 GET_CURRENT_CONTEXT(ctx);
6161 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6162 n = alloc_instruction(ctx, OPCODE_UNIFORM_1D, 3);
6165 ASSIGN_DOUBLE_TO_NODES(n, 2, x);
6167 if (ctx->ExecuteFlag) {
6168 CALL_Uniform1d(ctx->Exec, (location, x));
6174 save_Uniform2d(GLint location, GLdouble x, GLdouble y)
6176 GET_CURRENT_CONTEXT(ctx);
6178 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6179 n = alloc_instruction(ctx, OPCODE_UNIFORM_2D, 5);
6182 ASSIGN_DOUBLE_TO_NODES(n, 2, x);
6183 ASSIGN_DOUBLE_TO_NODES(n, 4, y);
6185 if (ctx->ExecuteFlag) {
6186 CALL_Uniform2d(ctx->Exec, (location, x, y));
6192 save_Uniform3d(GLint location, GLdouble x, GLdouble y, GLdouble z)
6194 GET_CURRENT_CONTEXT(ctx);
6196 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6197 n = alloc_instruction(ctx, OPCODE_UNIFORM_3D, 7);
6200 ASSIGN_DOUBLE_TO_NODES(n, 2, x);
6201 ASSIGN_DOUBLE_TO_NODES(n, 4, y);
6202 ASSIGN_DOUBLE_TO_NODES(n, 6, z);
6204 if (ctx->ExecuteFlag) {
6205 CALL_Uniform3d(ctx->Exec, (location, x, y, z));
6211 save_Uniform4d(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
6213 GET_CURRENT_CONTEXT(ctx);
6215 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6216 n = alloc_instruction(ctx, OPCODE_UNIFORM_4D, 9);
6219 ASSIGN_DOUBLE_TO_NODES(n, 2, x);
6220 ASSIGN_DOUBLE_TO_NODES(n, 4, y);
6221 ASSIGN_DOUBLE_TO_NODES(n, 6, z);
6222 ASSIGN_DOUBLE_TO_NODES(n, 8, w);
6224 if (ctx->ExecuteFlag) {
6225 CALL_Uniform4d(ctx->Exec, (location, x, y, z, w));
6231 save_Uniform1dv(GLint location, GLsizei count, const GLdouble *v)
6233 GET_CURRENT_CONTEXT(ctx);
6235 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6236 n = alloc_instruction(ctx, OPCODE_UNIFORM_1DV, 2 + POINTER_DWORDS);
6240 save_pointer(&n[3], memdup(v, count * 1 * sizeof(GLdouble)));
6242 if (ctx->ExecuteFlag) {
6243 CALL_Uniform1dv(ctx->Exec, (location, count, v));
6249 save_Uniform2dv(GLint location, GLsizei count, const GLdouble *v)
6251 GET_CURRENT_CONTEXT(ctx);
6253 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6254 n = alloc_instruction(ctx, OPCODE_UNIFORM_2DV, 2 + POINTER_DWORDS);
6258 save_pointer(&n[3], memdup(v, count * 2 * sizeof(GLdouble)));
6260 if (ctx->ExecuteFlag) {
6261 CALL_Uniform2dv(ctx->Exec, (location, count, v));
6267 save_Uniform3dv(GLint location, GLsizei count, const GLdouble *v)
6269 GET_CURRENT_CONTEXT(ctx);
6271 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6272 n = alloc_instruction(ctx, OPCODE_UNIFORM_3DV, 2 + POINTER_DWORDS);
6276 save_pointer(&n[3], memdup(v, count * 3 * sizeof(GLdouble)));
6278 if (ctx->ExecuteFlag) {
6279 CALL_Uniform3dv(ctx->Exec, (location, count, v));
6285 save_Uniform4dv(GLint location, GLsizei count, const GLdouble *v)
6287 GET_CURRENT_CONTEXT(ctx);
6289 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6290 n = alloc_instruction(ctx, OPCODE_UNIFORM_4DV, 2 + POINTER_DWORDS);
6294 save_pointer(&n[3], memdup(v, count * 4 * sizeof(GLdouble)));
6296 if (ctx->ExecuteFlag) {
6297 CALL_Uniform4dv(ctx->Exec, (location, count, v));
6303 save_Uniform1i(GLint location, GLint x)
6305 GET_CURRENT_CONTEXT(ctx);
6307 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6308 n = alloc_instruction(ctx, OPCODE_UNIFORM_1I, 2);
6313 if (ctx->ExecuteFlag) {
6314 CALL_Uniform1i(ctx->Exec, (location, x));
6319 save_Uniform2i(GLint location, GLint x, GLint y)
6321 GET_CURRENT_CONTEXT(ctx);
6323 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6324 n = alloc_instruction(ctx, OPCODE_UNIFORM_2I, 3);
6330 if (ctx->ExecuteFlag) {
6331 CALL_Uniform2i(ctx->Exec, (location, x, y));
6336 save_Uniform3i(GLint location, GLint x, GLint y, GLint z)
6338 GET_CURRENT_CONTEXT(ctx);
6340 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6341 n = alloc_instruction(ctx, OPCODE_UNIFORM_3I, 4);
6348 if (ctx->ExecuteFlag) {
6349 CALL_Uniform3i(ctx->Exec, (location, x, y, z));
6354 save_Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w)
6356 GET_CURRENT_CONTEXT(ctx);
6358 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6359 n = alloc_instruction(ctx, OPCODE_UNIFORM_4I, 5);
6367 if (ctx->ExecuteFlag) {
6368 CALL_Uniform4i(ctx->Exec, (location, x, y, z, w));
6375 save_Uniform1iv(GLint location, GLsizei count, const GLint *v)
6377 GET_CURRENT_CONTEXT(ctx);
6379 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6380 n = alloc_instruction(ctx, OPCODE_UNIFORM_1IV, 2 + POINTER_DWORDS);
6384 save_pointer(&n[3], memdup(v, count * 1 * sizeof(GLint)));
6386 if (ctx->ExecuteFlag) {
6387 CALL_Uniform1iv(ctx->Exec, (location, count, v));
6392 save_Uniform2iv(GLint location, GLsizei count, const GLint *v)
6394 GET_CURRENT_CONTEXT(ctx);
6396 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6397 n = alloc_instruction(ctx, OPCODE_UNIFORM_2IV, 2 + POINTER_DWORDS);
6401 save_pointer(&n[3], memdup(v, count * 2 * sizeof(GLint)));
6403 if (ctx->ExecuteFlag) {
6404 CALL_Uniform2iv(ctx->Exec, (location, count, v));
6409 save_Uniform3iv(GLint location, GLsizei count, const GLint *v)
6411 GET_CURRENT_CONTEXT(ctx);
6413 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6414 n = alloc_instruction(ctx, OPCODE_UNIFORM_3IV, 2 + POINTER_DWORDS);
6418 save_pointer(&n[3], memdup(v, count * 3 * sizeof(GLint)));
6420 if (ctx->ExecuteFlag) {
6421 CALL_Uniform3iv(ctx->Exec, (location, count, v));
6426 save_Uniform4iv(GLint location, GLsizei count, const GLint *v)
6428 GET_CURRENT_CONTEXT(ctx);
6430 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6431 n = alloc_instruction(ctx, OPCODE_UNIFORM_4IV, 2 + POINTER_DWORDS);
6435 save_pointer(&n[3], memdup(v, count * 4 * sizeof(GLfloat)));
6437 if (ctx->ExecuteFlag) {
6438 CALL_Uniform4iv(ctx->Exec, (location, count, v));
6445 save_Uniform1ui(GLint location, GLuint x)
6447 GET_CURRENT_CONTEXT(ctx);
6449 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6450 n = alloc_instruction(ctx, OPCODE_UNIFORM_1UI, 2);
6455 if (ctx->ExecuteFlag) {
6456 CALL_Uniform1ui(ctx->Exec, (location, x));
6461 save_Uniform2ui(GLint location, GLuint x, GLuint y)
6463 GET_CURRENT_CONTEXT(ctx);
6465 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6466 n = alloc_instruction(ctx, OPCODE_UNIFORM_2UI, 3);
6472 if (ctx->ExecuteFlag) {
6473 CALL_Uniform2ui(ctx->Exec, (location, x, y));
6478 save_Uniform3ui(GLint location, GLuint x, GLuint y, GLuint z)
6480 GET_CURRENT_CONTEXT(ctx);
6482 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6483 n = alloc_instruction(ctx, OPCODE_UNIFORM_3UI, 4);
6490 if (ctx->ExecuteFlag) {
6491 CALL_Uniform3ui(ctx->Exec, (location, x, y, z));
6496 save_Uniform4ui(GLint location, GLuint x, GLuint y, GLuint z, GLuint w)
6498 GET_CURRENT_CONTEXT(ctx);
6500 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6501 n = alloc_instruction(ctx, OPCODE_UNIFORM_4UI, 5);
6509 if (ctx->ExecuteFlag) {
6510 CALL_Uniform4ui(ctx->Exec, (location, x, y, z, w));
6517 save_Uniform1uiv(GLint location, GLsizei count, const GLuint *v)
6519 GET_CURRENT_CONTEXT(ctx);
6521 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6522 n = alloc_instruction(ctx, OPCODE_UNIFORM_1UIV, 2 + POINTER_DWORDS);
6526 save_pointer(&n[3], memdup(v, count * 1 * sizeof(*v)));
6528 if (ctx->ExecuteFlag) {
6529 CALL_Uniform1uiv(ctx->Exec, (location, count, v));
6534 save_Uniform2uiv(GLint location, GLsizei count, const GLuint *v)
6536 GET_CURRENT_CONTEXT(ctx);
6538 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6539 n = alloc_instruction(ctx, OPCODE_UNIFORM_2UIV, 2 + POINTER_DWORDS);
6543 save_pointer(&n[3], memdup(v, count * 2 * sizeof(*v)));
6545 if (ctx->ExecuteFlag) {
6546 CALL_Uniform2uiv(ctx->Exec, (location, count, v));
6551 save_Uniform3uiv(GLint location, GLsizei count, const GLuint *v)
6553 GET_CURRENT_CONTEXT(ctx);
6555 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6556 n = alloc_instruction(ctx, OPCODE_UNIFORM_3UIV, 2 + POINTER_DWORDS);
6560 save_pointer(&n[3], memdup(v, count * 3 * sizeof(*v)));
6562 if (ctx->ExecuteFlag) {
6563 CALL_Uniform3uiv(ctx->Exec, (location, count, v));
6568 save_Uniform4uiv(GLint location, GLsizei count, const GLuint *v)
6570 GET_CURRENT_CONTEXT(ctx);
6572 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6573 n = alloc_instruction(ctx, OPCODE_UNIFORM_4UIV, 2 + POINTER_DWORDS);
6577 save_pointer(&n[3], memdup(v, count * 4 * sizeof(*v)));
6579 if (ctx->ExecuteFlag) {
6580 CALL_Uniform4uiv(ctx->Exec, (location, count, v));
6587 save_UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose,
6590 GET_CURRENT_CONTEXT(ctx);
6592 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6593 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX22, 3 + POINTER_DWORDS);
6598 save_pointer(&n[4], memdup(m, count * 2 * 2 * sizeof(GLfloat)));
6600 if (ctx->ExecuteFlag) {
6601 CALL_UniformMatrix2fv(ctx->Exec, (location, count, transpose, m));
6606 save_UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose,
6609 GET_CURRENT_CONTEXT(ctx);
6611 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6612 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX33, 3 + POINTER_DWORDS);
6617 save_pointer(&n[4], memdup(m, count * 3 * 3 * sizeof(GLfloat)));
6619 if (ctx->ExecuteFlag) {
6620 CALL_UniformMatrix3fv(ctx->Exec, (location, count, transpose, m));
6625 save_UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose,
6628 GET_CURRENT_CONTEXT(ctx);
6630 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6631 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX44, 3 + POINTER_DWORDS);
6636 save_pointer(&n[4], memdup(m, count * 4 * 4 * sizeof(GLfloat)));
6638 if (ctx->ExecuteFlag) {
6639 CALL_UniformMatrix4fv(ctx->Exec, (location, count, transpose, m));
6645 save_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
6648 GET_CURRENT_CONTEXT(ctx);
6650 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6651 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX23, 3 + POINTER_DWORDS);
6656 save_pointer(&n[4], memdup(m, count * 2 * 3 * sizeof(GLfloat)));
6658 if (ctx->ExecuteFlag) {
6659 CALL_UniformMatrix2x3fv(ctx->Exec, (location, count, transpose, m));
6664 save_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
6667 GET_CURRENT_CONTEXT(ctx);
6669 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6670 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX32, 3 + POINTER_DWORDS);
6675 save_pointer(&n[4], memdup(m, count * 3 * 2 * sizeof(GLfloat)));
6677 if (ctx->ExecuteFlag) {
6678 CALL_UniformMatrix3x2fv(ctx->Exec, (location, count, transpose, m));
6684 save_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
6687 GET_CURRENT_CONTEXT(ctx);
6689 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6690 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX24, 3 + POINTER_DWORDS);
6695 save_pointer(&n[4], memdup(m, count * 2 * 4 * sizeof(GLfloat)));
6697 if (ctx->ExecuteFlag) {
6698 CALL_UniformMatrix2x4fv(ctx->Exec, (location, count, transpose, m));
6703 save_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
6706 GET_CURRENT_CONTEXT(ctx);
6708 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6709 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX42, 3 + POINTER_DWORDS);
6714 save_pointer(&n[4], memdup(m, count * 4 * 2 * sizeof(GLfloat)));
6716 if (ctx->ExecuteFlag) {
6717 CALL_UniformMatrix4x2fv(ctx->Exec, (location, count, transpose, m));
6723 save_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
6726 GET_CURRENT_CONTEXT(ctx);
6728 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6729 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX34, 3 + POINTER_DWORDS);
6734 save_pointer(&n[4], memdup(m, count * 3 * 4 * sizeof(GLfloat)));
6736 if (ctx->ExecuteFlag) {
6737 CALL_UniformMatrix3x4fv(ctx->Exec, (location, count, transpose, m));
6742 save_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
6745 GET_CURRENT_CONTEXT(ctx);
6747 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6748 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX43, 3 + POINTER_DWORDS);
6753 save_pointer(&n[4], memdup(m, count * 4 * 3 * sizeof(GLfloat)));
6755 if (ctx->ExecuteFlag) {
6756 CALL_UniformMatrix4x3fv(ctx->Exec, (location, count, transpose, m));
6762 save_UniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose,
6765 GET_CURRENT_CONTEXT(ctx);
6767 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6768 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX22D, 3 + POINTER_DWORDS);
6773 save_pointer(&n[4], memdup(m, count * 2 * 2 * sizeof(GLdouble)));
6775 if (ctx->ExecuteFlag) {
6776 CALL_UniformMatrix2dv(ctx->Exec, (location, count, transpose, m));
6781 save_UniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose,
6784 GET_CURRENT_CONTEXT(ctx);
6786 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6787 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX33D, 3 + POINTER_DWORDS);
6792 save_pointer(&n[4], memdup(m, count * 3 * 3 * sizeof(GLdouble)));
6794 if (ctx->ExecuteFlag) {
6795 CALL_UniformMatrix3dv(ctx->Exec, (location, count, transpose, m));
6800 save_UniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose,
6803 GET_CURRENT_CONTEXT(ctx);
6805 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6806 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX44D, 3 + POINTER_DWORDS);
6811 save_pointer(&n[4], memdup(m, count * 4 * 4 * sizeof(GLdouble)));
6813 if (ctx->ExecuteFlag) {
6814 CALL_UniformMatrix4dv(ctx->Exec, (location, count, transpose, m));
6820 save_UniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose,
6823 GET_CURRENT_CONTEXT(ctx);
6825 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6826 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX23D, 3 + POINTER_DWORDS);
6831 save_pointer(&n[4], memdup(m, count * 2 * 3 * sizeof(GLdouble)));
6833 if (ctx->ExecuteFlag) {
6834 CALL_UniformMatrix2x3dv(ctx->Exec, (location, count, transpose, m));
6840 save_UniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose,
6843 GET_CURRENT_CONTEXT(ctx);
6845 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6846 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX32D, 3 + POINTER_DWORDS);
6851 save_pointer(&n[4], memdup(m, count * 3 * 2 * sizeof(GLdouble)));
6853 if (ctx->ExecuteFlag) {
6854 CALL_UniformMatrix3x2dv(ctx->Exec, (location, count, transpose, m));
6860 save_UniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose,
6863 GET_CURRENT_CONTEXT(ctx);
6865 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6866 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX24D, 3 + POINTER_DWORDS);
6871 save_pointer(&n[4], memdup(m, count * 2 * 4 * sizeof(GLdouble)));
6873 if (ctx->ExecuteFlag) {
6874 CALL_UniformMatrix2x4dv(ctx->Exec, (location, count, transpose, m));
6879 save_UniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose,
6882 GET_CURRENT_CONTEXT(ctx);
6884 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6885 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX42D, 3 + POINTER_DWORDS);
6890 save_pointer(&n[4], memdup(m, count * 4 * 2 * sizeof(GLdouble)));
6892 if (ctx->ExecuteFlag) {
6893 CALL_UniformMatrix4x2dv(ctx->Exec, (location, count, transpose, m));
6899 save_UniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose,
6902 GET_CURRENT_CONTEXT(ctx);
6904 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6905 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX34D, 3 + POINTER_DWORDS);
6910 save_pointer(&n[4], memdup(m, count * 3 * 4 * sizeof(GLdouble)));
6912 if (ctx->ExecuteFlag) {
6913 CALL_UniformMatrix3x4dv(ctx->Exec, (location, count, transpose, m));
6919 save_UniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose,
6922 GET_CURRENT_CONTEXT(ctx);
6924 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6925 n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX43D, 3 + POINTER_DWORDS);
6930 save_pointer(&n[4], memdup(m, count * 4 * 3 * sizeof(GLdouble)));
6932 if (ctx->ExecuteFlag) {
6933 CALL_UniformMatrix4x3dv(ctx->Exec, (location, count, transpose, m));
6938 save_Uniform1i64ARB(GLint location, GLint64 x)
6940 GET_CURRENT_CONTEXT(ctx);
6942 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6943 n = alloc_instruction(ctx, OPCODE_UNIFORM_1I64, 3);
6946 ASSIGN_INT64_TO_NODES(n, 2, x);
6948 if (ctx->ExecuteFlag) {
6949 CALL_Uniform1i64ARB(ctx->Exec, (location, x));
6954 save_Uniform2i64ARB(GLint location, GLint64 x, GLint64 y)
6956 GET_CURRENT_CONTEXT(ctx);
6958 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6959 n = alloc_instruction(ctx, OPCODE_UNIFORM_2I64, 5);
6962 ASSIGN_INT64_TO_NODES(n, 2, x);
6963 ASSIGN_INT64_TO_NODES(n, 4, y);
6965 if (ctx->ExecuteFlag) {
6966 CALL_Uniform2i64ARB(ctx->Exec, (location, x, y));
6971 save_Uniform3i64ARB(GLint location, GLint64 x, GLint64 y, GLint64 z)
6973 GET_CURRENT_CONTEXT(ctx);
6975 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6976 n = alloc_instruction(ctx, OPCODE_UNIFORM_3I64, 7);
6979 ASSIGN_INT64_TO_NODES(n, 2, x);
6980 ASSIGN_INT64_TO_NODES(n, 4, y);
6981 ASSIGN_INT64_TO_NODES(n, 6, z);
6983 if (ctx->ExecuteFlag) {
6984 CALL_Uniform3i64ARB(ctx->Exec, (location, x, y, z));
6989 save_Uniform4i64ARB(GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w)
6991 GET_CURRENT_CONTEXT(ctx);
6993 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
6994 n = alloc_instruction(ctx, OPCODE_UNIFORM_4I64, 9);
6997 ASSIGN_INT64_TO_NODES(n, 2, x);
6998 ASSIGN_INT64_TO_NODES(n, 4, y);
6999 ASSIGN_INT64_TO_NODES(n, 6, z);
7000 ASSIGN_INT64_TO_NODES(n, 8, w);
7002 if (ctx->ExecuteFlag) {
7003 CALL_Uniform4i64ARB(ctx->Exec, (location, x, y, z, w));
7008 save_Uniform1i64vARB(GLint location, GLsizei count, const GLint64 *v)
7010 GET_CURRENT_CONTEXT(ctx);
7012 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7013 n = alloc_instruction(ctx, OPCODE_UNIFORM_1I64V, 2 + POINTER_DWORDS);
7017 save_pointer(&n[3], memdup(v, count * 1 * sizeof(GLint64)));
7019 if (ctx->ExecuteFlag) {
7020 CALL_Uniform1i64vARB(ctx->Exec, (location, count, v));
7025 save_Uniform2i64vARB(GLint location, GLsizei count, const GLint64 *v)
7027 GET_CURRENT_CONTEXT(ctx);
7029 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7030 n = alloc_instruction(ctx, OPCODE_UNIFORM_2I64V, 2 + POINTER_DWORDS);
7034 save_pointer(&n[3], memdup(v, count * 2 * sizeof(GLint64)));
7036 if (ctx->ExecuteFlag) {
7037 CALL_Uniform2i64vARB(ctx->Exec, (location, count, v));
7042 save_Uniform3i64vARB(GLint location, GLsizei count, const GLint64 *v)
7044 GET_CURRENT_CONTEXT(ctx);
7046 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7047 n = alloc_instruction(ctx, OPCODE_UNIFORM_3I64V, 2 + POINTER_DWORDS);
7051 save_pointer(&n[3], memdup(v, count * 3 * sizeof(GLint64)));
7053 if (ctx->ExecuteFlag) {
7054 CALL_Uniform3i64vARB(ctx->Exec, (location, count, v));
7059 save_Uniform4i64vARB(GLint location, GLsizei count, const GLint64 *v)
7061 GET_CURRENT_CONTEXT(ctx);
7063 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7064 n = alloc_instruction(ctx, OPCODE_UNIFORM_4I64V, 2 + POINTER_DWORDS);
7068 save_pointer(&n[3], memdup(v, count * 4 * sizeof(GLint64)));
7070 if (ctx->ExecuteFlag) {
7071 CALL_Uniform4i64vARB(ctx->Exec, (location, count, v));
7076 save_Uniform1ui64ARB(GLint location, GLuint64 x)
7078 GET_CURRENT_CONTEXT(ctx);
7080 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7081 n = alloc_instruction(ctx, OPCODE_UNIFORM_1UI64, 3);
7084 ASSIGN_UINT64_TO_NODES(n, 2, x);
7086 if (ctx->ExecuteFlag) {
7087 CALL_Uniform1ui64ARB(ctx->Exec, (location, x));
7092 save_Uniform2ui64ARB(GLint location, GLuint64 x, GLuint64 y)
7094 GET_CURRENT_CONTEXT(ctx);
7096 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7097 n = alloc_instruction(ctx, OPCODE_UNIFORM_2UI64, 5);
7100 ASSIGN_UINT64_TO_NODES(n, 2, x);
7101 ASSIGN_UINT64_TO_NODES(n, 4, y);
7103 if (ctx->ExecuteFlag) {
7104 CALL_Uniform2ui64ARB(ctx->Exec, (location, x, y));
7109 save_Uniform3ui64ARB(GLint location, GLuint64 x, GLuint64 y, GLuint64 z)
7111 GET_CURRENT_CONTEXT(ctx);
7113 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7114 n = alloc_instruction(ctx, OPCODE_UNIFORM_3UI64, 7);
7117 ASSIGN_UINT64_TO_NODES(n, 2, x);
7118 ASSIGN_UINT64_TO_NODES(n, 4, y);
7119 ASSIGN_UINT64_TO_NODES(n, 6, z);
7121 if (ctx->ExecuteFlag) {
7122 CALL_Uniform3ui64ARB(ctx->Exec, (location, x, y, z));
7127 save_Uniform4ui64ARB(GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w)
7129 GET_CURRENT_CONTEXT(ctx);
7131 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7132 n = alloc_instruction(ctx, OPCODE_UNIFORM_4UI64, 9);
7135 ASSIGN_UINT64_TO_NODES(n, 2, x);
7136 ASSIGN_UINT64_TO_NODES(n, 4, y);
7137 ASSIGN_UINT64_TO_NODES(n, 6, z);
7138 ASSIGN_UINT64_TO_NODES(n, 8, w);
7140 if (ctx->ExecuteFlag) {
7141 CALL_Uniform4ui64ARB(ctx->Exec, (location, x, y, z, w));
7146 save_Uniform1ui64vARB(GLint location, GLsizei count, const GLuint64 *v)
7148 GET_CURRENT_CONTEXT(ctx);
7150 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7151 n = alloc_instruction(ctx, OPCODE_UNIFORM_1UI64V, 2 + POINTER_DWORDS);
7155 save_pointer(&n[3], memdup(v, count * 1 * sizeof(GLuint64)));
7157 if (ctx->ExecuteFlag) {
7158 CALL_Uniform1ui64vARB(ctx->Exec, (location, count, v));
7163 save_Uniform2ui64vARB(GLint location, GLsizei count, const GLuint64 *v)
7165 GET_CURRENT_CONTEXT(ctx);
7167 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7168 n = alloc_instruction(ctx, OPCODE_UNIFORM_2UI64V, 2 + POINTER_DWORDS);
7172 save_pointer(&n[3], memdup(v, count * 2 * sizeof(GLuint64)));
7174 if (ctx->ExecuteFlag) {
7175 CALL_Uniform2ui64vARB(ctx->Exec, (location, count, v));
7180 save_Uniform3ui64vARB(GLint location, GLsizei count, const GLuint64 *v)
7182 GET_CURRENT_CONTEXT(ctx);
7184 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7185 n = alloc_instruction(ctx, OPCODE_UNIFORM_3UI64V, 2 + POINTER_DWORDS);
7189 save_pointer(&n[3], memdup(v, count * 3 * sizeof(GLuint64)));
7191 if (ctx->ExecuteFlag) {
7192 CALL_Uniform3ui64vARB(ctx->Exec, (location, count, v));
7197 save_Uniform4ui64vARB(GLint location, GLsizei count, const GLuint64 *v)
7199 GET_CURRENT_CONTEXT(ctx);
7201 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7202 n = alloc_instruction(ctx, OPCODE_UNIFORM_4UI64V, 2 + POINTER_DWORDS);
7206 save_pointer(&n[3], memdup(v, count * 4 * sizeof(GLuint64)));
7208 if (ctx->ExecuteFlag) {
7209 CALL_Uniform4ui64vARB(ctx->Exec, (location, count, v));
7214 save_ProgramUniform1i64ARB(GLuint program, GLint location, GLint64 x)
7216 GET_CURRENT_CONTEXT(ctx);
7218 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7219 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1I64, 4);
7223 ASSIGN_INT64_TO_NODES(n, 3, x);
7225 if (ctx->ExecuteFlag) {
7226 CALL_ProgramUniform1i64ARB(ctx->Exec, (program, location, x));
7231 save_ProgramUniform2i64ARB(GLuint program, GLint location, GLint64 x,
7234 GET_CURRENT_CONTEXT(ctx);
7236 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7237 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2I64, 6);
7241 ASSIGN_INT64_TO_NODES(n, 3, x);
7242 ASSIGN_INT64_TO_NODES(n, 5, y);
7244 if (ctx->ExecuteFlag) {
7245 CALL_ProgramUniform2i64ARB(ctx->Exec, (program, location, x, y));
7250 save_ProgramUniform3i64ARB(GLuint program, GLint location, GLint64 x,
7251 GLint64 y, GLint64 z)
7253 GET_CURRENT_CONTEXT(ctx);
7255 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7256 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3I64, 8);
7260 ASSIGN_INT64_TO_NODES(n, 3, x);
7261 ASSIGN_INT64_TO_NODES(n, 5, y);
7262 ASSIGN_INT64_TO_NODES(n, 7, z);
7264 if (ctx->ExecuteFlag) {
7265 CALL_ProgramUniform3i64ARB(ctx->Exec, (program, location, x, y, z));
7270 save_ProgramUniform4i64ARB(GLuint program, GLint location, GLint64 x,
7271 GLint64 y, GLint64 z, GLint64 w)
7273 GET_CURRENT_CONTEXT(ctx);
7275 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7276 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4I64, 10);
7280 ASSIGN_INT64_TO_NODES(n, 3, x);
7281 ASSIGN_INT64_TO_NODES(n, 5, y);
7282 ASSIGN_INT64_TO_NODES(n, 7, z);
7283 ASSIGN_INT64_TO_NODES(n, 9, w);
7285 if (ctx->ExecuteFlag) {
7286 CALL_ProgramUniform4i64ARB(ctx->Exec, (program, location, x, y, z, w));
7291 save_ProgramUniform1i64vARB(GLuint program, GLint location, GLsizei count,
7294 GET_CURRENT_CONTEXT(ctx);
7296 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7297 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1I64V, 3 + POINTER_DWORDS);
7302 save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLint64)));
7304 if (ctx->ExecuteFlag) {
7305 CALL_ProgramUniform1i64vARB(ctx->Exec, (program, location, count, v));
7310 save_ProgramUniform2i64vARB(GLuint program, GLint location, GLsizei count,
7313 GET_CURRENT_CONTEXT(ctx);
7315 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7316 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2I64V, 3 + POINTER_DWORDS);
7321 save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLint64)));
7323 if (ctx->ExecuteFlag) {
7324 CALL_ProgramUniform2i64vARB(ctx->Exec, (program, location, count, v));
7329 save_ProgramUniform3i64vARB(GLuint program, GLint location, GLsizei count,
7332 GET_CURRENT_CONTEXT(ctx);
7334 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7335 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3I64V, 3 + POINTER_DWORDS);
7340 save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLint64)));
7342 if (ctx->ExecuteFlag) {
7343 CALL_ProgramUniform3i64vARB(ctx->Exec, (program, location, count, v));
7348 save_ProgramUniform4i64vARB(GLuint program, GLint location, GLsizei count,
7351 GET_CURRENT_CONTEXT(ctx);
7353 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7354 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4I64V, 3 + POINTER_DWORDS);
7359 save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLint64)));
7361 if (ctx->ExecuteFlag) {
7362 CALL_ProgramUniform4i64vARB(ctx->Exec, (program, location, count, v));
7367 save_ProgramUniform1ui64ARB(GLuint program, GLint location, GLuint64 x)
7369 GET_CURRENT_CONTEXT(ctx);
7371 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7372 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1UI64, 4);
7376 ASSIGN_UINT64_TO_NODES(n, 3, x);
7378 if (ctx->ExecuteFlag) {
7379 CALL_ProgramUniform1ui64ARB(ctx->Exec, (program, location, x));
7384 save_ProgramUniform2ui64ARB(GLuint program, GLint location, GLuint64 x,
7387 GET_CURRENT_CONTEXT(ctx);
7389 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7390 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2UI64, 6);
7394 ASSIGN_UINT64_TO_NODES(n, 3, x);
7395 ASSIGN_UINT64_TO_NODES(n, 5, y);
7397 if (ctx->ExecuteFlag) {
7398 CALL_ProgramUniform2ui64ARB(ctx->Exec, (program, location, x, y));
7403 save_ProgramUniform3ui64ARB(GLuint program, GLint location, GLuint64 x,
7404 GLuint64 y, GLuint64 z)
7406 GET_CURRENT_CONTEXT(ctx);
7408 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7409 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3UI64, 8);
7413 ASSIGN_UINT64_TO_NODES(n, 3, x);
7414 ASSIGN_UINT64_TO_NODES(n, 5, y);
7415 ASSIGN_UINT64_TO_NODES(n, 7, z);
7417 if (ctx->ExecuteFlag) {
7418 CALL_ProgramUniform3ui64ARB(ctx->Exec, (program, location, x, y, z));
7423 save_ProgramUniform4ui64ARB(GLuint program, GLint location, GLuint64 x,
7424 GLuint64 y, GLuint64 z, GLuint64 w)
7426 GET_CURRENT_CONTEXT(ctx);
7428 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7429 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4UI64, 10);
7433 ASSIGN_UINT64_TO_NODES(n, 3, x);
7434 ASSIGN_UINT64_TO_NODES(n, 5, y);
7435 ASSIGN_UINT64_TO_NODES(n, 7, z);
7436 ASSIGN_UINT64_TO_NODES(n, 9, w);
7438 if (ctx->ExecuteFlag) {
7439 CALL_ProgramUniform4i64ARB(ctx->Exec, (program, location, x, y, z, w));
7444 save_ProgramUniform1ui64vARB(GLuint program, GLint location, GLsizei count,
7447 GET_CURRENT_CONTEXT(ctx);
7449 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7450 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1UI64V,
7451 3 + POINTER_DWORDS);
7456 save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLuint64)));
7458 if (ctx->ExecuteFlag) {
7459 CALL_ProgramUniform1ui64vARB(ctx->Exec, (program, location, count, v));
7464 save_ProgramUniform2ui64vARB(GLuint program, GLint location, GLsizei count,
7467 GET_CURRENT_CONTEXT(ctx);
7469 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7470 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2UI64V,
7471 3 + POINTER_DWORDS);
7476 save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLuint64)));
7478 if (ctx->ExecuteFlag) {
7479 CALL_ProgramUniform2ui64vARB(ctx->Exec, (program, location, count, v));
7484 save_ProgramUniform3ui64vARB(GLuint program, GLint location, GLsizei count,
7487 GET_CURRENT_CONTEXT(ctx);
7489 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7490 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3UI64V,
7491 3 + POINTER_DWORDS);
7496 save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLuint64)));
7498 if (ctx->ExecuteFlag) {
7499 CALL_ProgramUniform3ui64vARB(ctx->Exec, (program, location, count, v));
7504 save_ProgramUniform4ui64vARB(GLuint program, GLint location, GLsizei count,
7507 GET_CURRENT_CONTEXT(ctx);
7509 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7510 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4UI64V,
7511 3 + POINTER_DWORDS);
7516 save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLuint64)));
7518 if (ctx->ExecuteFlag) {
7519 CALL_ProgramUniform4ui64vARB(ctx->Exec, (program, location, count, v));
7525 save_UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program)
7527 GET_CURRENT_CONTEXT(ctx);
7529 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7530 n = alloc_instruction(ctx, OPCODE_USE_PROGRAM_STAGES, 3);
7536 if (ctx->ExecuteFlag) {
7537 CALL_UseProgramStages(ctx->Exec, (pipeline, stages, program));
7542 save_ProgramUniform1f(GLuint program, GLint location, GLfloat x)
7544 GET_CURRENT_CONTEXT(ctx);
7546 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7547 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1F, 3);
7553 if (ctx->ExecuteFlag) {
7554 CALL_ProgramUniform1f(ctx->Exec, (program, location, x));
7559 save_ProgramUniform2f(GLuint program, GLint location, GLfloat x, GLfloat y)
7561 GET_CURRENT_CONTEXT(ctx);
7563 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7564 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2F, 4);
7571 if (ctx->ExecuteFlag) {
7572 CALL_ProgramUniform2f(ctx->Exec, (program, location, x, y));
7577 save_ProgramUniform3f(GLuint program, GLint location,
7578 GLfloat x, GLfloat y, GLfloat z)
7580 GET_CURRENT_CONTEXT(ctx);
7582 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7583 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3F, 5);
7591 if (ctx->ExecuteFlag) {
7592 CALL_ProgramUniform3f(ctx->Exec, (program, location, x, y, z));
7597 save_ProgramUniform4f(GLuint program, GLint location,
7598 GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7600 GET_CURRENT_CONTEXT(ctx);
7602 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7603 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4F, 6);
7612 if (ctx->ExecuteFlag) {
7613 CALL_ProgramUniform4f(ctx->Exec, (program, location, x, y, z, w));
7618 save_ProgramUniform1fv(GLuint program, GLint location, GLsizei count,
7621 GET_CURRENT_CONTEXT(ctx);
7623 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7624 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1FV, 3 + POINTER_DWORDS);
7629 save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLfloat)));
7631 if (ctx->ExecuteFlag) {
7632 CALL_ProgramUniform1fv(ctx->Exec, (program, location, count, v));
7637 save_ProgramUniform2fv(GLuint program, GLint location, GLsizei count,
7640 GET_CURRENT_CONTEXT(ctx);
7642 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7643 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2FV, 3 + POINTER_DWORDS);
7648 save_pointer(&n[4], memdup(v, count * 2 * sizeof(GLfloat)));
7650 if (ctx->ExecuteFlag) {
7651 CALL_ProgramUniform2fv(ctx->Exec, (program, location, count, v));
7656 save_ProgramUniform3fv(GLuint program, GLint location, GLsizei count,
7659 GET_CURRENT_CONTEXT(ctx);
7661 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7662 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3FV, 3 + POINTER_DWORDS);
7667 save_pointer(&n[4], memdup(v, count * 3 * sizeof(GLfloat)));
7669 if (ctx->ExecuteFlag) {
7670 CALL_ProgramUniform3fv(ctx->Exec, (program, location, count, v));
7675 save_ProgramUniform4fv(GLuint program, GLint location, GLsizei count,
7678 GET_CURRENT_CONTEXT(ctx);
7680 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7681 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4FV, 3 + POINTER_DWORDS);
7686 save_pointer(&n[4], memdup(v, count * 4 * sizeof(GLfloat)));
7688 if (ctx->ExecuteFlag) {
7689 CALL_ProgramUniform4fv(ctx->Exec, (program, location, count, v));
7694 save_ProgramUniform1d(GLuint program, GLint location, GLdouble x)
7696 GET_CURRENT_CONTEXT(ctx);
7698 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7699 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1D, 4);
7703 ASSIGN_DOUBLE_TO_NODES(n, 3, x);
7705 if (ctx->ExecuteFlag) {
7706 CALL_ProgramUniform1d(ctx->Exec, (program, location, x));
7711 save_ProgramUniform2d(GLuint program, GLint location, GLdouble x, GLdouble y)
7713 GET_CURRENT_CONTEXT(ctx);
7715 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7716 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2D, 6);
7720 ASSIGN_DOUBLE_TO_NODES(n, 3, x);
7721 ASSIGN_DOUBLE_TO_NODES(n, 5, y);
7723 if (ctx->ExecuteFlag) {
7724 CALL_ProgramUniform2d(ctx->Exec, (program, location, x, y));
7729 save_ProgramUniform3d(GLuint program, GLint location,
7730 GLdouble x, GLdouble y, GLdouble z)
7732 GET_CURRENT_CONTEXT(ctx);
7734 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7735 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3D, 8);
7739 ASSIGN_DOUBLE_TO_NODES(n, 3, x);
7740 ASSIGN_DOUBLE_TO_NODES(n, 5, y);
7741 ASSIGN_DOUBLE_TO_NODES(n, 7, z);
7743 if (ctx->ExecuteFlag) {
7744 CALL_ProgramUniform3d(ctx->Exec, (program, location, x, y, z));
7749 save_ProgramUniform4d(GLuint program, GLint location,
7750 GLdouble x, GLdouble y, GLdouble z, GLdouble w)
7752 GET_CURRENT_CONTEXT(ctx);
7754 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7755 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4D, 10);
7759 ASSIGN_DOUBLE_TO_NODES(n, 3, x);
7760 ASSIGN_DOUBLE_TO_NODES(n, 5, y);
7761 ASSIGN_DOUBLE_TO_NODES(n, 7, z);
7762 ASSIGN_DOUBLE_TO_NODES(n, 9, w);
7764 if (ctx->ExecuteFlag) {
7765 CALL_ProgramUniform4d(ctx->Exec, (program, location, x, y, z, w));
7770 save_ProgramUniform1dv(GLuint program, GLint location, GLsizei count,
7773 GET_CURRENT_CONTEXT(ctx);
7775 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7776 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1DV, 3 + POINTER_DWORDS);
7781 save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLdouble)));
7783 if (ctx->ExecuteFlag) {
7784 CALL_ProgramUniform1dv(ctx->Exec, (program, location, count, v));
7789 save_ProgramUniform2dv(GLuint program, GLint location, GLsizei count,
7792 GET_CURRENT_CONTEXT(ctx);
7794 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7795 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2DV, 3 + POINTER_DWORDS);
7800 save_pointer(&n[4], memdup(v, count * 2 * sizeof(GLdouble)));
7802 if (ctx->ExecuteFlag) {
7803 CALL_ProgramUniform2dv(ctx->Exec, (program, location, count, v));
7808 save_ProgramUniform3dv(GLuint program, GLint location, GLsizei count,
7811 GET_CURRENT_CONTEXT(ctx);
7813 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7814 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3DV, 3 + POINTER_DWORDS);
7819 save_pointer(&n[4], memdup(v, count * 3 * sizeof(GLdouble)));
7821 if (ctx->ExecuteFlag) {
7822 CALL_ProgramUniform3dv(ctx->Exec, (program, location, count, v));
7827 save_ProgramUniform4dv(GLuint program, GLint location, GLsizei count,
7830 GET_CURRENT_CONTEXT(ctx);
7832 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7833 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4DV, 3 + POINTER_DWORDS);
7838 save_pointer(&n[4], memdup(v, count * 4 * sizeof(GLdouble)));
7840 if (ctx->ExecuteFlag) {
7841 CALL_ProgramUniform4dv(ctx->Exec, (program, location, count, v));
7846 save_ProgramUniform1i(GLuint program, GLint location, GLint x)
7848 GET_CURRENT_CONTEXT(ctx);
7850 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7851 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1I, 3);
7857 if (ctx->ExecuteFlag) {
7858 CALL_ProgramUniform1i(ctx->Exec, (program, location, x));
7863 save_ProgramUniform2i(GLuint program, GLint location, GLint x, GLint y)
7865 GET_CURRENT_CONTEXT(ctx);
7867 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7868 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2I, 4);
7875 if (ctx->ExecuteFlag) {
7876 CALL_ProgramUniform2i(ctx->Exec, (program, location, x, y));
7881 save_ProgramUniform3i(GLuint program, GLint location,
7882 GLint x, GLint y, GLint z)
7884 GET_CURRENT_CONTEXT(ctx);
7886 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7887 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3I, 5);
7895 if (ctx->ExecuteFlag) {
7896 CALL_ProgramUniform3i(ctx->Exec, (program, location, x, y, z));
7901 save_ProgramUniform4i(GLuint program, GLint location,
7902 GLint x, GLint y, GLint z, GLint w)
7904 GET_CURRENT_CONTEXT(ctx);
7906 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7907 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4I, 6);
7916 if (ctx->ExecuteFlag) {
7917 CALL_ProgramUniform4i(ctx->Exec, (program, location, x, y, z, w));
7922 save_ProgramUniform1iv(GLuint program, GLint location, GLsizei count,
7925 GET_CURRENT_CONTEXT(ctx);
7927 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7928 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1IV, 3 + POINTER_DWORDS);
7933 save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLint)));
7935 if (ctx->ExecuteFlag) {
7936 CALL_ProgramUniform1iv(ctx->Exec, (program, location, count, v));
7941 save_ProgramUniform2iv(GLuint program, GLint location, GLsizei count,
7944 GET_CURRENT_CONTEXT(ctx);
7946 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7947 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2IV, 3 + POINTER_DWORDS);
7952 save_pointer(&n[4], memdup(v, count * 2 * sizeof(GLint)));
7954 if (ctx->ExecuteFlag) {
7955 CALL_ProgramUniform2iv(ctx->Exec, (program, location, count, v));
7960 save_ProgramUniform3iv(GLuint program, GLint location, GLsizei count,
7963 GET_CURRENT_CONTEXT(ctx);
7965 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7966 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3IV, 3 + POINTER_DWORDS);
7971 save_pointer(&n[4], memdup(v, count * 3 * sizeof(GLint)));
7973 if (ctx->ExecuteFlag) {
7974 CALL_ProgramUniform3iv(ctx->Exec, (program, location, count, v));
7979 save_ProgramUniform4iv(GLuint program, GLint location, GLsizei count,
7982 GET_CURRENT_CONTEXT(ctx);
7984 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
7985 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4IV, 3 + POINTER_DWORDS);
7990 save_pointer(&n[4], memdup(v, count * 4 * sizeof(GLint)));
7992 if (ctx->ExecuteFlag) {
7993 CALL_ProgramUniform4iv(ctx->Exec, (program, location, count, v));
7998 save_ProgramUniform1ui(GLuint program, GLint location, GLuint x)
8000 GET_CURRENT_CONTEXT(ctx);
8002 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8003 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1UI, 3);
8009 if (ctx->ExecuteFlag) {
8010 CALL_ProgramUniform1ui(ctx->Exec, (program, location, x));
8015 save_ProgramUniform2ui(GLuint program, GLint location, GLuint x, GLuint y)
8017 GET_CURRENT_CONTEXT(ctx);
8019 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8020 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2UI, 4);
8027 if (ctx->ExecuteFlag) {
8028 CALL_ProgramUniform2ui(ctx->Exec, (program, location, x, y));
8033 save_ProgramUniform3ui(GLuint program, GLint location,
8034 GLuint x, GLuint y, GLuint z)
8036 GET_CURRENT_CONTEXT(ctx);
8038 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8039 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3UI, 5);
8047 if (ctx->ExecuteFlag) {
8048 CALL_ProgramUniform3ui(ctx->Exec, (program, location, x, y, z));
8053 save_ProgramUniform4ui(GLuint program, GLint location,
8054 GLuint x, GLuint y, GLuint z, GLuint w)
8056 GET_CURRENT_CONTEXT(ctx);
8058 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8059 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4UI, 6);
8068 if (ctx->ExecuteFlag) {
8069 CALL_ProgramUniform4ui(ctx->Exec, (program, location, x, y, z, w));
8074 save_ProgramUniform1uiv(GLuint program, GLint location, GLsizei count,
8077 GET_CURRENT_CONTEXT(ctx);
8079 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8080 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_1UIV, 3 + POINTER_DWORDS);
8085 save_pointer(&n[4], memdup(v, count * 1 * sizeof(GLuint)));
8087 if (ctx->ExecuteFlag) {
8088 CALL_ProgramUniform1uiv(ctx->Exec, (program, location, count, v));
8093 save_ProgramUniform2uiv(GLuint program, GLint location, GLsizei count,
8096 GET_CURRENT_CONTEXT(ctx);
8098 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8099 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_2UIV, 3 + POINTER_DWORDS);
8104 save_pointer(&n[4], memdup(v, count * 2 * sizeof(GLuint)));
8106 if (ctx->ExecuteFlag) {
8107 CALL_ProgramUniform2uiv(ctx->Exec, (program, location, count, v));
8112 save_ProgramUniform3uiv(GLuint program, GLint location, GLsizei count,
8115 GET_CURRENT_CONTEXT(ctx);
8117 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8118 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_3UIV, 3 + POINTER_DWORDS);
8123 save_pointer(&n[4], memdup(v, count * 3 * sizeof(GLuint)));
8125 if (ctx->ExecuteFlag) {
8126 CALL_ProgramUniform3uiv(ctx->Exec, (program, location, count, v));
8131 save_ProgramUniform4uiv(GLuint program, GLint location, GLsizei count,
8134 GET_CURRENT_CONTEXT(ctx);
8136 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8137 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_4UIV, 3 + POINTER_DWORDS);
8142 save_pointer(&n[4], memdup(v, count * 4 * sizeof(GLuint)));
8144 if (ctx->ExecuteFlag) {
8145 CALL_ProgramUniform4uiv(ctx->Exec, (program, location, count, v));
8150 save_ProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count,
8151 GLboolean transpose, const GLfloat *v)
8153 GET_CURRENT_CONTEXT(ctx);
8155 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8156 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX22F,
8157 4 + POINTER_DWORDS);
8163 save_pointer(&n[5], memdup(v, count * 2 * 2 * sizeof(GLfloat)));
8165 if (ctx->ExecuteFlag) {
8166 CALL_ProgramUniformMatrix2fv(ctx->Exec,
8167 (program, location, count, transpose, v));
8172 save_ProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count,
8173 GLboolean transpose, const GLfloat *v)
8175 GET_CURRENT_CONTEXT(ctx);
8177 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8178 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX23F,
8179 4 + POINTER_DWORDS);
8185 save_pointer(&n[5], memdup(v, count * 2 * 3 * sizeof(GLfloat)));
8187 if (ctx->ExecuteFlag) {
8188 CALL_ProgramUniformMatrix2x3fv(ctx->Exec,
8189 (program, location, count, transpose, v));
8194 save_ProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count,
8195 GLboolean transpose, const GLfloat *v)
8197 GET_CURRENT_CONTEXT(ctx);
8199 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8200 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX24F,
8201 4 + POINTER_DWORDS);
8207 save_pointer(&n[5], memdup(v, count * 2 * 4 * sizeof(GLfloat)));
8209 if (ctx->ExecuteFlag) {
8210 CALL_ProgramUniformMatrix2x4fv(ctx->Exec,
8211 (program, location, count, transpose, v));
8216 save_ProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count,
8217 GLboolean transpose, const GLfloat *v)
8219 GET_CURRENT_CONTEXT(ctx);
8221 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8222 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX32F,
8223 4 + POINTER_DWORDS);
8229 save_pointer(&n[5], memdup(v, count * 3 * 2 * sizeof(GLfloat)));
8231 if (ctx->ExecuteFlag) {
8232 CALL_ProgramUniformMatrix3x2fv(ctx->Exec,
8233 (program, location, count, transpose, v));
8238 save_ProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count,
8239 GLboolean transpose, const GLfloat *v)
8241 GET_CURRENT_CONTEXT(ctx);
8243 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8244 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX33F,
8245 4 + POINTER_DWORDS);
8251 save_pointer(&n[5], memdup(v, count * 3 * 3 * sizeof(GLfloat)));
8253 if (ctx->ExecuteFlag) {
8254 CALL_ProgramUniformMatrix3fv(ctx->Exec,
8255 (program, location, count, transpose, v));
8260 save_ProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count,
8261 GLboolean transpose, const GLfloat *v)
8263 GET_CURRENT_CONTEXT(ctx);
8265 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8266 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX34F,
8267 4 + POINTER_DWORDS);
8273 save_pointer(&n[5], memdup(v, count * 3 * 4 * sizeof(GLfloat)));
8275 if (ctx->ExecuteFlag) {
8276 CALL_ProgramUniformMatrix3x4fv(ctx->Exec,
8277 (program, location, count, transpose, v));
8282 save_ProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count,
8283 GLboolean transpose, const GLfloat *v)
8285 GET_CURRENT_CONTEXT(ctx);
8287 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8288 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX42F,
8289 4 + POINTER_DWORDS);
8295 save_pointer(&n[5], memdup(v, count * 4 * 2 * sizeof(GLfloat)));
8297 if (ctx->ExecuteFlag) {
8298 CALL_ProgramUniformMatrix4x2fv(ctx->Exec,
8299 (program, location, count, transpose, v));
8304 save_ProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count,
8305 GLboolean transpose, const GLfloat *v)
8307 GET_CURRENT_CONTEXT(ctx);
8309 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8310 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX43F,
8311 4 + POINTER_DWORDS);
8317 save_pointer(&n[5], memdup(v, count * 4 * 3 * sizeof(GLfloat)));
8319 if (ctx->ExecuteFlag) {
8320 CALL_ProgramUniformMatrix4x3fv(ctx->Exec,
8321 (program, location, count, transpose, v));
8326 save_ProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count,
8327 GLboolean transpose, const GLfloat *v)
8329 GET_CURRENT_CONTEXT(ctx);
8331 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8332 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX44F,
8333 4 + POINTER_DWORDS);
8339 save_pointer(&n[5], memdup(v, count * 4 * 4 * sizeof(GLfloat)));
8341 if (ctx->ExecuteFlag) {
8342 CALL_ProgramUniformMatrix4fv(ctx->Exec,
8343 (program, location, count, transpose, v));
8348 save_ProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count,
8349 GLboolean transpose, const GLdouble *v)
8351 GET_CURRENT_CONTEXT(ctx);
8353 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8354 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX22D,
8355 4 + POINTER_DWORDS);
8361 save_pointer(&n[5], memdup(v, count * 2 * 2 * sizeof(GLdouble)));
8363 if (ctx->ExecuteFlag) {
8364 CALL_ProgramUniformMatrix2dv(ctx->Exec,
8365 (program, location, count, transpose, v));
8370 save_ProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count,
8371 GLboolean transpose, const GLdouble *v)
8373 GET_CURRENT_CONTEXT(ctx);
8375 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8376 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX23D,
8377 4 + POINTER_DWORDS);
8383 save_pointer(&n[5], memdup(v, count * 2 * 3 * sizeof(GLdouble)));
8385 if (ctx->ExecuteFlag) {
8386 CALL_ProgramUniformMatrix2x3dv(ctx->Exec,
8387 (program, location, count, transpose, v));
8392 save_ProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count,
8393 GLboolean transpose, const GLdouble *v)
8395 GET_CURRENT_CONTEXT(ctx);
8397 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8398 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX24D,
8399 4 + POINTER_DWORDS);
8405 save_pointer(&n[5], memdup(v, count * 2 * 4 * sizeof(GLdouble)));
8407 if (ctx->ExecuteFlag) {
8408 CALL_ProgramUniformMatrix2x4dv(ctx->Exec,
8409 (program, location, count, transpose, v));
8414 save_ProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count,
8415 GLboolean transpose, const GLdouble *v)
8417 GET_CURRENT_CONTEXT(ctx);
8419 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8420 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX32D,
8421 4 + POINTER_DWORDS);
8427 save_pointer(&n[5], memdup(v, count * 3 * 2 * sizeof(GLdouble)));
8429 if (ctx->ExecuteFlag) {
8430 CALL_ProgramUniformMatrix3x2dv(ctx->Exec,
8431 (program, location, count, transpose, v));
8436 save_ProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count,
8437 GLboolean transpose, const GLdouble *v)
8439 GET_CURRENT_CONTEXT(ctx);
8441 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8442 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX33D,
8443 4 + POINTER_DWORDS);
8449 save_pointer(&n[5], memdup(v, count * 3 * 3 * sizeof(GLdouble)));
8451 if (ctx->ExecuteFlag) {
8452 CALL_ProgramUniformMatrix3dv(ctx->Exec,
8453 (program, location, count, transpose, v));
8458 save_ProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count,
8459 GLboolean transpose, const GLdouble *v)
8461 GET_CURRENT_CONTEXT(ctx);
8463 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8464 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX34D,
8465 4 + POINTER_DWORDS);
8471 save_pointer(&n[5], memdup(v, count * 3 * 4 * sizeof(GLdouble)));
8473 if (ctx->ExecuteFlag) {
8474 CALL_ProgramUniformMatrix3x4dv(ctx->Exec,
8475 (program, location, count, transpose, v));
8480 save_ProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count,
8481 GLboolean transpose, const GLdouble *v)
8483 GET_CURRENT_CONTEXT(ctx);
8485 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8486 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX42D,
8487 4 + POINTER_DWORDS);
8493 save_pointer(&n[5], memdup(v, count * 4 * 2 * sizeof(GLdouble)));
8495 if (ctx->ExecuteFlag) {
8496 CALL_ProgramUniformMatrix4x2dv(ctx->Exec,
8497 (program, location, count, transpose, v));
8502 save_ProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count,
8503 GLboolean transpose, const GLdouble *v)
8505 GET_CURRENT_CONTEXT(ctx);
8507 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8508 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX43D,
8509 4 + POINTER_DWORDS);
8515 save_pointer(&n[5], memdup(v, count * 4 * 3 * sizeof(GLdouble)));
8517 if (ctx->ExecuteFlag) {
8518 CALL_ProgramUniformMatrix4x3dv(ctx->Exec,
8519 (program, location, count, transpose, v));
8524 save_ProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count,
8525 GLboolean transpose, const GLdouble *v)
8527 GET_CURRENT_CONTEXT(ctx);
8529 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8530 n = alloc_instruction(ctx, OPCODE_PROGRAM_UNIFORM_MATRIX44D,
8531 4 + POINTER_DWORDS);
8537 save_pointer(&n[5], memdup(v, count * 4 * 4 * sizeof(GLdouble)));
8539 if (ctx->ExecuteFlag) {
8540 CALL_ProgramUniformMatrix4dv(ctx->Exec,
8541 (program, location, count, transpose, v));
8546 save_ClipControl(GLenum origin, GLenum depth)
8548 GET_CURRENT_CONTEXT(ctx);
8550 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8551 n = alloc_instruction(ctx, OPCODE_CLIP_CONTROL, 2);
8556 if (ctx->ExecuteFlag) {
8557 CALL_ClipControl(ctx->Exec, (origin, depth));
8562 save_ClampColor(GLenum target, GLenum clamp)
8564 GET_CURRENT_CONTEXT(ctx);
8566 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8567 n = alloc_instruction(ctx, OPCODE_CLAMP_COLOR, 2);
8572 if (ctx->ExecuteFlag) {
8573 CALL_ClampColor(ctx->Exec, (target, clamp));
8577 /** GL_EXT_texture_integer */
8579 save_ClearColorIiEXT(GLint red, GLint green, GLint blue, GLint alpha)
8581 GET_CURRENT_CONTEXT(ctx);
8583 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8584 n = alloc_instruction(ctx, OPCODE_CLEARCOLOR_I, 4);
8591 if (ctx->ExecuteFlag) {
8592 CALL_ClearColorIiEXT(ctx->Exec, (red, green, blue, alpha));
8596 /** GL_EXT_texture_integer */
8598 save_ClearColorIuiEXT(GLuint red, GLuint green, GLuint blue, GLuint alpha)
8600 GET_CURRENT_CONTEXT(ctx);
8602 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8603 n = alloc_instruction(ctx, OPCODE_CLEARCOLOR_UI, 4);
8610 if (ctx->ExecuteFlag) {
8611 CALL_ClearColorIuiEXT(ctx->Exec, (red, green, blue, alpha));
8615 /** GL_EXT_texture_integer */
8617 save_TexParameterIiv(GLenum target, GLenum pname, const GLint *params)
8619 GET_CURRENT_CONTEXT(ctx);
8621 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8622 n = alloc_instruction(ctx, OPCODE_TEXPARAMETER_I, 6);
8631 if (ctx->ExecuteFlag) {
8632 CALL_TexParameterIiv(ctx->Exec, (target, pname, params));
8636 /** GL_EXT_texture_integer */
8638 save_TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params)
8640 GET_CURRENT_CONTEXT(ctx);
8642 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8643 n = alloc_instruction(ctx, OPCODE_TEXPARAMETER_UI, 6);
8647 n[3].ui = params[0];
8648 n[4].ui = params[1];
8649 n[5].ui = params[2];
8650 n[6].ui = params[3];
8652 if (ctx->ExecuteFlag) {
8653 CALL_TexParameterIuiv(ctx->Exec, (target, pname, params));
8657 /* GL_ARB_instanced_arrays */
8659 save_VertexAttribDivisor(GLuint index, GLuint divisor)
8661 GET_CURRENT_CONTEXT(ctx);
8663 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8664 n = alloc_instruction(ctx, OPCODE_VERTEX_ATTRIB_DIVISOR, 2);
8669 if (ctx->ExecuteFlag) {
8670 CALL_VertexAttribDivisor(ctx->Exec, (index, divisor));
8675 /* GL_NV_texture_barrier */
8677 save_TextureBarrierNV(void)
8679 GET_CURRENT_CONTEXT(ctx);
8680 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8681 alloc_instruction(ctx, OPCODE_TEXTURE_BARRIER_NV, 0);
8682 if (ctx->ExecuteFlag) {
8683 CALL_TextureBarrierNV(ctx->Exec, ());
8688 /* GL_ARB_sampler_objects */
8690 save_BindSampler(GLuint unit, GLuint sampler)
8693 GET_CURRENT_CONTEXT(ctx);
8694 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8695 n = alloc_instruction(ctx, OPCODE_BIND_SAMPLER, 2);
8700 if (ctx->ExecuteFlag) {
8701 CALL_BindSampler(ctx->Exec, (unit, sampler));
8706 save_SamplerParameteriv(GLuint sampler, GLenum pname, const GLint *params)
8709 GET_CURRENT_CONTEXT(ctx);
8710 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8711 n = alloc_instruction(ctx, OPCODE_SAMPLER_PARAMETERIV, 6);
8716 if (pname == GL_TEXTURE_BORDER_COLOR) {
8722 n[4].i = n[5].i = n[6].i = 0;
8725 if (ctx->ExecuteFlag) {
8726 CALL_SamplerParameteriv(ctx->Exec, (sampler, pname, params));
8731 save_SamplerParameteri(GLuint sampler, GLenum pname, GLint param)
8735 parray[1] = parray[2] = parray[3] = 0;
8736 save_SamplerParameteriv(sampler, pname, parray);
8740 save_SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat *params)
8743 GET_CURRENT_CONTEXT(ctx);
8744 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8745 n = alloc_instruction(ctx, OPCODE_SAMPLER_PARAMETERFV, 6);
8750 if (pname == GL_TEXTURE_BORDER_COLOR) {
8756 n[4].f = n[5].f = n[6].f = 0.0F;
8759 if (ctx->ExecuteFlag) {
8760 CALL_SamplerParameterfv(ctx->Exec, (sampler, pname, params));
8765 save_SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param)
8769 parray[1] = parray[2] = parray[3] = 0.0F;
8770 save_SamplerParameterfv(sampler, pname, parray);
8774 save_SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint *params)
8777 GET_CURRENT_CONTEXT(ctx);
8778 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8779 n = alloc_instruction(ctx, OPCODE_SAMPLER_PARAMETERIIV, 6);
8784 if (pname == GL_TEXTURE_BORDER_COLOR) {
8790 n[4].i = n[5].i = n[6].i = 0;
8793 if (ctx->ExecuteFlag) {
8794 CALL_SamplerParameterIiv(ctx->Exec, (sampler, pname, params));
8799 save_SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint *params)
8802 GET_CURRENT_CONTEXT(ctx);
8803 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8804 n = alloc_instruction(ctx, OPCODE_SAMPLER_PARAMETERUIV, 6);
8808 n[3].ui = params[0];
8809 if (pname == GL_TEXTURE_BORDER_COLOR) {
8810 n[4].ui = params[1];
8811 n[5].ui = params[2];
8812 n[6].ui = params[3];
8815 n[4].ui = n[5].ui = n[6].ui = 0;
8818 if (ctx->ExecuteFlag) {
8819 CALL_SamplerParameterIuiv(ctx->Exec, (sampler, pname, params));
8824 save_WaitSync(GLsync sync, GLbitfield flags, GLuint64 timeout)
8827 GET_CURRENT_CONTEXT(ctx);
8828 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8829 n = alloc_instruction(ctx, OPCODE_WAIT_SYNC, 4);
8831 union uint64_pair p;
8834 n[2].ui = p.uint32[0];
8835 n[3].ui = p.uint32[1];
8836 save_pointer(&n[4], sync);
8838 if (ctx->ExecuteFlag) {
8839 CALL_WaitSync(ctx->Exec, (sync, flags, timeout));
8844 /** GL_NV_conditional_render */
8846 save_BeginConditionalRender(GLuint queryId, GLenum mode)
8848 GET_CURRENT_CONTEXT(ctx);
8850 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8851 n = alloc_instruction(ctx, OPCODE_BEGIN_CONDITIONAL_RENDER, 2);
8856 if (ctx->ExecuteFlag) {
8857 CALL_BeginConditionalRender(ctx->Exec, (queryId, mode));
8862 save_EndConditionalRender(void)
8864 GET_CURRENT_CONTEXT(ctx);
8865 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8866 alloc_instruction(ctx, OPCODE_END_CONDITIONAL_RENDER, 0);
8867 if (ctx->ExecuteFlag) {
8868 CALL_EndConditionalRender(ctx->Exec, ());
8873 save_UniformBlockBinding(GLuint prog, GLuint index, GLuint binding)
8875 GET_CURRENT_CONTEXT(ctx);
8877 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8878 n = alloc_instruction(ctx, OPCODE_UNIFORM_BLOCK_BINDING, 3);
8884 if (ctx->ExecuteFlag) {
8885 CALL_UniformBlockBinding(ctx->Exec, (prog, index, binding));
8890 save_UniformSubroutinesuiv(GLenum shadertype, GLsizei count,
8891 const GLuint *indices)
8893 GET_CURRENT_CONTEXT(ctx);
8895 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8896 n = alloc_instruction(ctx, OPCODE_UNIFORM_SUBROUTINES, 2 + POINTER_DWORDS);
8898 GLint *indices_copy = NULL;
8901 indices_copy = memdup(indices, sizeof(GLuint) * 4 * count);
8902 n[1].e = shadertype;
8904 save_pointer(&n[3], indices_copy);
8906 if (ctx->ExecuteFlag) {
8907 CALL_UniformSubroutinesuiv(ctx->Exec, (shadertype, count, indices));
8911 /** GL_EXT_window_rectangles */
8913 save_WindowRectanglesEXT(GLenum mode, GLsizei count, const GLint *box)
8915 GET_CURRENT_CONTEXT(ctx);
8917 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8918 n = alloc_instruction(ctx, OPCODE_WINDOW_RECTANGLES, 2 + POINTER_DWORDS);
8920 GLint *box_copy = NULL;
8923 box_copy = memdup(box, sizeof(GLint) * 4 * count);
8926 save_pointer(&n[3], box_copy);
8928 if (ctx->ExecuteFlag) {
8929 CALL_WindowRectanglesEXT(ctx->Exec, (mode, count, box));
8934 /** GL_NV_conservative_raster */
8936 save_SubpixelPrecisionBiasNV(GLuint xbits, GLuint ybits)
8938 GET_CURRENT_CONTEXT(ctx);
8940 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8941 n = alloc_instruction(ctx, OPCODE_SUBPIXEL_PRECISION_BIAS, 2);
8946 if (ctx->ExecuteFlag) {
8947 CALL_SubpixelPrecisionBiasNV(ctx->Exec, (xbits, ybits));
8951 /** GL_NV_conservative_raster_dilate */
8953 save_ConservativeRasterParameterfNV(GLenum pname, GLfloat param)
8955 GET_CURRENT_CONTEXT(ctx);
8957 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8958 n = alloc_instruction(ctx, OPCODE_CONSERVATIVE_RASTER_PARAMETER_F, 2);
8963 if (ctx->ExecuteFlag) {
8964 CALL_ConservativeRasterParameterfNV(ctx->Exec, (pname, param));
8968 /** GL_NV_conservative_raster_pre_snap_triangles */
8970 save_ConservativeRasterParameteriNV(GLenum pname, GLint param)
8972 GET_CURRENT_CONTEXT(ctx);
8974 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8975 n = alloc_instruction(ctx, OPCODE_CONSERVATIVE_RASTER_PARAMETER_I, 2);
8980 if (ctx->ExecuteFlag) {
8981 CALL_ConservativeRasterParameteriNV(ctx->Exec, (pname, param));
8985 /** GL_EXT_direct_state_access */
8988 save_MatrixLoadfEXT(GLenum matrixMode, const GLfloat *m)
8990 GET_CURRENT_CONTEXT(ctx);
8992 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
8993 n = alloc_instruction(ctx, OPCODE_MATRIX_LOAD, 17);
8995 n[1].e = matrixMode;
8996 for (unsigned i = 0; i < 16; i++) {
9000 if (ctx->ExecuteFlag) {
9001 CALL_MatrixLoadfEXT(ctx->Exec, (matrixMode, m));
9006 save_MatrixLoaddEXT(GLenum matrixMode, const GLdouble *m)
9009 for (unsigned i = 0; i < 16; i++) {
9010 f[i] = (GLfloat) m[i];
9012 save_MatrixLoadfEXT(matrixMode, f);
9016 save_MatrixMultfEXT(GLenum matrixMode, const GLfloat * m)
9018 GET_CURRENT_CONTEXT(ctx);
9020 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9021 n = alloc_instruction(ctx, OPCODE_MATRIX_MULT, 17);
9023 n[1].e = matrixMode;
9024 for (unsigned i = 0; i < 16; i++) {
9028 if (ctx->ExecuteFlag) {
9029 CALL_MatrixMultfEXT(ctx->Exec, (matrixMode, m));
9034 save_MatrixMultdEXT(GLenum matrixMode, const GLdouble * m)
9037 for (unsigned i = 0; i < 16; i++) {
9038 f[i] = (GLfloat) m[i];
9040 save_MatrixMultfEXT(matrixMode, f);
9044 save_MatrixRotatefEXT(GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
9046 GET_CURRENT_CONTEXT(ctx);
9048 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9049 n = alloc_instruction(ctx, OPCODE_MATRIX_ROTATE, 5);
9051 n[1].e = matrixMode;
9057 if (ctx->ExecuteFlag) {
9058 CALL_MatrixRotatefEXT(ctx->Exec, (matrixMode, angle, x, y, z));
9063 save_MatrixRotatedEXT(GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z)
9065 save_MatrixRotatefEXT(matrixMode, (GLfloat) angle, (GLfloat) x, (GLfloat) y, (GLfloat) z);
9069 save_MatrixScalefEXT(GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z)
9071 GET_CURRENT_CONTEXT(ctx);
9073 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9074 n = alloc_instruction(ctx, OPCODE_MATRIX_SCALE, 4);
9076 n[1].e = matrixMode;
9081 if (ctx->ExecuteFlag) {
9082 CALL_MatrixScalefEXT(ctx->Exec, (matrixMode, x, y, z));
9087 save_MatrixScaledEXT(GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z)
9089 save_MatrixScalefEXT(matrixMode, (GLfloat) x, (GLfloat) y, (GLfloat) z);
9093 save_MatrixTranslatefEXT(GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z)
9095 GET_CURRENT_CONTEXT(ctx);
9097 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9098 n = alloc_instruction(ctx, OPCODE_MATRIX_TRANSLATE, 4);
9100 n[1].e = matrixMode;
9105 if (ctx->ExecuteFlag) {
9106 CALL_MatrixTranslatefEXT(ctx->Exec, (matrixMode, x, y, z));
9111 save_MatrixTranslatedEXT(GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z)
9113 save_MatrixTranslatefEXT(matrixMode, (GLfloat) x, (GLfloat) y, (GLfloat) z);
9117 save_MatrixLoadIdentityEXT(GLenum matrixMode)
9119 GET_CURRENT_CONTEXT(ctx);
9121 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9122 n = alloc_instruction(ctx, OPCODE_MATRIX_LOAD_IDENTITY, 1);
9124 n[1].e = matrixMode;
9126 if (ctx->ExecuteFlag) {
9127 CALL_MatrixLoadIdentityEXT(ctx->Exec, (matrixMode));
9132 save_MatrixOrthoEXT(GLenum matrixMode, GLdouble left, GLdouble right,
9133 GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval)
9135 GET_CURRENT_CONTEXT(ctx);
9137 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9138 n = alloc_instruction(ctx, OPCODE_MATRIX_ORTHO, 7);
9140 n[1].e = matrixMode;
9141 n[2].f = (GLfloat) left;
9142 n[3].f = (GLfloat) right;
9143 n[4].f = (GLfloat) bottom;
9144 n[5].f = (GLfloat) top;
9145 n[6].f = (GLfloat) nearval;
9146 n[7].f = (GLfloat) farval;
9148 if (ctx->ExecuteFlag) {
9149 CALL_MatrixOrthoEXT(ctx->Exec, (matrixMode, left, right, bottom, top, nearval, farval));
9155 save_MatrixFrustumEXT(GLenum matrixMode, GLdouble left, GLdouble right,
9156 GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval)
9158 GET_CURRENT_CONTEXT(ctx);
9160 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9161 n = alloc_instruction(ctx, OPCODE_MATRIX_FRUSTUM, 7);
9163 n[1].e = matrixMode;
9164 n[2].f = (GLfloat) left;
9165 n[3].f = (GLfloat) right;
9166 n[4].f = (GLfloat) bottom;
9167 n[5].f = (GLfloat) top;
9168 n[6].f = (GLfloat) nearval;
9169 n[7].f = (GLfloat) farval;
9171 if (ctx->ExecuteFlag) {
9172 CALL_MatrixFrustumEXT(ctx->Exec, (matrixMode, left, right, bottom, top, nearval, farval));
9177 save_MatrixPushEXT(GLenum matrixMode)
9179 GET_CURRENT_CONTEXT(ctx);
9181 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9182 n = alloc_instruction(ctx, OPCODE_MATRIX_PUSH, 1);
9184 n[1].e = matrixMode;
9186 if (ctx->ExecuteFlag) {
9187 CALL_MatrixPushEXT(ctx->Exec, (matrixMode));
9192 save_MatrixPopEXT(GLenum matrixMode)
9194 GET_CURRENT_CONTEXT(ctx);
9196 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9197 n = alloc_instruction(ctx, OPCODE_MATRIX_POP, 1);
9199 n[1].e = matrixMode;
9201 if (ctx->ExecuteFlag) {
9202 CALL_MatrixPopEXT(ctx->Exec, (matrixMode));
9207 save_MatrixLoadTransposefEXT(GLenum matrixMode, const GLfloat *m)
9210 _math_transposef(tm, m);
9211 save_MatrixLoadfEXT(matrixMode, tm);
9215 save_MatrixLoadTransposedEXT(GLenum matrixMode, const GLdouble *m)
9218 _math_transposefd(tm, m);
9219 save_MatrixLoadfEXT(matrixMode, tm);
9223 save_MatrixMultTransposefEXT(GLenum matrixMode, const GLfloat *m)
9226 _math_transposef(tm, m);
9227 save_MatrixMultfEXT(matrixMode, tm);
9231 save_MatrixMultTransposedEXT(GLenum matrixMode, const GLdouble *m)
9234 _math_transposefd(tm, m);
9235 save_MatrixMultfEXT(matrixMode, tm);
9239 save_TextureParameterfvEXT(GLuint texture, GLenum target, GLenum pname,
9240 const GLfloat *params)
9242 GET_CURRENT_CONTEXT(ctx);
9244 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9245 n = alloc_instruction(ctx, OPCODE_TEXTUREPARAMETER_F, 7);
9255 if (ctx->ExecuteFlag) {
9256 CALL_TextureParameterfvEXT(ctx->Exec, (texture, target, pname, params));
9262 save_TextureParameterfEXT(GLuint texture, GLenum target, GLenum pname, GLfloat param)
9266 parray[1] = parray[2] = parray[3] = 0.0F;
9267 save_TextureParameterfvEXT(texture, target, pname, parray);
9271 save_TextureParameterivEXT(GLuint texture, GLenum target, GLenum pname, const GLint *params)
9273 GET_CURRENT_CONTEXT(ctx);
9275 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9276 n = alloc_instruction(ctx, OPCODE_TEXTUREPARAMETER_I, 7);
9286 if (ctx->ExecuteFlag) {
9287 CALL_TextureParameterivEXT(ctx->Exec, (texture, target, pname, params));
9292 save_TextureParameteriEXT(GLuint texture, GLenum target, GLenum pname, GLint param)
9296 fparam[1] = fparam[2] = fparam[3] = 0;
9297 save_TextureParameterivEXT(texture, target, pname, fparam);
9301 save_TextureParameterIivEXT(GLuint texture, GLenum target, GLenum pname, const GLint* params)
9303 GET_CURRENT_CONTEXT(ctx);
9305 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9306 n = alloc_instruction(ctx, OPCODE_TEXTUREPARAMETER_II, 7);
9316 if (ctx->ExecuteFlag) {
9317 CALL_TextureParameterIivEXT(ctx->Exec, (texture, target, pname, params));
9322 save_TextureParameterIuivEXT(GLuint texture, GLenum target, GLenum pname, const GLuint* params)
9324 GET_CURRENT_CONTEXT(ctx);
9326 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9327 n = alloc_instruction(ctx, OPCODE_TEXTUREPARAMETER_IUI, 7);
9332 n[4].ui = params[0];
9333 n[5].ui = params[1];
9334 n[6].ui = params[2];
9335 n[7].ui = params[3];
9337 if (ctx->ExecuteFlag) {
9338 CALL_TextureParameterIuivEXT(ctx->Exec, (texture, target, pname, params));
9344 save_TextureImage1DEXT(GLuint texture, GLenum target,
9345 GLint level, GLint components,
9346 GLsizei width, GLint border,
9347 GLenum format, GLenum type, const GLvoid * pixels)
9349 GET_CURRENT_CONTEXT(ctx);
9350 if (target == GL_PROXY_TEXTURE_1D) {
9351 /* don't compile, execute immediately */
9352 CALL_TextureImage1DEXT(ctx->Exec, (texture, target, level, components, width,
9353 border, format, type, pixels));
9357 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9358 n = alloc_instruction(ctx, OPCODE_TEXTURE_IMAGE1D, 8 + POINTER_DWORDS);
9363 n[4].i = components;
9364 n[5].i = (GLint) width;
9369 unpack_image(ctx, 1, width, 1, 1, format, type,
9370 pixels, &ctx->Unpack));
9372 if (ctx->ExecuteFlag) {
9373 CALL_TextureImage1DEXT(ctx->Exec, (texture, target, level, components, width,
9374 border, format, type, pixels));
9381 save_TextureImage2DEXT(GLuint texture, GLenum target,
9382 GLint level, GLint components,
9383 GLsizei width, GLsizei height, GLint border,
9384 GLenum format, GLenum type, const GLvoid * pixels)
9386 GET_CURRENT_CONTEXT(ctx);
9387 if (target == GL_PROXY_TEXTURE_2D) {
9388 /* don't compile, execute immediately */
9389 CALL_TextureImage2DEXT(ctx->Exec, (texture, target, level, components, width,
9390 height, border, format, type, pixels));
9394 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9395 n = alloc_instruction(ctx, OPCODE_TEXTURE_IMAGE2D, 9 + POINTER_DWORDS);
9400 n[4].i = components;
9401 n[5].i = (GLint) width;
9402 n[6].i = (GLint) height;
9406 save_pointer(&n[10],
9407 unpack_image(ctx, 2, width, height, 1, format, type,
9408 pixels, &ctx->Unpack));
9410 if (ctx->ExecuteFlag) {
9411 CALL_TextureImage2DEXT(ctx->Exec, (texture, target, level, components, width,
9412 height, border, format, type, pixels));
9419 save_TextureImage3DEXT(GLuint texture, GLenum target,
9420 GLint level, GLint internalFormat,
9421 GLsizei width, GLsizei height, GLsizei depth,
9423 GLenum format, GLenum type, const GLvoid * pixels)
9425 GET_CURRENT_CONTEXT(ctx);
9426 if (target == GL_PROXY_TEXTURE_3D) {
9427 /* don't compile, execute immediately */
9428 CALL_TextureImage3DEXT(ctx->Exec, (texture, target, level, internalFormat, width,
9429 height, depth, border, format, type,
9434 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9435 n = alloc_instruction(ctx, OPCODE_TEXTURE_IMAGE3D, 10 + POINTER_DWORDS);
9440 n[4].i = (GLint) internalFormat;
9441 n[5].i = (GLint) width;
9442 n[6].i = (GLint) height;
9443 n[7].i = (GLint) depth;
9447 save_pointer(&n[11],
9448 unpack_image(ctx, 3, width, height, depth, format, type,
9449 pixels, &ctx->Unpack));
9451 if (ctx->ExecuteFlag) {
9452 CALL_TextureImage3DEXT(ctx->Exec, (texture, target, level, internalFormat,
9453 width, height, depth, border, format,
9461 save_TextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset,
9462 GLsizei width, GLenum format, GLenum type,
9463 const GLvoid * pixels)
9465 GET_CURRENT_CONTEXT(ctx);
9468 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9470 n = alloc_instruction(ctx, OPCODE_TEXTURE_SUB_IMAGE1D, 7 + POINTER_DWORDS);
9476 n[5].i = (GLint) width;
9480 unpack_image(ctx, 1, width, 1, 1, format, type,
9481 pixels, &ctx->Unpack));
9483 if (ctx->ExecuteFlag) {
9484 CALL_TextureSubImage1DEXT(ctx->Exec, (texture, target, level, xoffset, width,
9485 format, type, pixels));
9491 save_TextureSubImage2DEXT(GLuint texture, GLenum target, GLint level,
9492 GLint xoffset, GLint yoffset,
9493 GLsizei width, GLsizei height,
9494 GLenum format, GLenum type, const GLvoid * pixels)
9496 GET_CURRENT_CONTEXT(ctx);
9499 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9501 n = alloc_instruction(ctx, OPCODE_TEXTURE_SUB_IMAGE2D, 9 + POINTER_DWORDS);
9508 n[6].i = (GLint) width;
9509 n[7].i = (GLint) height;
9512 save_pointer(&n[10],
9513 unpack_image(ctx, 2, width, height, 1, format, type,
9514 pixels, &ctx->Unpack));
9516 if (ctx->ExecuteFlag) {
9517 CALL_TextureSubImage2DEXT(ctx->Exec, (texture, target, level, xoffset, yoffset,
9518 width, height, format, type, pixels));
9524 save_TextureSubImage3DEXT(GLuint texture, GLenum target, GLint level,
9525 GLint xoffset, GLint yoffset, GLint zoffset,
9526 GLsizei width, GLsizei height, GLsizei depth,
9527 GLenum format, GLenum type, const GLvoid * pixels)
9529 GET_CURRENT_CONTEXT(ctx);
9532 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9534 n = alloc_instruction(ctx, OPCODE_TEXTURE_SUB_IMAGE3D, 11 + POINTER_DWORDS);
9542 n[7].i = (GLint) width;
9543 n[8].i = (GLint) height;
9544 n[9].i = (GLint) depth;
9547 save_pointer(&n[12],
9548 unpack_image(ctx, 3, width, height, depth, format, type,
9549 pixels, &ctx->Unpack));
9551 if (ctx->ExecuteFlag) {
9552 CALL_TextureSubImage3DEXT(ctx->Exec, (texture, target, level,
9553 xoffset, yoffset, zoffset,
9554 width, height, depth, format, type,
9560 save_CopyTextureImage1DEXT(GLuint texture, GLenum target, GLint level,
9561 GLenum internalformat, GLint x, GLint y,
9562 GLsizei width, GLint border)
9564 GET_CURRENT_CONTEXT(ctx);
9566 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9567 n = alloc_instruction(ctx, OPCODE_COPY_TEXTURE_IMAGE1D, 8);
9572 n[4].e = internalformat;
9578 if (ctx->ExecuteFlag) {
9579 CALL_CopyTextureImage1DEXT(ctx->Exec, (texture, target, level,
9580 internalformat, x, y,
9586 save_CopyTextureImage2DEXT(GLuint texture, GLenum target, GLint level,
9587 GLenum internalformat,
9588 GLint x, GLint y, GLsizei width,
9589 GLsizei height, GLint border)
9591 GET_CURRENT_CONTEXT(ctx);
9593 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9594 n = alloc_instruction(ctx, OPCODE_COPY_TEXTURE_IMAGE2D, 9);
9599 n[4].e = internalformat;
9606 if (ctx->ExecuteFlag) {
9607 CALL_CopyTextureImage2DEXT(ctx->Exec, (texture, target, level,
9608 internalformat, x, y,
9609 width, height, border));
9614 save_CopyTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level,
9615 GLint xoffset, GLint x, GLint y, GLsizei width)
9617 GET_CURRENT_CONTEXT(ctx);
9619 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9620 n = alloc_instruction(ctx, OPCODE_COPY_TEXTURE_SUB_IMAGE1D, 7);
9630 if (ctx->ExecuteFlag) {
9631 CALL_CopyTextureSubImage1DEXT(ctx->Exec,
9632 (texture, target, level, xoffset, x, y, width));
9637 save_CopyTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level,
9638 GLint xoffset, GLint yoffset,
9639 GLint x, GLint y, GLsizei width, GLint height)
9641 GET_CURRENT_CONTEXT(ctx);
9643 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9644 n = alloc_instruction(ctx, OPCODE_COPY_TEXTURE_SUB_IMAGE2D, 9);
9656 if (ctx->ExecuteFlag) {
9657 CALL_CopyTextureSubImage2DEXT(ctx->Exec, (texture, target, level,
9659 x, y, width, height));
9665 save_CopyTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level,
9666 GLint xoffset, GLint yoffset, GLint zoffset,
9667 GLint x, GLint y, GLsizei width, GLint height)
9669 GET_CURRENT_CONTEXT(ctx);
9671 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9672 n = alloc_instruction(ctx, OPCODE_COPY_TEXTURE_SUB_IMAGE3D, 10);
9685 if (ctx->ExecuteFlag) {
9686 CALL_CopyTextureSubImage3DEXT(ctx->Exec, (texture, target, level,
9687 xoffset, yoffset, zoffset,
9688 x, y, width, height));
9694 save_BindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture)
9696 GET_CURRENT_CONTEXT(ctx);
9698 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9699 n = alloc_instruction(ctx, OPCODE_BIND_MULTITEXTURE, 3);
9705 if (ctx->ExecuteFlag) {
9706 CALL_BindMultiTextureEXT(ctx->Exec, (texunit, target, texture));
9712 save_MultiTexParameterfvEXT(GLenum texunit, GLenum target, GLenum pname,
9713 const GLfloat *params)
9715 GET_CURRENT_CONTEXT(ctx);
9717 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9718 n = alloc_instruction(ctx, OPCODE_MULTITEXPARAMETER_F, 7);
9728 if (ctx->ExecuteFlag) {
9729 CALL_MultiTexParameterfvEXT(ctx->Exec, (texunit, target, pname, params));
9735 save_MultiTexParameterfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param)
9739 parray[1] = parray[2] = parray[3] = 0.0F;
9740 save_MultiTexParameterfvEXT(texunit, target, pname, parray);
9744 save_MultiTexParameterivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint *params)
9746 GET_CURRENT_CONTEXT(ctx);
9748 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9749 n = alloc_instruction(ctx, OPCODE_MULTITEXPARAMETER_I, 7);
9759 if (ctx->ExecuteFlag) {
9760 CALL_MultiTexParameterivEXT(ctx->Exec, (texunit, target, pname, params));
9765 save_MultiTexParameterIivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint *params)
9767 GET_CURRENT_CONTEXT(ctx);
9769 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9770 n = alloc_instruction(ctx, OPCODE_MULTITEXPARAMETER_II, 7);
9780 if (ctx->ExecuteFlag) {
9781 CALL_MultiTexParameterIivEXT(ctx->Exec, (texunit, target, pname, params));
9786 save_MultiTexParameterIuivEXT(GLenum texunit, GLenum target, GLenum pname, const GLuint *params)
9788 GET_CURRENT_CONTEXT(ctx);
9790 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9791 n = alloc_instruction(ctx, OPCODE_MULTITEXPARAMETER_IUI, 7);
9796 n[4].ui = params[0];
9797 n[5].ui = params[1];
9798 n[6].ui = params[2];
9799 n[7].ui = params[3];
9801 if (ctx->ExecuteFlag) {
9802 CALL_MultiTexParameterIuivEXT(ctx->Exec, (texunit, target, pname, params));
9807 save_MultiTexParameteriEXT(GLenum texunit, GLenum target, GLenum pname, GLint param)
9811 fparam[1] = fparam[2] = fparam[3] = 0;
9812 save_MultiTexParameterivEXT(texunit, target, pname, fparam);
9817 save_MultiTexImage1DEXT(GLenum texunit, GLenum target,
9818 GLint level, GLint components,
9819 GLsizei width, GLint border,
9820 GLenum format, GLenum type, const GLvoid * pixels)
9822 GET_CURRENT_CONTEXT(ctx);
9823 if (target == GL_PROXY_TEXTURE_1D) {
9824 /* don't compile, execute immediately */
9825 CALL_MultiTexImage1DEXT(ctx->Exec, (texunit, target, level, components, width,
9826 border, format, type, pixels));
9830 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9831 n = alloc_instruction(ctx, OPCODE_MULTITEX_IMAGE1D, 8 + POINTER_DWORDS);
9836 n[4].i = components;
9837 n[5].i = (GLint) width;
9842 unpack_image(ctx, 1, width, 1, 1, format, type,
9843 pixels, &ctx->Unpack));
9845 if (ctx->ExecuteFlag) {
9846 CALL_MultiTexImage1DEXT(ctx->Exec, (texunit, target, level, components, width,
9847 border, format, type, pixels));
9854 save_MultiTexImage2DEXT(GLenum texunit, GLenum target,
9855 GLint level, GLint components,
9856 GLsizei width, GLsizei height, GLint border,
9857 GLenum format, GLenum type, const GLvoid * pixels)
9859 GET_CURRENT_CONTEXT(ctx);
9860 if (target == GL_PROXY_TEXTURE_2D) {
9861 /* don't compile, execute immediately */
9862 CALL_MultiTexImage2DEXT(ctx->Exec, (texunit, target, level, components, width,
9863 height, border, format, type, pixels));
9867 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9868 n = alloc_instruction(ctx, OPCODE_MULTITEX_IMAGE2D, 9 + POINTER_DWORDS);
9873 n[4].i = components;
9874 n[5].i = (GLint) width;
9875 n[6].i = (GLint) height;
9879 save_pointer(&n[10],
9880 unpack_image(ctx, 2, width, height, 1, format, type,
9881 pixels, &ctx->Unpack));
9883 if (ctx->ExecuteFlag) {
9884 CALL_MultiTexImage2DEXT(ctx->Exec, (texunit, target, level, components, width,
9885 height, border, format, type, pixels));
9892 save_MultiTexImage3DEXT(GLenum texunit, GLenum target,
9893 GLint level, GLint internalFormat,
9894 GLsizei width, GLsizei height, GLsizei depth,
9896 GLenum format, GLenum type, const GLvoid * pixels)
9898 GET_CURRENT_CONTEXT(ctx);
9899 if (target == GL_PROXY_TEXTURE_3D) {
9900 /* don't compile, execute immediately */
9901 CALL_MultiTexImage3DEXT(ctx->Exec, (texunit, target, level, internalFormat, width,
9902 height, depth, border, format, type,
9907 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9908 n = alloc_instruction(ctx, OPCODE_MULTITEX_IMAGE3D, 10 + POINTER_DWORDS);
9913 n[4].i = (GLint) internalFormat;
9914 n[5].i = (GLint) width;
9915 n[6].i = (GLint) height;
9916 n[7].i = (GLint) depth;
9920 save_pointer(&n[11],
9921 unpack_image(ctx, 3, width, height, depth, format, type,
9922 pixels, &ctx->Unpack));
9924 if (ctx->ExecuteFlag) {
9925 CALL_MultiTexImage3DEXT(ctx->Exec, (texunit, target, level, internalFormat,
9926 width, height, depth, border, format,
9934 save_MultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset,
9935 GLsizei width, GLenum format, GLenum type,
9936 const GLvoid * pixels)
9938 GET_CURRENT_CONTEXT(ctx);
9941 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9943 n = alloc_instruction(ctx, OPCODE_MULTITEX_SUB_IMAGE1D, 7 + POINTER_DWORDS);
9949 n[5].i = (GLint) width;
9953 unpack_image(ctx, 1, width, 1, 1, format, type,
9954 pixels, &ctx->Unpack));
9956 if (ctx->ExecuteFlag) {
9957 CALL_MultiTexSubImage1DEXT(ctx->Exec, (texunit, target, level, xoffset, width,
9958 format, type, pixels));
9964 save_MultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level,
9965 GLint xoffset, GLint yoffset,
9966 GLsizei width, GLsizei height,
9967 GLenum format, GLenum type, const GLvoid * pixels)
9969 GET_CURRENT_CONTEXT(ctx);
9972 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
9974 n = alloc_instruction(ctx, OPCODE_MULTITEX_SUB_IMAGE2D, 9 + POINTER_DWORDS);
9981 n[6].i = (GLint) width;
9982 n[7].i = (GLint) height;
9985 save_pointer(&n[10],
9986 unpack_image(ctx, 2, width, height, 1, format, type,
9987 pixels, &ctx->Unpack));
9989 if (ctx->ExecuteFlag) {
9990 CALL_MultiTexSubImage2DEXT(ctx->Exec, (texunit, target, level, xoffset, yoffset,
9991 width, height, format, type, pixels));
9997 save_MultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level,
9998 GLint xoffset, GLint yoffset, GLint zoffset,
9999 GLsizei width, GLsizei height, GLsizei depth,
10000 GLenum format, GLenum type, const GLvoid * pixels)
10002 GET_CURRENT_CONTEXT(ctx);
10005 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10007 n = alloc_instruction(ctx, OPCODE_MULTITEX_SUB_IMAGE3D, 11 + POINTER_DWORDS);
10015 n[7].i = (GLint) width;
10016 n[8].i = (GLint) height;
10017 n[9].i = (GLint) depth;
10020 save_pointer(&n[12],
10021 unpack_image(ctx, 3, width, height, depth, format, type,
10022 pixels, &ctx->Unpack));
10024 if (ctx->ExecuteFlag) {
10025 CALL_MultiTexSubImage3DEXT(ctx->Exec, (texunit, target, level,
10026 xoffset, yoffset, zoffset,
10027 width, height, depth, format, type,
10034 save_CopyMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level,
10035 GLenum internalformat, GLint x, GLint y,
10036 GLsizei width, GLint border)
10038 GET_CURRENT_CONTEXT(ctx);
10040 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10041 n = alloc_instruction(ctx, OPCODE_COPY_MULTITEX_IMAGE1D, 8);
10046 n[4].e = internalformat;
10052 if (ctx->ExecuteFlag) {
10053 CALL_CopyMultiTexImage1DEXT(ctx->Exec, (texunit, target, level,
10054 internalformat, x, y,
10061 save_CopyMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level,
10062 GLenum internalformat,
10063 GLint x, GLint y, GLsizei width,
10064 GLsizei height, GLint border)
10066 GET_CURRENT_CONTEXT(ctx);
10068 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10069 n = alloc_instruction(ctx, OPCODE_COPY_MULTITEX_IMAGE2D, 9);
10074 n[4].e = internalformat;
10081 if (ctx->ExecuteFlag) {
10082 CALL_CopyMultiTexImage2DEXT(ctx->Exec, (texunit, target, level,
10083 internalformat, x, y,
10084 width, height, border));
10090 save_CopyMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level,
10091 GLint xoffset, GLint x, GLint y, GLsizei width)
10093 GET_CURRENT_CONTEXT(ctx);
10095 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10096 n = alloc_instruction(ctx, OPCODE_COPY_MULTITEX_SUB_IMAGE1D, 7);
10106 if (ctx->ExecuteFlag) {
10107 CALL_CopyMultiTexSubImage1DEXT(ctx->Exec,
10108 (texunit, target, level, xoffset, x, y, width));
10114 save_CopyMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level,
10115 GLint xoffset, GLint yoffset,
10116 GLint x, GLint y, GLsizei width, GLint height)
10118 GET_CURRENT_CONTEXT(ctx);
10120 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10121 n = alloc_instruction(ctx, OPCODE_COPY_MULTITEX_SUB_IMAGE2D, 9);
10133 if (ctx->ExecuteFlag) {
10134 CALL_CopyMultiTexSubImage2DEXT(ctx->Exec, (texunit, target, level,
10136 x, y, width, height));
10142 save_CopyMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level,
10143 GLint xoffset, GLint yoffset, GLint zoffset,
10144 GLint x, GLint y, GLsizei width, GLint height)
10146 GET_CURRENT_CONTEXT(ctx);
10148 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10149 n = alloc_instruction(ctx, OPCODE_COPY_MULTITEX_SUB_IMAGE3D, 10);
10162 if (ctx->ExecuteFlag) {
10163 CALL_CopyMultiTexSubImage3DEXT(ctx->Exec, (texunit, target, level,
10164 xoffset, yoffset, zoffset,
10165 x, y, width, height));
10171 save_MultiTexEnvfvEXT(GLenum texunit, GLenum target, GLenum pname, const GLfloat *params)
10173 GET_CURRENT_CONTEXT(ctx);
10175 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10176 n = alloc_instruction(ctx, OPCODE_MULTITEXENV, 7);
10181 if (pname == GL_TEXTURE_ENV_COLOR) {
10182 n[4].f = params[0];
10183 n[5].f = params[1];
10184 n[6].f = params[2];
10185 n[7].f = params[3];
10188 n[4].f = params[0];
10189 n[5].f = n[6].f = n[7].f = 0.0F;
10192 if (ctx->ExecuteFlag) {
10193 CALL_MultiTexEnvfvEXT(ctx->Exec, (texunit, target, pname, params));
10199 save_MultiTexEnvfEXT(GLenum texunit, GLenum target, GLenum pname, GLfloat param)
10202 parray[0] = (GLfloat) param;
10203 parray[1] = parray[2] = parray[3] = 0.0F;
10204 save_MultiTexEnvfvEXT(texunit, target, pname, parray);
10209 save_MultiTexEnviEXT(GLenum texunit, GLenum target, GLenum pname, GLint param)
10212 p[0] = (GLfloat) param;
10213 p[1] = p[2] = p[3] = 0.0F;
10214 save_MultiTexEnvfvEXT(texunit, target, pname, p);
10219 save_MultiTexEnvivEXT(GLenum texunit, GLenum target, GLenum pname, const GLint * param)
10222 if (pname == GL_TEXTURE_ENV_COLOR) {
10223 p[0] = INT_TO_FLOAT(param[0]);
10224 p[1] = INT_TO_FLOAT(param[1]);
10225 p[2] = INT_TO_FLOAT(param[2]);
10226 p[3] = INT_TO_FLOAT(param[3]);
10229 p[0] = (GLfloat) param[0];
10230 p[1] = p[2] = p[3] = 0.0F;
10232 save_MultiTexEnvfvEXT(texunit, target, pname, p);
10237 save_CompressedTextureImage1DEXT(GLuint texture, GLenum target, GLint level,
10238 GLenum internalFormat, GLsizei width,
10239 GLint border, GLsizei imageSize,
10240 const GLvoid * data)
10242 GET_CURRENT_CONTEXT(ctx);
10243 if (target == GL_PROXY_TEXTURE_1D) {
10244 /* don't compile, execute immediately */
10245 CALL_CompressedTextureImage1DEXT(ctx->Exec, (texture, target, level,
10246 internalFormat, width,
10252 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10254 n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEXTURE_IMAGE_1D,
10255 7 + POINTER_DWORDS);
10260 n[4].e = internalFormat;
10261 n[5].i = (GLint) width;
10263 n[7].i = imageSize;
10264 save_pointer(&n[8],
10265 copy_data(data, imageSize, "glCompressedTextureImage1DEXT"));
10267 if (ctx->ExecuteFlag) {
10268 CALL_CompressedTextureImage1DEXT(ctx->Exec,
10269 (texture, target, level, internalFormat,
10270 width, border, imageSize, data));
10277 save_CompressedTextureImage2DEXT(GLuint texture, GLenum target, GLint level,
10278 GLenum internalFormat, GLsizei width,
10279 GLsizei height, GLint border, GLsizei imageSize,
10280 const GLvoid * data)
10282 GET_CURRENT_CONTEXT(ctx);
10283 if (target == GL_PROXY_TEXTURE_2D) {
10284 /* don't compile, execute immediately */
10285 CALL_CompressedTextureImage2DEXT(ctx->Exec, (texture, target, level,
10286 internalFormat, width, height,
10287 border, imageSize, data));
10291 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10293 n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEXTURE_IMAGE_2D,
10294 8 + POINTER_DWORDS);
10299 n[4].e = internalFormat;
10300 n[5].i = (GLint) width;
10301 n[6].i = (GLint) height;
10303 n[8].i = imageSize;
10304 save_pointer(&n[9],
10305 copy_data(data, imageSize, "glCompressedTextureImage2DEXT"));
10307 if (ctx->ExecuteFlag) {
10308 CALL_CompressedTextureImage2DEXT(ctx->Exec,
10309 (texture, target, level, internalFormat,
10310 width, height, border, imageSize, data));
10317 save_CompressedTextureImage3DEXT(GLuint texture, GLenum target, GLint level,
10318 GLenum internalFormat, GLsizei width,
10319 GLsizei height, GLsizei depth, GLint border,
10320 GLsizei imageSize, const GLvoid * data)
10322 GET_CURRENT_CONTEXT(ctx);
10323 if (target == GL_PROXY_TEXTURE_3D) {
10324 /* don't compile, execute immediately */
10325 CALL_CompressedTextureImage3DEXT(ctx->Exec, (texture, target, level,
10326 internalFormat, width,
10327 height, depth, border,
10332 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10334 n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEXTURE_IMAGE_3D,
10335 9 + POINTER_DWORDS);
10340 n[4].e = internalFormat;
10341 n[5].i = (GLint) width;
10342 n[6].i = (GLint) height;
10343 n[7].i = (GLint) depth;
10345 n[9].i = imageSize;
10346 save_pointer(&n[10],
10347 copy_data(data, imageSize, "glCompressedTextureImage3DEXT"));
10349 if (ctx->ExecuteFlag) {
10350 CALL_CompressedTextureImage3DEXT(ctx->Exec,
10351 (texture, target, level, internalFormat,
10352 width, height, depth, border, imageSize,
10360 save_CompressedTextureSubImage1DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset,
10361 GLsizei width, GLenum format,
10362 GLsizei imageSize, const GLvoid * data)
10365 GET_CURRENT_CONTEXT(ctx);
10366 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10368 n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEXTURE_SUB_IMAGE_1D,
10369 7 + POINTER_DWORDS);
10375 n[5].i = (GLint) width;
10377 n[7].i = imageSize;
10378 save_pointer(&n[8],
10379 copy_data(data, imageSize, "glCompressedTextureSubImage1DEXT"));
10381 if (ctx->ExecuteFlag) {
10382 CALL_CompressedTextureSubImage1DEXT(ctx->Exec, (texture, target, level, xoffset,
10383 width, format, imageSize, data));
10389 save_CompressedTextureSubImage2DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset,
10390 GLint yoffset, GLsizei width, GLsizei height,
10391 GLenum format, GLsizei imageSize,
10392 const GLvoid * data)
10395 GET_CURRENT_CONTEXT(ctx);
10396 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10398 n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEXTURE_SUB_IMAGE_2D,
10399 9 + POINTER_DWORDS);
10406 n[6].i = (GLint) width;
10407 n[7].i = (GLint) height;
10409 n[9].i = imageSize;
10410 save_pointer(&n[10],
10411 copy_data(data, imageSize, "glCompressedTextureSubImage2DEXT"));
10413 if (ctx->ExecuteFlag) {
10414 CALL_CompressedTextureSubImage2DEXT(ctx->Exec,
10415 (texture, target, level, xoffset, yoffset,
10416 width, height, format, imageSize, data));
10422 save_CompressedTextureSubImage3DEXT(GLuint texture, GLenum target, GLint level, GLint xoffset,
10423 GLint yoffset, GLint zoffset, GLsizei width,
10424 GLsizei height, GLsizei depth, GLenum format,
10425 GLsizei imageSize, const GLvoid * data)
10428 GET_CURRENT_CONTEXT(ctx);
10429 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10431 n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEXTURE_SUB_IMAGE_3D,
10432 11 + POINTER_DWORDS);
10440 n[7].i = (GLint) width;
10441 n[8].i = (GLint) height;
10442 n[9].i = (GLint) depth;
10444 n[11].i = imageSize;
10445 save_pointer(&n[12],
10446 copy_data(data, imageSize, "glCompressedTextureSubImage3DEXT"));
10448 if (ctx->ExecuteFlag) {
10449 CALL_CompressedTextureSubImage3DEXT(ctx->Exec,
10450 (texture, target, level, xoffset, yoffset,
10451 zoffset, width, height, depth, format,
10458 save_CompressedMultiTexImage1DEXT(GLenum texunit, GLenum target, GLint level,
10459 GLenum internalFormat, GLsizei width,
10460 GLint border, GLsizei imageSize,
10461 const GLvoid * data)
10463 GET_CURRENT_CONTEXT(ctx);
10464 if (target == GL_PROXY_TEXTURE_1D) {
10465 /* don't compile, execute immediately */
10466 CALL_CompressedMultiTexImage1DEXT(ctx->Exec, (texunit, target, level,
10467 internalFormat, width,
10473 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10475 n = alloc_instruction(ctx, OPCODE_COMPRESSED_MULTITEX_IMAGE_1D,
10476 7 + POINTER_DWORDS);
10481 n[4].e = internalFormat;
10482 n[5].i = (GLint) width;
10484 n[7].i = imageSize;
10485 save_pointer(&n[8],
10486 copy_data(data, imageSize, "glCompressedMultiTexImage1DEXT"));
10488 if (ctx->ExecuteFlag) {
10489 CALL_CompressedMultiTexImage1DEXT(ctx->Exec,
10490 (texunit, target, level, internalFormat,
10491 width, border, imageSize, data));
10498 save_CompressedMultiTexImage2DEXT(GLenum texunit, GLenum target, GLint level,
10499 GLenum internalFormat, GLsizei width,
10500 GLsizei height, GLint border, GLsizei imageSize,
10501 const GLvoid * data)
10503 GET_CURRENT_CONTEXT(ctx);
10504 if (target == GL_PROXY_TEXTURE_2D) {
10505 /* don't compile, execute immediately */
10506 CALL_CompressedMultiTexImage2DEXT(ctx->Exec, (texunit, target, level,
10507 internalFormat, width, height,
10508 border, imageSize, data));
10512 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10514 n = alloc_instruction(ctx, OPCODE_COMPRESSED_MULTITEX_IMAGE_2D,
10515 8 + POINTER_DWORDS);
10520 n[4].e = internalFormat;
10521 n[5].i = (GLint) width;
10522 n[6].i = (GLint) height;
10524 n[8].i = imageSize;
10525 save_pointer(&n[9],
10526 copy_data(data, imageSize, "glCompressedMultiTexImage2DEXT"));
10528 if (ctx->ExecuteFlag) {
10529 CALL_CompressedMultiTexImage2DEXT(ctx->Exec,
10530 (texunit, target, level, internalFormat,
10531 width, height, border, imageSize, data));
10538 save_CompressedMultiTexImage3DEXT(GLenum texunit, GLenum target, GLint level,
10539 GLenum internalFormat, GLsizei width,
10540 GLsizei height, GLsizei depth, GLint border,
10541 GLsizei imageSize, const GLvoid * data)
10543 GET_CURRENT_CONTEXT(ctx);
10544 if (target == GL_PROXY_TEXTURE_3D) {
10545 /* don't compile, execute immediately */
10546 CALL_CompressedMultiTexImage3DEXT(ctx->Exec, (texunit, target, level,
10547 internalFormat, width,
10548 height, depth, border,
10553 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10555 n = alloc_instruction(ctx, OPCODE_COMPRESSED_MULTITEX_IMAGE_3D,
10556 9 + POINTER_DWORDS);
10561 n[4].e = internalFormat;
10562 n[5].i = (GLint) width;
10563 n[6].i = (GLint) height;
10564 n[7].i = (GLint) depth;
10566 n[9].i = imageSize;
10567 save_pointer(&n[10],
10568 copy_data(data, imageSize, "glCompressedMultiTexImage3DEXT"));
10570 if (ctx->ExecuteFlag) {
10571 CALL_CompressedMultiTexImage3DEXT(ctx->Exec,
10572 (texunit, target, level, internalFormat,
10573 width, height, depth, border, imageSize,
10581 save_CompressedMultiTexSubImage1DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset,
10582 GLsizei width, GLenum format,
10583 GLsizei imageSize, const GLvoid * data)
10586 GET_CURRENT_CONTEXT(ctx);
10587 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10589 n = alloc_instruction(ctx, OPCODE_COMPRESSED_MULTITEX_SUB_IMAGE_1D,
10590 7 + POINTER_DWORDS);
10596 n[5].i = (GLint) width;
10598 n[7].i = imageSize;
10599 save_pointer(&n[8],
10600 copy_data(data, imageSize, "glCompressedMultiTexSubImage1DEXT"));
10602 if (ctx->ExecuteFlag) {
10603 CALL_CompressedMultiTexSubImage1DEXT(ctx->Exec, (texunit, target, level, xoffset,
10604 width, format, imageSize, data));
10610 save_CompressedMultiTexSubImage2DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset,
10611 GLint yoffset, GLsizei width, GLsizei height,
10612 GLenum format, GLsizei imageSize,
10613 const GLvoid * data)
10616 GET_CURRENT_CONTEXT(ctx);
10617 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10619 n = alloc_instruction(ctx, OPCODE_COMPRESSED_MULTITEX_SUB_IMAGE_2D,
10620 9 + POINTER_DWORDS);
10627 n[6].i = (GLint) width;
10628 n[7].i = (GLint) height;
10630 n[9].i = imageSize;
10631 save_pointer(&n[10],
10632 copy_data(data, imageSize, "glCompressedMultiTexSubImage2DEXT"));
10634 if (ctx->ExecuteFlag) {
10635 CALL_CompressedMultiTexSubImage2DEXT(ctx->Exec,
10636 (texunit, target, level, xoffset, yoffset,
10637 width, height, format, imageSize, data));
10643 save_CompressedMultiTexSubImage3DEXT(GLenum texunit, GLenum target, GLint level, GLint xoffset,
10644 GLint yoffset, GLint zoffset, GLsizei width,
10645 GLsizei height, GLsizei depth, GLenum format,
10646 GLsizei imageSize, const GLvoid * data)
10649 GET_CURRENT_CONTEXT(ctx);
10650 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10652 n = alloc_instruction(ctx, OPCODE_COMPRESSED_MULTITEX_SUB_IMAGE_3D,
10653 11 + POINTER_DWORDS);
10661 n[7].i = (GLint) width;
10662 n[8].i = (GLint) height;
10663 n[9].i = (GLint) depth;
10665 n[11].i = imageSize;
10666 save_pointer(&n[12],
10667 copy_data(data, imageSize, "glCompressedMultiTexSubImage3DEXT"));
10669 if (ctx->ExecuteFlag) {
10670 CALL_CompressedMultiTexSubImage3DEXT(ctx->Exec,
10671 (texunit, target, level, xoffset, yoffset,
10672 zoffset, width, height, depth, format,
10679 save_NamedProgramStringEXT(GLuint program, GLenum target, GLenum format, GLsizei len,
10680 const GLvoid * string)
10682 GET_CURRENT_CONTEXT(ctx);
10685 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10687 n = alloc_instruction(ctx, OPCODE_NAMED_PROGRAM_STRING, 4 + POINTER_DWORDS);
10689 GLubyte *programCopy = malloc(len);
10690 if (!programCopy) {
10691 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glNamedProgramStringEXT");
10694 memcpy(programCopy, string, len);
10699 save_pointer(&n[5], programCopy);
10701 if (ctx->ExecuteFlag) {
10702 CALL_NamedProgramStringEXT(ctx->Exec, (program, target, format, len, string));
10708 save_NamedProgramLocalParameter4fEXT(GLuint program, GLenum target, GLuint index,
10709 GLfloat x, GLfloat y, GLfloat z, GLfloat w)
10711 GET_CURRENT_CONTEXT(ctx);
10713 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10714 n = alloc_instruction(ctx, OPCODE_NAMED_PROGRAM_LOCAL_PARAMETER, 7);
10724 if (ctx->ExecuteFlag) {
10725 CALL_NamedProgramLocalParameter4fEXT(ctx->Exec, (program, target, index, x, y, z, w));
10731 save_NamedProgramLocalParameter4fvEXT(GLuint program, GLenum target, GLuint index,
10732 const GLfloat *params)
10734 save_NamedProgramLocalParameter4fEXT(program, target, index, params[0],
10735 params[1], params[2], params[3]);
10740 save_NamedProgramLocalParameter4dEXT(GLuint program, GLenum target, GLuint index,
10741 GLdouble x, GLdouble y,
10742 GLdouble z, GLdouble w)
10744 save_NamedProgramLocalParameter4fEXT(program, target, index, (GLfloat) x,
10745 (GLfloat) y, (GLfloat) z, (GLfloat) w);
10750 save_NamedProgramLocalParameter4dvEXT(GLuint program, GLenum target, GLuint index,
10751 const GLdouble *params)
10753 save_NamedProgramLocalParameter4fEXT(program, target, index, (GLfloat) params[0],
10754 (GLfloat) params[1], (GLfloat) params[2],
10755 (GLfloat) params[3]);
10759 save_PrimitiveBoundingBox(float minX, float minY, float minZ, float minW,
10760 float maxX, float maxY, float maxZ, float maxW)
10762 GET_CURRENT_CONTEXT(ctx);
10764 ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
10765 n = alloc_instruction(ctx, OPCODE_PRIMITIVE_BOUNDING_BOX, 8);
10776 if (ctx->ExecuteFlag) {
10777 CALL_PrimitiveBoundingBox(ctx->Exec, (minX, minY, minZ, minW,
10778 maxX, maxY, maxZ, maxW));
10783 * Save an error-generating command into display list.
10785 * KW: Will appear in the list before the vertex buffer containing the
10786 * command that provoked the error. I don't see this as a problem.
10789 save_error(struct gl_context *ctx, GLenum error, const char *s)
10792 n = alloc_instruction(ctx, OPCODE_ERROR, 1 + POINTER_DWORDS);
10795 save_pointer(&n[2], (void *) s);
10796 /* note: the data/string here doesn't have to be freed in
10797 * _mesa_delete_list() since the string is never dynamically
10805 * Compile an error into current display list.
10808 _mesa_compile_error(struct gl_context *ctx, GLenum error, const char *s)
10810 if (ctx->CompileFlag)
10811 save_error(ctx, error, s);
10812 if (ctx->ExecuteFlag)
10813 _mesa_error(ctx, error, "%s", s);
10818 * Test if ID names a display list.
10821 _mesa_get_list(struct gl_context *ctx, GLuint list,
10822 struct gl_display_list **dlist,
10825 struct gl_display_list * dl =
10826 list > 0 ? _mesa_lookup_list(ctx, list, locked) : NULL;
10836 /**********************************************************************/
10837 /* Display list execution */
10838 /**********************************************************************/
10842 * Execute a display list. Note that the ListBase offset must have already
10843 * been added before calling this function. I.e. the list argument is
10844 * the absolute list number, not relative to ListBase.
10845 * Must be called with ctx->Shared->DisplayList locked.
10846 * \param list - display list number
10849 execute_list(struct gl_context *ctx, GLuint list)
10851 struct gl_display_list *dlist;
10854 if (list == 0 || !_mesa_get_list(ctx, list, &dlist, true))
10857 n = get_list_head(ctx, dlist);
10860 const OpCode opcode = n[0].opcode;
10864 _mesa_error(ctx, n[1].e, "%s", (const char *) get_pointer(&n[2]));
10867 CALL_Accum(ctx->Exec, (n[1].e, n[2].f));
10869 case OPCODE_ALPHA_FUNC:
10870 CALL_AlphaFunc(ctx->Exec, (n[1].e, n[2].f));
10872 case OPCODE_BIND_TEXTURE:
10873 CALL_BindTexture(ctx->Exec, (n[1].e, n[2].ui));
10875 case OPCODE_BITMAP:
10876 if (_mesa_inside_begin_end(ctx)) {
10877 _mesa_error(ctx, GL_INVALID_OPERATION,
10878 "glCallList -> glBitmap inside Begin/End");
10880 _mesa_bitmap(ctx, n[1].i, n[2].i, n[3].f, n[4].f, n[5].f,
10881 n[6].f, NULL, get_pointer(&n[7]));
10884 case OPCODE_BLEND_COLOR:
10885 CALL_BlendColor(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
10887 case OPCODE_BLEND_EQUATION:
10888 CALL_BlendEquation(ctx->Exec, (n[1].e));
10890 case OPCODE_BLEND_EQUATION_SEPARATE:
10891 CALL_BlendEquationSeparate(ctx->Exec, (n[1].e, n[2].e));
10893 case OPCODE_BLEND_FUNC_SEPARATE:
10894 CALL_BlendFuncSeparate(ctx->Exec,
10895 (n[1].e, n[2].e, n[3].e, n[4].e));
10898 case OPCODE_BLEND_FUNC_I:
10899 /* GL_ARB_draw_buffers_blend */
10900 CALL_BlendFunciARB(ctx->Exec, (n[1].ui, n[2].e, n[3].e));
10902 case OPCODE_BLEND_FUNC_SEPARATE_I:
10903 /* GL_ARB_draw_buffers_blend */
10904 CALL_BlendFuncSeparateiARB(ctx->Exec, (n[1].ui, n[2].e, n[3].e,
10907 case OPCODE_BLEND_EQUATION_I:
10908 /* GL_ARB_draw_buffers_blend */
10909 CALL_BlendEquationiARB(ctx->Exec, (n[1].ui, n[2].e));
10911 case OPCODE_BLEND_EQUATION_SEPARATE_I:
10912 /* GL_ARB_draw_buffers_blend */
10913 CALL_BlendEquationSeparateiARB(ctx->Exec,
10914 (n[1].ui, n[2].e, n[3].e));
10917 case OPCODE_CALL_LIST:
10918 /* Generated by glCallList(), don't add ListBase */
10919 if (ctx->ListState.CallDepth < MAX_LIST_NESTING) {
10920 ctx->ListState.CallDepth++;
10921 execute_list(ctx, n[1].ui);
10922 ctx->ListState.CallDepth--;
10925 case OPCODE_CALL_LISTS:
10926 if (ctx->ListState.CallDepth < MAX_LIST_NESTING) {
10927 ctx->ListState.CallDepth++;
10928 _mesa_HashUnlockMutex(ctx->Shared->DisplayList);
10929 CALL_CallLists(ctx->Exec, (n[1].i, n[2].e, get_pointer(&n[3])));
10930 _mesa_HashLockMutex(ctx->Shared->DisplayList);
10931 ctx->ListState.CallDepth--;
10935 CALL_Clear(ctx->Exec, (n[1].bf));
10937 case OPCODE_CLEAR_BUFFER_IV:
10944 CALL_ClearBufferiv(ctx->Exec, (n[1].e, n[2].i, value));
10947 case OPCODE_CLEAR_BUFFER_UIV:
10950 value[0] = n[3].ui;
10951 value[1] = n[4].ui;
10952 value[2] = n[5].ui;
10953 value[3] = n[6].ui;
10954 CALL_ClearBufferuiv(ctx->Exec, (n[1].e, n[2].i, value));
10957 case OPCODE_CLEAR_BUFFER_FV:
10964 CALL_ClearBufferfv(ctx->Exec, (n[1].e, n[2].i, value));
10967 case OPCODE_CLEAR_BUFFER_FI:
10968 CALL_ClearBufferfi(ctx->Exec, (n[1].e, n[2].i, n[3].f, n[4].i));
10970 case OPCODE_CLEAR_COLOR:
10971 CALL_ClearColor(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
10973 case OPCODE_CLEAR_ACCUM:
10974 CALL_ClearAccum(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
10976 case OPCODE_CLEAR_DEPTH:
10977 CALL_ClearDepth(ctx->Exec, ((GLclampd) n[1].f));
10979 case OPCODE_CLEAR_INDEX:
10980 CALL_ClearIndex(ctx->Exec, ((GLfloat) n[1].ui));
10982 case OPCODE_CLEAR_STENCIL:
10983 CALL_ClearStencil(ctx->Exec, (n[1].i));
10985 case OPCODE_CLIP_PLANE:
10992 CALL_ClipPlane(ctx->Exec, (n[1].e, eq));
10995 case OPCODE_COLOR_MASK:
10996 CALL_ColorMask(ctx->Exec, (n[1].b, n[2].b, n[3].b, n[4].b));
10998 case OPCODE_COLOR_MASK_INDEXED:
10999 CALL_ColorMaski(ctx->Exec, (n[1].ui, n[2].b, n[3].b,
11002 case OPCODE_COLOR_MATERIAL:
11003 CALL_ColorMaterial(ctx->Exec, (n[1].e, n[2].e));
11005 case OPCODE_COPY_PIXELS:
11006 CALL_CopyPixels(ctx->Exec, (n[1].i, n[2].i,
11007 (GLsizei) n[3].i, (GLsizei) n[4].i,
11010 case OPCODE_COPY_TEX_IMAGE1D:
11011 CALL_CopyTexImage1D(ctx->Exec, (n[1].e, n[2].i, n[3].e, n[4].i,
11012 n[5].i, n[6].i, n[7].i));
11014 case OPCODE_COPY_TEX_IMAGE2D:
11015 CALL_CopyTexImage2D(ctx->Exec, (n[1].e, n[2].i, n[3].e, n[4].i,
11016 n[5].i, n[6].i, n[7].i, n[8].i));
11018 case OPCODE_COPY_TEX_SUB_IMAGE1D:
11019 CALL_CopyTexSubImage1D(ctx->Exec, (n[1].e, n[2].i, n[3].i,
11020 n[4].i, n[5].i, n[6].i));
11022 case OPCODE_COPY_TEX_SUB_IMAGE2D:
11023 CALL_CopyTexSubImage2D(ctx->Exec, (n[1].e, n[2].i, n[3].i,
11024 n[4].i, n[5].i, n[6].i, n[7].i,
11027 case OPCODE_COPY_TEX_SUB_IMAGE3D:
11028 CALL_CopyTexSubImage3D(ctx->Exec, (n[1].e, n[2].i, n[3].i,
11029 n[4].i, n[5].i, n[6].i, n[7].i,
11032 case OPCODE_CULL_FACE:
11033 CALL_CullFace(ctx->Exec, (n[1].e));
11035 case OPCODE_DEPTH_FUNC:
11036 CALL_DepthFunc(ctx->Exec, (n[1].e));
11038 case OPCODE_DEPTH_MASK:
11039 CALL_DepthMask(ctx->Exec, (n[1].b));
11041 case OPCODE_DEPTH_RANGE:
11042 CALL_DepthRange(ctx->Exec,
11043 ((GLclampd) n[1].f, (GLclampd) n[2].f));
11045 case OPCODE_DISABLE:
11046 CALL_Disable(ctx->Exec, (n[1].e));
11048 case OPCODE_DISABLE_INDEXED:
11049 CALL_Disablei(ctx->Exec, (n[1].ui, n[2].e));
11051 case OPCODE_DRAW_BUFFER:
11052 CALL_DrawBuffer(ctx->Exec, (n[1].e));
11054 case OPCODE_DRAW_PIXELS:
11056 const struct gl_pixelstore_attrib save = ctx->Unpack;
11057 ctx->Unpack = ctx->DefaultPacking;
11058 CALL_DrawPixels(ctx->Exec, (n[1].i, n[2].i, n[3].e, n[4].e,
11059 get_pointer(&n[5])));
11060 ctx->Unpack = save; /* restore */
11063 case OPCODE_ENABLE:
11064 CALL_Enable(ctx->Exec, (n[1].e));
11066 case OPCODE_ENABLE_INDEXED:
11067 CALL_Enablei(ctx->Exec, (n[1].ui, n[2].e));
11069 case OPCODE_EVALMESH1:
11070 CALL_EvalMesh1(ctx->Exec, (n[1].e, n[2].i, n[3].i));
11072 case OPCODE_EVALMESH2:
11073 CALL_EvalMesh2(ctx->Exec,
11074 (n[1].e, n[2].i, n[3].i, n[4].i, n[5].i));
11083 CALL_Fogfv(ctx->Exec, (n[1].e, p));
11086 case OPCODE_FRONT_FACE:
11087 CALL_FrontFace(ctx->Exec, (n[1].e));
11089 case OPCODE_FRUSTUM:
11090 CALL_Frustum(ctx->Exec,
11091 (n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f));
11094 CALL_Hint(ctx->Exec, (n[1].e, n[2].e));
11096 case OPCODE_INDEX_MASK:
11097 CALL_IndexMask(ctx->Exec, (n[1].ui));
11099 case OPCODE_INIT_NAMES:
11100 CALL_InitNames(ctx->Exec, ());
11109 CALL_Lightfv(ctx->Exec, (n[1].e, n[2].e, p));
11112 case OPCODE_LIGHT_MODEL:
11119 CALL_LightModelfv(ctx->Exec, (n[1].e, p));
11122 case OPCODE_LINE_STIPPLE:
11123 CALL_LineStipple(ctx->Exec, (n[1].i, n[2].us));
11125 case OPCODE_LINE_WIDTH:
11126 CALL_LineWidth(ctx->Exec, (n[1].f));
11128 case OPCODE_LIST_BASE:
11129 CALL_ListBase(ctx->Exec, (n[1].ui));
11131 case OPCODE_LOAD_IDENTITY:
11132 CALL_LoadIdentity(ctx->Exec, ());
11134 case OPCODE_LOAD_MATRIX:
11135 STATIC_ASSERT(sizeof(Node) == sizeof(GLfloat));
11136 CALL_LoadMatrixf(ctx->Exec, (&n[1].f));
11138 case OPCODE_LOAD_NAME:
11139 CALL_LoadName(ctx->Exec, (n[1].ui));
11141 case OPCODE_LOGIC_OP:
11142 CALL_LogicOp(ctx->Exec, (n[1].e));
11146 GLenum target = n[1].e;
11147 GLint ustride = _mesa_evaluator_components(target);
11148 GLint uorder = n[5].i;
11149 GLfloat u1 = n[2].f;
11150 GLfloat u2 = n[3].f;
11151 CALL_Map1f(ctx->Exec, (target, u1, u2, ustride, uorder,
11152 (GLfloat *) get_pointer(&n[6])));
11157 GLenum target = n[1].e;
11158 GLfloat u1 = n[2].f;
11159 GLfloat u2 = n[3].f;
11160 GLfloat v1 = n[4].f;
11161 GLfloat v2 = n[5].f;
11162 GLint ustride = n[6].i;
11163 GLint vstride = n[7].i;
11164 GLint uorder = n[8].i;
11165 GLint vorder = n[9].i;
11166 CALL_Map2f(ctx->Exec, (target, u1, u2, ustride, uorder,
11167 v1, v2, vstride, vorder,
11168 (GLfloat *) get_pointer(&n[10])));
11171 case OPCODE_MAPGRID1:
11172 CALL_MapGrid1f(ctx->Exec, (n[1].i, n[2].f, n[3].f));
11174 case OPCODE_MAPGRID2:
11175 CALL_MapGrid2f(ctx->Exec,
11176 (n[1].i, n[2].f, n[3].f, n[4].i, n[5].f, n[6].f));
11178 case OPCODE_MATRIX_MODE:
11179 CALL_MatrixMode(ctx->Exec, (n[1].e));
11181 case OPCODE_MULT_MATRIX:
11182 CALL_MultMatrixf(ctx->Exec, (&n[1].f));
11185 CALL_Ortho(ctx->Exec,
11186 (n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f));
11188 case OPCODE_PASSTHROUGH:
11189 CALL_PassThrough(ctx->Exec, (n[1].f));
11191 case OPCODE_PATCH_PARAMETER_I:
11192 CALL_PatchParameteri(ctx->Exec, (n[1].e, n[2].i));
11194 case OPCODE_PATCH_PARAMETER_FV_INNER:
11197 params[0] = n[2].f;
11198 params[1] = n[3].f;
11199 CALL_PatchParameterfv(ctx->Exec, (n[1].e, params));
11202 case OPCODE_PATCH_PARAMETER_FV_OUTER:
11205 params[0] = n[2].f;
11206 params[1] = n[3].f;
11207 params[2] = n[4].f;
11208 params[3] = n[5].f;
11209 CALL_PatchParameterfv(ctx->Exec, (n[1].e, params));
11212 case OPCODE_PIXEL_MAP:
11213 CALL_PixelMapfv(ctx->Exec,
11214 (n[1].e, n[2].i, get_pointer(&n[3])));
11216 case OPCODE_PIXEL_TRANSFER:
11217 CALL_PixelTransferf(ctx->Exec, (n[1].e, n[2].f));
11219 case OPCODE_PIXEL_ZOOM:
11220 CALL_PixelZoom(ctx->Exec, (n[1].f, n[2].f));
11222 case OPCODE_POINT_SIZE:
11223 CALL_PointSize(ctx->Exec, (n[1].f));
11225 case OPCODE_POINT_PARAMETERS:
11228 params[0] = n[2].f;
11229 params[1] = n[3].f;
11230 params[2] = n[4].f;
11231 CALL_PointParameterfv(ctx->Exec, (n[1].e, params));
11234 case OPCODE_POLYGON_MODE:
11235 CALL_PolygonMode(ctx->Exec, (n[1].e, n[2].e));
11237 case OPCODE_POLYGON_STIPPLE:
11239 const struct gl_pixelstore_attrib save = ctx->Unpack;
11240 ctx->Unpack = ctx->DefaultPacking;
11241 CALL_PolygonStipple(ctx->Exec, (get_pointer(&n[1])));
11242 ctx->Unpack = save; /* restore */
11245 case OPCODE_POLYGON_OFFSET:
11246 CALL_PolygonOffset(ctx->Exec, (n[1].f, n[2].f));
11248 case OPCODE_POLYGON_OFFSET_CLAMP:
11249 CALL_PolygonOffsetClampEXT(ctx->Exec, (n[1].f, n[2].f, n[3].f));
11251 case OPCODE_POP_ATTRIB:
11252 CALL_PopAttrib(ctx->Exec, ());
11254 case OPCODE_POP_MATRIX:
11255 CALL_PopMatrix(ctx->Exec, ());
11257 case OPCODE_POP_NAME:
11258 CALL_PopName(ctx->Exec, ());
11260 case OPCODE_PRIORITIZE_TEXTURE:
11261 CALL_PrioritizeTextures(ctx->Exec, (1, &n[1].ui, &n[2].f));
11263 case OPCODE_PUSH_ATTRIB:
11264 CALL_PushAttrib(ctx->Exec, (n[1].bf));
11266 case OPCODE_PUSH_MATRIX:
11267 CALL_PushMatrix(ctx->Exec, ());
11269 case OPCODE_PUSH_NAME:
11270 CALL_PushName(ctx->Exec, (n[1].ui));
11272 case OPCODE_RASTER_POS:
11273 CALL_RasterPos4f(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
11275 case OPCODE_READ_BUFFER:
11276 CALL_ReadBuffer(ctx->Exec, (n[1].e));
11278 case OPCODE_ROTATE:
11279 CALL_Rotatef(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
11282 CALL_Scalef(ctx->Exec, (n[1].f, n[2].f, n[3].f));
11284 case OPCODE_SCISSOR:
11285 CALL_Scissor(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i));
11287 case OPCODE_SHADE_MODEL:
11288 CALL_ShadeModel(ctx->Exec, (n[1].e));
11290 case OPCODE_PROVOKING_VERTEX:
11291 CALL_ProvokingVertex(ctx->Exec, (n[1].e));
11293 case OPCODE_STENCIL_FUNC:
11294 CALL_StencilFunc(ctx->Exec, (n[1].e, n[2].i, n[3].ui));
11296 case OPCODE_STENCIL_MASK:
11297 CALL_StencilMask(ctx->Exec, (n[1].ui));
11299 case OPCODE_STENCIL_OP:
11300 CALL_StencilOp(ctx->Exec, (n[1].e, n[2].e, n[3].e));
11302 case OPCODE_STENCIL_FUNC_SEPARATE:
11303 CALL_StencilFuncSeparate(ctx->Exec,
11304 (n[1].e, n[2].e, n[3].i, n[4].ui));
11306 case OPCODE_STENCIL_MASK_SEPARATE:
11307 CALL_StencilMaskSeparate(ctx->Exec, (n[1].e, n[2].ui));
11309 case OPCODE_STENCIL_OP_SEPARATE:
11310 CALL_StencilOpSeparate(ctx->Exec,
11311 (n[1].e, n[2].e, n[3].e, n[4].e));
11313 case OPCODE_TEXENV:
11316 params[0] = n[3].f;
11317 params[1] = n[4].f;
11318 params[2] = n[5].f;
11319 params[3] = n[6].f;
11320 CALL_TexEnvfv(ctx->Exec, (n[1].e, n[2].e, params));
11323 case OPCODE_TEXGEN:
11326 params[0] = n[3].f;
11327 params[1] = n[4].f;
11328 params[2] = n[5].f;
11329 params[3] = n[6].f;
11330 CALL_TexGenfv(ctx->Exec, (n[1].e, n[2].e, params));
11333 case OPCODE_TEXPARAMETER:
11336 params[0] = n[3].f;
11337 params[1] = n[4].f;
11338 params[2] = n[5].f;
11339 params[3] = n[6].f;
11340 CALL_TexParameterfv(ctx->Exec, (n[1].e, n[2].e, params));
11343 case OPCODE_TEX_IMAGE1D:
11345 const struct gl_pixelstore_attrib save = ctx->Unpack;
11346 ctx->Unpack = ctx->DefaultPacking;
11347 CALL_TexImage1D(ctx->Exec, (n[1].e, /* target */
11348 n[2].i, /* level */
11349 n[3].i, /* components */
11350 n[4].i, /* width */
11351 n[5].e, /* border */
11352 n[6].e, /* format */
11354 get_pointer(&n[8])));
11355 ctx->Unpack = save; /* restore */
11358 case OPCODE_TEX_IMAGE2D:
11360 const struct gl_pixelstore_attrib save = ctx->Unpack;
11361 ctx->Unpack = ctx->DefaultPacking;
11362 CALL_TexImage2D(ctx->Exec, (n[1].e, /* target */
11363 n[2].i, /* level */
11364 n[3].i, /* components */
11365 n[4].i, /* width */
11366 n[5].i, /* height */
11367 n[6].e, /* border */
11368 n[7].e, /* format */
11370 get_pointer(&n[9])));
11371 ctx->Unpack = save; /* restore */
11374 case OPCODE_TEX_IMAGE3D:
11376 const struct gl_pixelstore_attrib save = ctx->Unpack;
11377 ctx->Unpack = ctx->DefaultPacking;
11378 CALL_TexImage3D(ctx->Exec, (n[1].e, /* target */
11379 n[2].i, /* level */
11380 n[3].i, /* components */
11381 n[4].i, /* width */
11382 n[5].i, /* height */
11383 n[6].i, /* depth */
11384 n[7].e, /* border */
11385 n[8].e, /* format */
11387 get_pointer(&n[10])));
11388 ctx->Unpack = save; /* restore */
11391 case OPCODE_TEX_SUB_IMAGE1D:
11393 const struct gl_pixelstore_attrib save = ctx->Unpack;
11394 ctx->Unpack = ctx->DefaultPacking;
11395 CALL_TexSubImage1D(ctx->Exec, (n[1].e, n[2].i, n[3].i,
11397 n[6].e, get_pointer(&n[7])));
11398 ctx->Unpack = save; /* restore */
11401 case OPCODE_TEX_SUB_IMAGE2D:
11403 const struct gl_pixelstore_attrib save = ctx->Unpack;
11404 ctx->Unpack = ctx->DefaultPacking;
11405 CALL_TexSubImage2D(ctx->Exec, (n[1].e, n[2].i, n[3].i,
11407 n[6].i, n[7].e, n[8].e,
11408 get_pointer(&n[9])));
11409 ctx->Unpack = save; /* restore */
11412 case OPCODE_TEX_SUB_IMAGE3D:
11414 const struct gl_pixelstore_attrib save = ctx->Unpack;
11415 ctx->Unpack = ctx->DefaultPacking;
11416 CALL_TexSubImage3D(ctx->Exec, (n[1].e, n[2].i, n[3].i,
11417 n[4].i, n[5].i, n[6].i, n[7].i,
11418 n[8].i, n[9].e, n[10].e,
11419 get_pointer(&n[11])));
11420 ctx->Unpack = save; /* restore */
11423 case OPCODE_TRANSLATE:
11424 CALL_Translatef(ctx->Exec, (n[1].f, n[2].f, n[3].f));
11426 case OPCODE_VIEWPORT:
11427 CALL_Viewport(ctx->Exec, (n[1].i, n[2].i,
11428 (GLsizei) n[3].i, (GLsizei) n[4].i));
11430 case OPCODE_WINDOW_POS:
11431 CALL_WindowPos4fMESA(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f));
11433 case OPCODE_VIEWPORT_ARRAY_V:
11434 CALL_ViewportArrayv(ctx->Exec, (n[1].ui, n[2].si,
11435 get_pointer(&n[3])));
11437 case OPCODE_VIEWPORT_INDEXED_F:
11438 CALL_ViewportIndexedf(ctx->Exec, (n[1].ui, n[2].f, n[3].f, n[4].f,
11441 case OPCODE_VIEWPORT_INDEXED_FV: {
11447 CALL_ViewportIndexedfv(ctx->Exec, (n[1].ui, v));
11450 case OPCODE_SCISSOR_ARRAY_V:
11451 CALL_ScissorArrayv(ctx->Exec, (n[1].ui, n[2].si,
11452 get_pointer(&n[3])));
11454 case OPCODE_SCISSOR_INDEXED:
11455 CALL_ScissorIndexed(ctx->Exec, (n[1].ui, n[2].i, n[3].i, n[4].si,
11458 case OPCODE_SCISSOR_INDEXED_V: {
11464 CALL_ScissorIndexedv(ctx->Exec, (n[1].ui, v));
11467 case OPCODE_DEPTH_ARRAY_V:
11468 CALL_DepthRangeArrayv(ctx->Exec, (n[1].ui, n[2].si,
11469 get_pointer(&n[3])));
11471 case OPCODE_DEPTH_INDEXED:
11472 CALL_DepthRangeIndexed(ctx->Exec, (n[1].ui, n[2].f, n[3].f));
11474 case OPCODE_ACTIVE_TEXTURE: /* GL_ARB_multitexture */
11475 CALL_ActiveTexture(ctx->Exec, (n[1].e));
11477 case OPCODE_COMPRESSED_TEX_IMAGE_1D: /* GL_ARB_texture_compression */
11478 CALL_CompressedTexImage1D(ctx->Exec, (n[1].e, n[2].i, n[3].e,
11479 n[4].i, n[5].i, n[6].i,
11480 get_pointer(&n[7])));
11482 case OPCODE_COMPRESSED_TEX_IMAGE_2D: /* GL_ARB_texture_compression */
11483 CALL_CompressedTexImage2D(ctx->Exec, (n[1].e, n[2].i, n[3].e,
11484 n[4].i, n[5].i, n[6].i,
11485 n[7].i, get_pointer(&n[8])));
11487 case OPCODE_COMPRESSED_TEX_IMAGE_3D: /* GL_ARB_texture_compression */
11488 CALL_CompressedTexImage3D(ctx->Exec, (n[1].e, n[2].i, n[3].e,
11489 n[4].i, n[5].i, n[6].i,
11491 get_pointer(&n[9])));
11493 case OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D: /* GL_ARB_texture_compress */
11494 CALL_CompressedTexSubImage1D(ctx->Exec,
11495 (n[1].e, n[2].i, n[3].i, n[4].i,
11497 get_pointer(&n[7])));
11499 case OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D: /* GL_ARB_texture_compress */
11500 CALL_CompressedTexSubImage2D(ctx->Exec,
11501 (n[1].e, n[2].i, n[3].i, n[4].i,
11502 n[5].i, n[6].i, n[7].e, n[8].i,
11503 get_pointer(&n[9])));
11505 case OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D: /* GL_ARB_texture_compress */
11506 CALL_CompressedTexSubImage3D(ctx->Exec,
11507 (n[1].e, n[2].i, n[3].i, n[4].i,
11508 n[5].i, n[6].i, n[7].i, n[8].i,
11510 get_pointer(&n[11])));
11512 case OPCODE_SAMPLE_COVERAGE: /* GL_ARB_multisample */
11513 CALL_SampleCoverage(ctx->Exec, (n[1].f, n[2].b));
11515 case OPCODE_WINDOW_POS_ARB: /* GL_ARB_window_pos */
11516 CALL_WindowPos3f(ctx->Exec, (n[1].f, n[2].f, n[3].f));
11518 case OPCODE_BIND_PROGRAM_ARB: /* GL_ARB_vertex_program */
11519 CALL_BindProgramARB(ctx->Exec, (n[1].e, n[2].ui));
11521 case OPCODE_PROGRAM_LOCAL_PARAMETER_ARB:
11522 CALL_ProgramLocalParameter4fARB(ctx->Exec,
11523 (n[1].e, n[2].ui, n[3].f, n[4].f,
11526 case OPCODE_ACTIVE_STENCIL_FACE_EXT:
11527 CALL_ActiveStencilFaceEXT(ctx->Exec, (n[1].e));
11529 case OPCODE_DEPTH_BOUNDS_EXT:
11530 CALL_DepthBoundsEXT(ctx->Exec, (n[1].f, n[2].f));
11532 case OPCODE_PROGRAM_STRING_ARB:
11533 CALL_ProgramStringARB(ctx->Exec,
11534 (n[1].e, n[2].e, n[3].i,
11535 get_pointer(&n[4])));
11537 case OPCODE_PROGRAM_ENV_PARAMETER_ARB:
11538 CALL_ProgramEnvParameter4fARB(ctx->Exec, (n[1].e, n[2].ui, n[3].f,
11542 case OPCODE_BEGIN_QUERY_ARB:
11543 CALL_BeginQuery(ctx->Exec, (n[1].e, n[2].ui));
11545 case OPCODE_END_QUERY_ARB:
11546 CALL_EndQuery(ctx->Exec, (n[1].e));
11548 case OPCODE_QUERY_COUNTER:
11549 CALL_QueryCounter(ctx->Exec, (n[1].ui, n[2].e));
11551 case OPCODE_BEGIN_QUERY_INDEXED:
11552 CALL_BeginQueryIndexed(ctx->Exec, (n[1].e, n[2].ui, n[3].ui));
11554 case OPCODE_END_QUERY_INDEXED:
11555 CALL_EndQueryIndexed(ctx->Exec, (n[1].e, n[2].ui));
11557 case OPCODE_DRAW_BUFFERS_ARB:
11559 GLenum buffers[MAX_DRAW_BUFFERS];
11560 GLint i, count = MIN2(n[1].i, MAX_DRAW_BUFFERS);
11561 for (i = 0; i < count; i++)
11562 buffers[i] = n[2 + i].e;
11563 CALL_DrawBuffers(ctx->Exec, (n[1].i, buffers));
11566 case OPCODE_BLIT_FRAMEBUFFER:
11567 CALL_BlitFramebuffer(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i,
11568 n[5].i, n[6].i, n[7].i, n[8].i,
11571 case OPCODE_PRIMITIVE_RESTART_NV:
11572 CALL_PrimitiveRestartNV(ctx->Exec, ());
11575 case OPCODE_USE_PROGRAM:
11576 CALL_UseProgram(ctx->Exec, (n[1].ui));
11578 case OPCODE_UNIFORM_1F:
11579 CALL_Uniform1f(ctx->Exec, (n[1].i, n[2].f));
11581 case OPCODE_UNIFORM_2F:
11582 CALL_Uniform2f(ctx->Exec, (n[1].i, n[2].f, n[3].f));
11584 case OPCODE_UNIFORM_3F:
11585 CALL_Uniform3f(ctx->Exec, (n[1].i, n[2].f, n[3].f, n[4].f));
11587 case OPCODE_UNIFORM_4F:
11588 CALL_Uniform4f(ctx->Exec,
11589 (n[1].i, n[2].f, n[3].f, n[4].f, n[5].f));
11591 case OPCODE_UNIFORM_1FV:
11592 CALL_Uniform1fv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11594 case OPCODE_UNIFORM_2FV:
11595 CALL_Uniform2fv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11597 case OPCODE_UNIFORM_3FV:
11598 CALL_Uniform3fv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11600 case OPCODE_UNIFORM_4FV:
11601 CALL_Uniform4fv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11603 case OPCODE_UNIFORM_1D: {
11604 union float64_pair x;
11606 x.uint32[0] = n[2].ui;
11607 x.uint32[1] = n[3].ui;
11609 CALL_Uniform1d(ctx->Exec, (n[1].i, x.d));
11612 case OPCODE_UNIFORM_2D: {
11613 union float64_pair x;
11614 union float64_pair y;
11616 x.uint32[0] = n[2].ui;
11617 x.uint32[1] = n[3].ui;
11618 y.uint32[0] = n[4].ui;
11619 y.uint32[1] = n[5].ui;
11621 CALL_Uniform2d(ctx->Exec, (n[1].i, x.d, y.d));
11624 case OPCODE_UNIFORM_3D: {
11625 union float64_pair x;
11626 union float64_pair y;
11627 union float64_pair z;
11629 x.uint32[0] = n[2].ui;
11630 x.uint32[1] = n[3].ui;
11631 y.uint32[0] = n[4].ui;
11632 y.uint32[1] = n[5].ui;
11633 z.uint32[0] = n[6].ui;
11634 z.uint32[1] = n[7].ui;
11636 CALL_Uniform3d(ctx->Exec, (n[1].i, x.d, y.d, z.d));
11639 case OPCODE_UNIFORM_4D: {
11640 union float64_pair x;
11641 union float64_pair y;
11642 union float64_pair z;
11643 union float64_pair w;
11645 x.uint32[0] = n[2].ui;
11646 x.uint32[1] = n[3].ui;
11647 y.uint32[0] = n[4].ui;
11648 y.uint32[1] = n[5].ui;
11649 z.uint32[0] = n[6].ui;
11650 z.uint32[1] = n[7].ui;
11651 w.uint32[0] = n[8].ui;
11652 w.uint32[1] = n[9].ui;
11654 CALL_Uniform4d(ctx->Exec, (n[1].i, x.d, y.d, z.d, w.d));
11657 case OPCODE_UNIFORM_1DV:
11658 CALL_Uniform1dv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11660 case OPCODE_UNIFORM_2DV:
11661 CALL_Uniform2dv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11663 case OPCODE_UNIFORM_3DV:
11664 CALL_Uniform3dv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11666 case OPCODE_UNIFORM_4DV:
11667 CALL_Uniform4dv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11669 case OPCODE_UNIFORM_1I:
11670 CALL_Uniform1i(ctx->Exec, (n[1].i, n[2].i));
11672 case OPCODE_UNIFORM_2I:
11673 CALL_Uniform2i(ctx->Exec, (n[1].i, n[2].i, n[3].i));
11675 case OPCODE_UNIFORM_3I:
11676 CALL_Uniform3i(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i));
11678 case OPCODE_UNIFORM_4I:
11679 CALL_Uniform4i(ctx->Exec,
11680 (n[1].i, n[2].i, n[3].i, n[4].i, n[5].i));
11682 case OPCODE_UNIFORM_1IV:
11683 CALL_Uniform1iv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11685 case OPCODE_UNIFORM_2IV:
11686 CALL_Uniform2iv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11688 case OPCODE_UNIFORM_3IV:
11689 CALL_Uniform3iv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11691 case OPCODE_UNIFORM_4IV:
11692 CALL_Uniform4iv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11694 case OPCODE_UNIFORM_1UI:
11695 CALL_Uniform1ui(ctx->Exec, (n[1].i, n[2].i));
11697 case OPCODE_UNIFORM_2UI:
11698 CALL_Uniform2ui(ctx->Exec, (n[1].i, n[2].i, n[3].i));
11700 case OPCODE_UNIFORM_3UI:
11701 CALL_Uniform3ui(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i));
11703 case OPCODE_UNIFORM_4UI:
11704 CALL_Uniform4ui(ctx->Exec,
11705 (n[1].i, n[2].i, n[3].i, n[4].i, n[5].i));
11707 case OPCODE_UNIFORM_1UIV:
11708 CALL_Uniform1uiv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11710 case OPCODE_UNIFORM_2UIV:
11711 CALL_Uniform2uiv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11713 case OPCODE_UNIFORM_3UIV:
11714 CALL_Uniform3uiv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11716 case OPCODE_UNIFORM_4UIV:
11717 CALL_Uniform4uiv(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11719 case OPCODE_UNIFORM_MATRIX22:
11720 CALL_UniformMatrix2fv(ctx->Exec,
11721 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11723 case OPCODE_UNIFORM_MATRIX33:
11724 CALL_UniformMatrix3fv(ctx->Exec,
11725 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11727 case OPCODE_UNIFORM_MATRIX44:
11728 CALL_UniformMatrix4fv(ctx->Exec,
11729 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11731 case OPCODE_UNIFORM_MATRIX23:
11732 CALL_UniformMatrix2x3fv(ctx->Exec,
11733 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11735 case OPCODE_UNIFORM_MATRIX32:
11736 CALL_UniformMatrix3x2fv(ctx->Exec,
11737 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11739 case OPCODE_UNIFORM_MATRIX24:
11740 CALL_UniformMatrix2x4fv(ctx->Exec,
11741 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11743 case OPCODE_UNIFORM_MATRIX42:
11744 CALL_UniformMatrix4x2fv(ctx->Exec,
11745 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11747 case OPCODE_UNIFORM_MATRIX34:
11748 CALL_UniformMatrix3x4fv(ctx->Exec,
11749 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11751 case OPCODE_UNIFORM_MATRIX43:
11752 CALL_UniformMatrix4x3fv(ctx->Exec,
11753 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11755 case OPCODE_UNIFORM_MATRIX22D:
11756 CALL_UniformMatrix2dv(ctx->Exec,
11757 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11759 case OPCODE_UNIFORM_MATRIX33D:
11760 CALL_UniformMatrix3dv(ctx->Exec,
11761 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11763 case OPCODE_UNIFORM_MATRIX44D:
11764 CALL_UniformMatrix4dv(ctx->Exec,
11765 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11767 case OPCODE_UNIFORM_MATRIX23D:
11768 CALL_UniformMatrix2x3dv(ctx->Exec,
11769 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11771 case OPCODE_UNIFORM_MATRIX32D:
11772 CALL_UniformMatrix3x2dv(ctx->Exec,
11773 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11775 case OPCODE_UNIFORM_MATRIX24D:
11776 CALL_UniformMatrix2x4dv(ctx->Exec,
11777 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11779 case OPCODE_UNIFORM_MATRIX42D:
11780 CALL_UniformMatrix4x2dv(ctx->Exec,
11781 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11783 case OPCODE_UNIFORM_MATRIX34D:
11784 CALL_UniformMatrix3x4dv(ctx->Exec,
11785 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11787 case OPCODE_UNIFORM_MATRIX43D:
11788 CALL_UniformMatrix4x3dv(ctx->Exec,
11789 (n[1].i, n[2].i, n[3].b, get_pointer(&n[4])));
11792 case OPCODE_UNIFORM_1I64: {
11793 union int64_pair x;
11795 x.int32[0] = n[2].i;
11796 x.int32[1] = n[3].i;
11798 CALL_Uniform1i64ARB(ctx->Exec, (n[1].i, x.int64));
11801 case OPCODE_UNIFORM_2I64: {
11802 union int64_pair x;
11803 union int64_pair y;
11805 x.int32[0] = n[2].i;
11806 x.int32[1] = n[3].i;
11807 y.int32[0] = n[4].i;
11808 y.int32[1] = n[5].i;
11810 CALL_Uniform2i64ARB(ctx->Exec, (n[1].i, x.int64, y.int64));
11813 case OPCODE_UNIFORM_3I64: {
11814 union int64_pair x;
11815 union int64_pair y;
11816 union int64_pair z;
11818 x.int32[0] = n[2].i;
11819 x.int32[1] = n[3].i;
11820 y.int32[0] = n[4].i;
11821 y.int32[1] = n[5].i;
11822 z.int32[0] = n[6].i;
11823 z.int32[1] = n[7].i;
11826 CALL_Uniform3i64ARB(ctx->Exec, (n[1].i, x.int64, y.int64, z.int64));
11829 case OPCODE_UNIFORM_4I64: {
11830 union int64_pair x;
11831 union int64_pair y;
11832 union int64_pair z;
11833 union int64_pair w;
11835 x.int32[0] = n[2].i;
11836 x.int32[1] = n[3].i;
11837 y.int32[0] = n[4].i;
11838 y.int32[1] = n[5].i;
11839 z.int32[0] = n[6].i;
11840 z.int32[1] = n[7].i;
11841 w.int32[0] = n[8].i;
11842 w.int32[1] = n[9].i;
11844 CALL_Uniform4i64ARB(ctx->Exec, (n[1].i, x.int64, y.int64, z.int64, w.int64));
11847 case OPCODE_UNIFORM_1I64V:
11848 CALL_Uniform1i64vARB(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11850 case OPCODE_UNIFORM_2I64V:
11851 CALL_Uniform2i64vARB(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11853 case OPCODE_UNIFORM_3I64V:
11854 CALL_Uniform3i64vARB(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11856 case OPCODE_UNIFORM_4I64V:
11857 CALL_Uniform4i64vARB(ctx->Exec, (n[1].i, n[2].i, get_pointer(&n[3])));
11859 case OPCODE_UNIFORM_1UI64: {
11860 union uint64_pair x;
11862 x.uint32[0] = n[2].ui;
11863 x.uint32[1] = n[3].ui;
11865 CALL_Uniform1ui64ARB(ctx->Exec, (n[1].i, x.uint64));
11868 case OPCODE_UNIFORM_2UI64: {
11869 union uint64_pair x;
11870 union uint64_pair y;
11872 x.uint32[0] = n[2].ui;
11873 x.uint32[1] = n[3].ui;
11874 y.uint32[0] = n[4].ui;
11875 y.uint32[1] = n[5].ui;
11877 CALL_Uniform2ui64ARB(ctx->Exec, (n[1].i, x.uint64, y.uint64));
11880 case OPCODE_UNIFORM_3UI64: {
11881 union uint64_pair x;
11882 union uint64_pair y;
11883 union uint64_pair z;
11885 x.uint32[0] = n[2].ui;
11886 x.uint32[1] = n[3].ui;
11887 y.uint32[0] = n[4].ui;
11888 y.uint32[1] = n[5].ui;
11889 z.uint32[0] = n[6].ui;
11890 z.uint32[1] = n[7].ui;
11893 CALL_Uniform3ui64ARB(ctx->Exec, (n[1].i, x.uint64, y.uint64,
11897 case OPCODE_UNIFORM_4UI64: {
11898 union uint64_pair x;
11899 union uint64_pair y;
11900 union uint64_pair z;
11901 union uint64_pair w;
11903 x.uint32[0] = n[2].ui;
11904 x.uint32[1] = n[3].ui;
11905 y.uint32[0] = n[4].ui;
11906 y.uint32[1] = n[5].ui;
11907 z.uint32[0] = n[6].ui;
11908 z.uint32[1] = n[7].ui;
11909 w.uint32[0] = n[8].ui;
11910 w.uint32[1] = n[9].ui;
11912 CALL_Uniform4ui64ARB(ctx->Exec, (n[1].i, x.uint64, y.uint64,
11913 z.uint64, w.uint64));
11916 case OPCODE_UNIFORM_1UI64V:
11917 CALL_Uniform1ui64vARB(ctx->Exec, (n[1].i, n[2].i,
11918 get_pointer(&n[3])));
11920 case OPCODE_UNIFORM_2UI64V:
11921 CALL_Uniform2ui64vARB(ctx->Exec, (n[1].i, n[2].i,
11922 get_pointer(&n[3])));
11924 case OPCODE_UNIFORM_3UI64V:
11925 CALL_Uniform3ui64vARB(ctx->Exec, (n[1].i, n[2].i,
11926 get_pointer(&n[3])));
11928 case OPCODE_UNIFORM_4UI64V:
11929 CALL_Uniform4ui64vARB(ctx->Exec, (n[1].i, n[2].i,
11930 get_pointer(&n[3])));
11933 case OPCODE_PROGRAM_UNIFORM_1I64: {
11934 union int64_pair x;
11936 x.int32[0] = n[3].i;
11937 x.int32[1] = n[4].i;
11939 CALL_ProgramUniform1i64ARB(ctx->Exec, (n[1].ui, n[2].i, x.int64));
11942 case OPCODE_PROGRAM_UNIFORM_2I64: {
11943 union int64_pair x;
11944 union int64_pair y;
11946 x.int32[0] = n[3].i;
11947 x.int32[1] = n[4].i;
11948 y.int32[0] = n[5].i;
11949 y.int32[1] = n[6].i;
11951 CALL_ProgramUniform2i64ARB(ctx->Exec, (n[1].ui, n[2].i, x.int64,
11955 case OPCODE_PROGRAM_UNIFORM_3I64: {
11956 union int64_pair x;
11957 union int64_pair y;
11958 union int64_pair z;
11960 x.int32[0] = n[3].i;
11961 x.int32[1] = n[4].i;
11962 y.int32[0] = n[5].i;
11963 y.int32[1] = n[6].i;
11964 z.int32[0] = n[7].i;
11965 z.int32[1] = n[8].i;
11967 CALL_ProgramUniform3i64ARB(ctx->Exec, (n[1].ui, n[2].i, x.int64,
11968 y.int64, z.int64));
11971 case OPCODE_PROGRAM_UNIFORM_4I64: {
11972 union int64_pair x;
11973 union int64_pair y;
11974 union int64_pair z;
11975 union int64_pair w;
11977 x.int32[0] = n[3].i;
11978 x.int32[1] = n[4].i;
11979 y.int32[0] = n[5].i;
11980 y.int32[1] = n[6].i;
11981 z.int32[0] = n[7].i;
11982 z.int32[1] = n[8].i;
11983 w.int32[0] = n[9].i;
11984 w.int32[1] = n[10].i;
11986 CALL_ProgramUniform4i64ARB(ctx->Exec, (n[1].ui, n[2].i, x.int64,
11987 y.int64, z.int64, w.int64));
11990 case OPCODE_PROGRAM_UNIFORM_1I64V:
11991 CALL_ProgramUniform1i64vARB(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
11992 get_pointer(&n[4])));
11994 case OPCODE_PROGRAM_UNIFORM_2I64V:
11995 CALL_ProgramUniform2i64vARB(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
11996 get_pointer(&n[4])));
11998 case OPCODE_PROGRAM_UNIFORM_3I64V:
11999 CALL_ProgramUniform3i64vARB(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12000 get_pointer(&n[4])));
12002 case OPCODE_PROGRAM_UNIFORM_4I64V:
12003 CALL_ProgramUniform4i64vARB(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12004 get_pointer(&n[4])));
12006 case OPCODE_PROGRAM_UNIFORM_1UI64: {
12007 union uint64_pair x;
12009 x.uint32[0] = n[3].ui;
12010 x.uint32[1] = n[4].ui;
12012 CALL_ProgramUniform1i64ARB(ctx->Exec, (n[1].ui, n[2].i, x.uint64));
12015 case OPCODE_PROGRAM_UNIFORM_2UI64: {
12016 union uint64_pair x;
12017 union uint64_pair y;
12019 x.uint32[0] = n[3].ui;
12020 x.uint32[1] = n[4].ui;
12021 y.uint32[0] = n[5].ui;
12022 y.uint32[1] = n[6].ui;
12024 CALL_ProgramUniform2ui64ARB(ctx->Exec, (n[1].ui, n[2].i, x.uint64,
12028 case OPCODE_PROGRAM_UNIFORM_3UI64: {
12029 union uint64_pair x;
12030 union uint64_pair y;
12031 union uint64_pair z;
12033 x.uint32[0] = n[3].ui;
12034 x.uint32[1] = n[4].ui;
12035 y.uint32[0] = n[5].ui;
12036 y.uint32[1] = n[6].ui;
12037 z.uint32[0] = n[7].ui;
12038 z.uint32[1] = n[8].ui;
12040 CALL_ProgramUniform3ui64ARB(ctx->Exec, (n[1].ui, n[2].i, x.uint64,
12041 y.uint64, z.uint64));
12044 case OPCODE_PROGRAM_UNIFORM_4UI64: {
12045 union uint64_pair x;
12046 union uint64_pair y;
12047 union uint64_pair z;
12048 union uint64_pair w;
12050 x.uint32[0] = n[3].ui;
12051 x.uint32[1] = n[4].ui;
12052 y.uint32[0] = n[5].ui;
12053 y.uint32[1] = n[6].ui;
12054 z.uint32[0] = n[7].ui;
12055 z.uint32[1] = n[8].ui;
12056 w.uint32[0] = n[9].ui;
12057 w.uint32[1] = n[10].ui;
12059 CALL_ProgramUniform4ui64ARB(ctx->Exec, (n[1].ui, n[2].i, x.uint64,
12060 y.uint64, z.uint64, w.uint64));
12063 case OPCODE_PROGRAM_UNIFORM_1UI64V:
12064 CALL_ProgramUniform1ui64vARB(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12065 get_pointer(&n[4])));
12067 case OPCODE_PROGRAM_UNIFORM_2UI64V:
12068 CALL_ProgramUniform2ui64vARB(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12069 get_pointer(&n[4])));
12071 case OPCODE_PROGRAM_UNIFORM_3UI64V:
12072 CALL_ProgramUniform3ui64vARB(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12073 get_pointer(&n[4])));
12075 case OPCODE_PROGRAM_UNIFORM_4UI64V:
12076 CALL_ProgramUniform4ui64vARB(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12077 get_pointer(&n[4])));
12080 case OPCODE_USE_PROGRAM_STAGES:
12081 CALL_UseProgramStages(ctx->Exec, (n[1].ui, n[2].ui, n[3].ui));
12083 case OPCODE_PROGRAM_UNIFORM_1F:
12084 CALL_ProgramUniform1f(ctx->Exec, (n[1].ui, n[2].i, n[3].f));
12086 case OPCODE_PROGRAM_UNIFORM_2F:
12087 CALL_ProgramUniform2f(ctx->Exec, (n[1].ui, n[2].i, n[3].f, n[4].f));
12089 case OPCODE_PROGRAM_UNIFORM_3F:
12090 CALL_ProgramUniform3f(ctx->Exec, (n[1].ui, n[2].i,
12091 n[3].f, n[4].f, n[5].f));
12093 case OPCODE_PROGRAM_UNIFORM_4F:
12094 CALL_ProgramUniform4f(ctx->Exec, (n[1].ui, n[2].i,
12095 n[3].f, n[4].f, n[5].f, n[6].f));
12097 case OPCODE_PROGRAM_UNIFORM_1FV:
12098 CALL_ProgramUniform1fv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12099 get_pointer(&n[4])));
12101 case OPCODE_PROGRAM_UNIFORM_2FV:
12102 CALL_ProgramUniform2fv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12103 get_pointer(&n[4])));
12105 case OPCODE_PROGRAM_UNIFORM_3FV:
12106 CALL_ProgramUniform3fv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12107 get_pointer(&n[4])));
12109 case OPCODE_PROGRAM_UNIFORM_4FV:
12110 CALL_ProgramUniform4fv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12111 get_pointer(&n[4])));
12113 case OPCODE_PROGRAM_UNIFORM_1D: {
12114 union float64_pair x;
12116 x.uint32[0] = n[3].ui;
12117 x.uint32[1] = n[4].ui;
12119 CALL_ProgramUniform1d(ctx->Exec, (n[1].ui, n[2].i, x.d));
12122 case OPCODE_PROGRAM_UNIFORM_2D: {
12123 union float64_pair x;
12124 union float64_pair y;
12126 x.uint32[0] = n[3].ui;
12127 x.uint32[1] = n[4].ui;
12128 y.uint32[0] = n[5].ui;
12129 y.uint32[1] = n[6].ui;
12131 CALL_ProgramUniform2d(ctx->Exec, (n[1].ui, n[2].i, x.d, y.d));
12134 case OPCODE_PROGRAM_UNIFORM_3D: {
12135 union float64_pair x;
12136 union float64_pair y;
12137 union float64_pair z;
12139 x.uint32[0] = n[3].ui;
12140 x.uint32[1] = n[4].ui;
12141 y.uint32[0] = n[5].ui;
12142 y.uint32[1] = n[6].ui;
12143 z.uint32[0] = n[7].ui;
12144 z.uint32[1] = n[8].ui;
12146 CALL_ProgramUniform3d(ctx->Exec, (n[1].ui, n[2].i,
12150 case OPCODE_PROGRAM_UNIFORM_4D: {
12151 union float64_pair x;
12152 union float64_pair y;
12153 union float64_pair z;
12154 union float64_pair w;
12156 x.uint32[0] = n[3].ui;
12157 x.uint32[1] = n[4].ui;
12158 y.uint32[0] = n[5].ui;
12159 y.uint32[1] = n[6].ui;
12160 z.uint32[0] = n[7].ui;
12161 z.uint32[1] = n[8].ui;
12162 w.uint32[0] = n[9].ui;
12163 w.uint32[1] = n[10].ui;
12165 CALL_ProgramUniform4d(ctx->Exec, (n[1].ui, n[2].i,
12166 x.d, y.d, z.d, w.d));
12169 case OPCODE_PROGRAM_UNIFORM_1DV:
12170 CALL_ProgramUniform1dv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12171 get_pointer(&n[4])));
12173 case OPCODE_PROGRAM_UNIFORM_2DV:
12174 CALL_ProgramUniform2dv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12175 get_pointer(&n[4])));
12177 case OPCODE_PROGRAM_UNIFORM_3DV:
12178 CALL_ProgramUniform3dv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12179 get_pointer(&n[4])));
12181 case OPCODE_PROGRAM_UNIFORM_4DV:
12182 CALL_ProgramUniform4dv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12183 get_pointer(&n[4])));
12185 case OPCODE_PROGRAM_UNIFORM_1I:
12186 CALL_ProgramUniform1i(ctx->Exec, (n[1].ui, n[2].i, n[3].i));
12188 case OPCODE_PROGRAM_UNIFORM_2I:
12189 CALL_ProgramUniform2i(ctx->Exec, (n[1].ui, n[2].i, n[3].i, n[4].i));
12191 case OPCODE_PROGRAM_UNIFORM_3I:
12192 CALL_ProgramUniform3i(ctx->Exec, (n[1].ui, n[2].i,
12193 n[3].i, n[4].i, n[5].i));
12195 case OPCODE_PROGRAM_UNIFORM_4I:
12196 CALL_ProgramUniform4i(ctx->Exec, (n[1].ui, n[2].i,
12197 n[3].i, n[4].i, n[5].i, n[6].i));
12199 case OPCODE_PROGRAM_UNIFORM_1IV:
12200 CALL_ProgramUniform1iv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12201 get_pointer(&n[4])));
12203 case OPCODE_PROGRAM_UNIFORM_2IV:
12204 CALL_ProgramUniform2iv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12205 get_pointer(&n[4])));
12207 case OPCODE_PROGRAM_UNIFORM_3IV:
12208 CALL_ProgramUniform3iv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12209 get_pointer(&n[4])));
12211 case OPCODE_PROGRAM_UNIFORM_4IV:
12212 CALL_ProgramUniform4iv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12213 get_pointer(&n[4])));
12215 case OPCODE_PROGRAM_UNIFORM_1UI:
12216 CALL_ProgramUniform1ui(ctx->Exec, (n[1].ui, n[2].i, n[3].ui));
12218 case OPCODE_PROGRAM_UNIFORM_2UI:
12219 CALL_ProgramUniform2ui(ctx->Exec, (n[1].ui, n[2].i,
12220 n[3].ui, n[4].ui));
12222 case OPCODE_PROGRAM_UNIFORM_3UI:
12223 CALL_ProgramUniform3ui(ctx->Exec, (n[1].ui, n[2].i,
12224 n[3].ui, n[4].ui, n[5].ui));
12226 case OPCODE_PROGRAM_UNIFORM_4UI:
12227 CALL_ProgramUniform4ui(ctx->Exec, (n[1].ui, n[2].i,
12229 n[4].ui, n[5].ui, n[6].ui));
12231 case OPCODE_PROGRAM_UNIFORM_1UIV:
12232 CALL_ProgramUniform1uiv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12233 get_pointer(&n[4])));
12235 case OPCODE_PROGRAM_UNIFORM_2UIV:
12236 CALL_ProgramUniform2uiv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12237 get_pointer(&n[4])));
12239 case OPCODE_PROGRAM_UNIFORM_3UIV:
12240 CALL_ProgramUniform3uiv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12241 get_pointer(&n[4])));
12243 case OPCODE_PROGRAM_UNIFORM_4UIV:
12244 CALL_ProgramUniform4uiv(ctx->Exec, (n[1].ui, n[2].i, n[3].i,
12245 get_pointer(&n[4])));
12247 case OPCODE_PROGRAM_UNIFORM_MATRIX22F:
12248 CALL_ProgramUniformMatrix2fv(ctx->Exec,
12249 (n[1].ui, n[2].i, n[3].i, n[4].b,
12250 get_pointer(&n[5])));
12252 case OPCODE_PROGRAM_UNIFORM_MATRIX23F:
12253 CALL_ProgramUniformMatrix2x3fv(ctx->Exec,
12254 (n[1].ui, n[2].i, n[3].i, n[4].b,
12255 get_pointer(&n[5])));
12257 case OPCODE_PROGRAM_UNIFORM_MATRIX24F:
12258 CALL_ProgramUniformMatrix2x4fv(ctx->Exec,
12259 (n[1].ui, n[2].i, n[3].i, n[4].b,
12260 get_pointer(&n[5])));
12262 case OPCODE_PROGRAM_UNIFORM_MATRIX32F:
12263 CALL_ProgramUniformMatrix3x2fv(ctx->Exec,
12264 (n[1].ui, n[2].i, n[3].i, n[4].b,
12265 get_pointer(&n[5])));
12267 case OPCODE_PROGRAM_UNIFORM_MATRIX33F:
12268 CALL_ProgramUniformMatrix3fv(ctx->Exec,
12269 (n[1].ui, n[2].i, n[3].i, n[4].b,
12270 get_pointer(&n[5])));
12272 case OPCODE_PROGRAM_UNIFORM_MATRIX34F:
12273 CALL_ProgramUniformMatrix3x4fv(ctx->Exec,
12274 (n[1].ui, n[2].i, n[3].i, n[4].b,
12275 get_pointer(&n[5])));
12277 case OPCODE_PROGRAM_UNIFORM_MATRIX42F:
12278 CALL_ProgramUniformMatrix4x2fv(ctx->Exec,
12279 (n[1].ui, n[2].i, n[3].i, n[4].b,
12280 get_pointer(&n[5])));
12282 case OPCODE_PROGRAM_UNIFORM_MATRIX43F:
12283 CALL_ProgramUniformMatrix4x3fv(ctx->Exec,
12284 (n[1].ui, n[2].i, n[3].i, n[4].b,
12285 get_pointer(&n[5])));
12287 case OPCODE_PROGRAM_UNIFORM_MATRIX44F:
12288 CALL_ProgramUniformMatrix4fv(ctx->Exec,
12289 (n[1].ui, n[2].i, n[3].i, n[4].b,
12290 get_pointer(&n[5])));
12292 case OPCODE_PROGRAM_UNIFORM_MATRIX22D:
12293 CALL_ProgramUniformMatrix2dv(ctx->Exec,
12294 (n[1].ui, n[2].i, n[3].i, n[4].b,
12295 get_pointer(&n[5])));
12297 case OPCODE_PROGRAM_UNIFORM_MATRIX23D:
12298 CALL_ProgramUniformMatrix2x3dv(ctx->Exec,
12299 (n[1].ui, n[2].i, n[3].i, n[4].b,
12300 get_pointer(&n[5])));
12302 case OPCODE_PROGRAM_UNIFORM_MATRIX24D:
12303 CALL_ProgramUniformMatrix2x4dv(ctx->Exec,
12304 (n[1].ui, n[2].i, n[3].i, n[4].b,
12305 get_pointer(&n[5])));
12307 case OPCODE_PROGRAM_UNIFORM_MATRIX32D:
12308 CALL_ProgramUniformMatrix3x2dv(ctx->Exec,
12309 (n[1].ui, n[2].i, n[3].i, n[4].b,
12310 get_pointer(&n[5])));
12312 case OPCODE_PROGRAM_UNIFORM_MATRIX33D:
12313 CALL_ProgramUniformMatrix3dv(ctx->Exec,
12314 (n[1].ui, n[2].i, n[3].i, n[4].b,
12315 get_pointer(&n[5])));
12317 case OPCODE_PROGRAM_UNIFORM_MATRIX34D:
12318 CALL_ProgramUniformMatrix3x4dv(ctx->Exec,
12319 (n[1].ui, n[2].i, n[3].i, n[4].b,
12320 get_pointer(&n[5])));
12322 case OPCODE_PROGRAM_UNIFORM_MATRIX42D:
12323 CALL_ProgramUniformMatrix4x2dv(ctx->Exec,
12324 (n[1].ui, n[2].i, n[3].i, n[4].b,
12325 get_pointer(&n[5])));
12327 case OPCODE_PROGRAM_UNIFORM_MATRIX43D:
12328 CALL_ProgramUniformMatrix4x3dv(ctx->Exec,
12329 (n[1].ui, n[2].i, n[3].i, n[4].b,
12330 get_pointer(&n[5])));
12332 case OPCODE_PROGRAM_UNIFORM_MATRIX44D:
12333 CALL_ProgramUniformMatrix4dv(ctx->Exec,
12334 (n[1].ui, n[2].i, n[3].i, n[4].b,
12335 get_pointer(&n[5])));
12338 case OPCODE_CLIP_CONTROL:
12339 CALL_ClipControl(ctx->Exec, (n[1].e, n[2].e));
12342 case OPCODE_CLAMP_COLOR:
12343 CALL_ClampColor(ctx->Exec, (n[1].e, n[2].e));
12346 case OPCODE_BIND_FRAGMENT_SHADER_ATI:
12347 CALL_BindFragmentShaderATI(ctx->Exec, (n[1].i));
12349 case OPCODE_SET_FRAGMENT_SHADER_CONSTANTS_ATI:
12350 CALL_SetFragmentShaderConstantATI(ctx->Exec, (n[1].ui, &n[2].f));
12352 case OPCODE_ATTR_1F_NV:
12353 CALL_VertexAttrib1fNV(ctx->Exec, (n[1].e, n[2].f));
12355 case OPCODE_ATTR_2F_NV:
12356 CALL_VertexAttrib2fvNV(ctx->Exec, (n[1].e, &n[2].f));
12358 case OPCODE_ATTR_3F_NV:
12359 CALL_VertexAttrib3fvNV(ctx->Exec, (n[1].e, &n[2].f));
12361 case OPCODE_ATTR_4F_NV:
12362 CALL_VertexAttrib4fvNV(ctx->Exec, (n[1].e, &n[2].f));
12364 case OPCODE_ATTR_1F_ARB:
12365 CALL_VertexAttrib1fARB(ctx->Exec, (n[1].e, n[2].f));
12367 case OPCODE_ATTR_2F_ARB:
12368 CALL_VertexAttrib2fvARB(ctx->Exec, (n[1].e, &n[2].f));
12370 case OPCODE_ATTR_3F_ARB:
12371 CALL_VertexAttrib3fvARB(ctx->Exec, (n[1].e, &n[2].f));
12373 case OPCODE_ATTR_4F_ARB:
12374 CALL_VertexAttrib4fvARB(ctx->Exec, (n[1].e, &n[2].f));
12376 case OPCODE_ATTR_1I:
12377 CALL_VertexAttribI1iEXT(ctx->Exec, (n[1].e, n[2].i));
12379 case OPCODE_ATTR_2I:
12380 CALL_VertexAttribI2ivEXT(ctx->Exec, (n[1].e, &n[2].i));
12382 case OPCODE_ATTR_3I:
12383 CALL_VertexAttribI3ivEXT(ctx->Exec, (n[1].e, &n[2].i));
12385 case OPCODE_ATTR_4I:
12386 CALL_VertexAttribI4ivEXT(ctx->Exec, (n[1].e, &n[2].i));
12388 case OPCODE_ATTR_1D: {
12389 GLdouble *d = (GLdouble *) &n[2];
12390 CALL_VertexAttribL1d(ctx->Exec, (n[1].ui, *d));
12393 case OPCODE_ATTR_2D: {
12394 GLdouble *d = (GLdouble *) &n[2];
12395 CALL_VertexAttribL2dv(ctx->Exec, (n[1].ui, d));
12398 case OPCODE_ATTR_3D: {
12399 GLdouble *d = (GLdouble *) &n[2];
12400 CALL_VertexAttribL3dv(ctx->Exec, (n[1].ui, d));
12403 case OPCODE_ATTR_4D: {
12404 GLdouble *d = (GLdouble *) &n[2];
12405 CALL_VertexAttribL4dv(ctx->Exec, (n[1].ui, d));
12408 case OPCODE_ATTR_1UI64: {
12409 uint64_t *ui64 = (uint64_t *) &n[2];
12410 CALL_VertexAttribL1ui64ARB(ctx->Exec, (n[1].ui, *ui64));
12413 case OPCODE_MATERIAL:
12414 CALL_Materialfv(ctx->Exec, (n[1].e, n[2].e, &n[3].f));
12417 CALL_Begin(ctx->Exec, (n[1].e));
12420 CALL_End(ctx->Exec, ());
12422 case OPCODE_EVAL_C1:
12423 CALL_EvalCoord1f(ctx->Exec, (n[1].f));
12425 case OPCODE_EVAL_C2:
12426 CALL_EvalCoord2f(ctx->Exec, (n[1].f, n[2].f));
12428 case OPCODE_EVAL_P1:
12429 CALL_EvalPoint1(ctx->Exec, (n[1].i));
12431 case OPCODE_EVAL_P2:
12432 CALL_EvalPoint2(ctx->Exec, (n[1].i, n[2].i));
12435 /* GL_EXT_texture_integer */
12436 case OPCODE_CLEARCOLOR_I:
12437 CALL_ClearColorIiEXT(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i));
12439 case OPCODE_CLEARCOLOR_UI:
12440 CALL_ClearColorIuiEXT(ctx->Exec,
12441 (n[1].ui, n[2].ui, n[3].ui, n[4].ui));
12443 case OPCODE_TEXPARAMETER_I:
12446 params[0] = n[3].i;
12447 params[1] = n[4].i;
12448 params[2] = n[5].i;
12449 params[3] = n[6].i;
12450 CALL_TexParameterIiv(ctx->Exec, (n[1].e, n[2].e, params));
12453 case OPCODE_TEXPARAMETER_UI:
12456 params[0] = n[3].ui;
12457 params[1] = n[4].ui;
12458 params[2] = n[5].ui;
12459 params[3] = n[6].ui;
12460 CALL_TexParameterIuiv(ctx->Exec, (n[1].e, n[2].e, params));
12464 case OPCODE_VERTEX_ATTRIB_DIVISOR:
12465 /* GL_ARB_instanced_arrays */
12466 CALL_VertexAttribDivisor(ctx->Exec, (n[1].ui, n[2].ui));
12469 case OPCODE_TEXTURE_BARRIER_NV:
12470 CALL_TextureBarrierNV(ctx->Exec, ());
12473 /* GL_EXT/ARB_transform_feedback */
12474 case OPCODE_BEGIN_TRANSFORM_FEEDBACK:
12475 CALL_BeginTransformFeedback(ctx->Exec, (n[1].e));
12477 case OPCODE_END_TRANSFORM_FEEDBACK:
12478 CALL_EndTransformFeedback(ctx->Exec, ());
12480 case OPCODE_BIND_TRANSFORM_FEEDBACK:
12481 CALL_BindTransformFeedback(ctx->Exec, (n[1].e, n[2].ui));
12483 case OPCODE_PAUSE_TRANSFORM_FEEDBACK:
12484 CALL_PauseTransformFeedback(ctx->Exec, ());
12486 case OPCODE_RESUME_TRANSFORM_FEEDBACK:
12487 CALL_ResumeTransformFeedback(ctx->Exec, ());
12489 case OPCODE_DRAW_TRANSFORM_FEEDBACK:
12490 CALL_DrawTransformFeedback(ctx->Exec, (n[1].e, n[2].ui));
12492 case OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM:
12493 CALL_DrawTransformFeedbackStream(ctx->Exec,
12494 (n[1].e, n[2].ui, n[3].ui));
12496 case OPCODE_DRAW_TRANSFORM_FEEDBACK_INSTANCED:
12497 CALL_DrawTransformFeedbackInstanced(ctx->Exec,
12498 (n[1].e, n[2].ui, n[3].si));
12500 case OPCODE_DRAW_TRANSFORM_FEEDBACK_STREAM_INSTANCED:
12501 CALL_DrawTransformFeedbackStreamInstanced(ctx->Exec,
12502 (n[1].e, n[2].ui, n[3].ui, n[4].si));
12506 case OPCODE_BIND_SAMPLER:
12507 CALL_BindSampler(ctx->Exec, (n[1].ui, n[2].ui));
12509 case OPCODE_SAMPLER_PARAMETERIV:
12512 params[0] = n[3].i;
12513 params[1] = n[4].i;
12514 params[2] = n[5].i;
12515 params[3] = n[6].i;
12516 CALL_SamplerParameteriv(ctx->Exec, (n[1].ui, n[2].e, params));
12519 case OPCODE_SAMPLER_PARAMETERFV:
12522 params[0] = n[3].f;
12523 params[1] = n[4].f;
12524 params[2] = n[5].f;
12525 params[3] = n[6].f;
12526 CALL_SamplerParameterfv(ctx->Exec, (n[1].ui, n[2].e, params));
12529 case OPCODE_SAMPLER_PARAMETERIIV:
12532 params[0] = n[3].i;
12533 params[1] = n[4].i;
12534 params[2] = n[5].i;
12535 params[3] = n[6].i;
12536 CALL_SamplerParameterIiv(ctx->Exec, (n[1].ui, n[2].e, params));
12539 case OPCODE_SAMPLER_PARAMETERUIV:
12542 params[0] = n[3].ui;
12543 params[1] = n[4].ui;
12544 params[2] = n[5].ui;
12545 params[3] = n[6].ui;
12546 CALL_SamplerParameterIuiv(ctx->Exec, (n[1].ui, n[2].e, params));
12550 /* ARB_compute_shader */
12551 case OPCODE_DISPATCH_COMPUTE:
12552 CALL_DispatchCompute(ctx->Exec, (n[1].ui, n[2].ui, n[3].ui));
12556 case OPCODE_WAIT_SYNC:
12558 union uint64_pair p;
12559 p.uint32[0] = n[2].ui;
12560 p.uint32[1] = n[3].ui;
12561 CALL_WaitSync(ctx->Exec,
12562 (get_pointer(&n[4]), n[1].bf, p.uint64));
12566 /* GL_NV_conditional_render */
12567 case OPCODE_BEGIN_CONDITIONAL_RENDER:
12568 CALL_BeginConditionalRender(ctx->Exec, (n[1].i, n[2].e));
12570 case OPCODE_END_CONDITIONAL_RENDER:
12571 CALL_EndConditionalRender(ctx->Exec, ());
12574 case OPCODE_UNIFORM_BLOCK_BINDING:
12575 CALL_UniformBlockBinding(ctx->Exec, (n[1].ui, n[2].ui, n[3].ui));
12578 case OPCODE_UNIFORM_SUBROUTINES:
12579 CALL_UniformSubroutinesuiv(ctx->Exec, (n[1].e, n[2].si,
12580 get_pointer(&n[3])));
12583 /* GL_EXT_window_rectangles */
12584 case OPCODE_WINDOW_RECTANGLES:
12585 CALL_WindowRectanglesEXT(
12586 ctx->Exec, (n[1].e, n[2].si, get_pointer(&n[3])));
12589 /* GL_NV_conservative_raster */
12590 case OPCODE_SUBPIXEL_PRECISION_BIAS:
12591 CALL_SubpixelPrecisionBiasNV(ctx->Exec, (n[1].ui, n[2].ui));
12594 /* GL_NV_conservative_raster_dilate */
12595 case OPCODE_CONSERVATIVE_RASTER_PARAMETER_F:
12596 CALL_ConservativeRasterParameterfNV(ctx->Exec, (n[1].e, n[2].f));
12599 /* GL_NV_conservative_raster_pre_snap_triangles */
12600 case OPCODE_CONSERVATIVE_RASTER_PARAMETER_I:
12601 CALL_ConservativeRasterParameteriNV(ctx->Exec, (n[1].e, n[2].i));
12604 /* GL_EXT_direct_state_access */
12605 case OPCODE_MATRIX_LOAD:
12606 CALL_MatrixLoadfEXT(ctx->Exec, (n[1].e, &n[2].f));
12608 case OPCODE_MATRIX_MULT:
12609 CALL_MatrixMultfEXT(ctx->Exec, (n[1].e, &n[2].f));
12611 case OPCODE_MATRIX_ROTATE:
12612 CALL_MatrixRotatefEXT(ctx->Exec, (n[1].e, n[2].f, n[3].f, n[4].f, n[5].f));
12614 case OPCODE_MATRIX_SCALE:
12615 CALL_MatrixScalefEXT(ctx->Exec, (n[1].e, n[2].f, n[3].f, n[4].f));
12617 case OPCODE_MATRIX_TRANSLATE:
12618 CALL_MatrixTranslatefEXT(ctx->Exec, (n[1].e, n[2].f, n[3].f, n[4].f));
12620 case OPCODE_MATRIX_LOAD_IDENTITY:
12621 CALL_MatrixLoadIdentityEXT(ctx->Exec, (n[1].e));
12623 case OPCODE_MATRIX_ORTHO:
12624 CALL_MatrixOrthoEXT(ctx->Exec, (n[1].e,
12625 n[2].f, n[3].f, n[4].f,
12626 n[5].f, n[6].f, n[7].f));
12628 case OPCODE_MATRIX_FRUSTUM:
12629 CALL_MatrixFrustumEXT(ctx->Exec, (n[1].e,
12630 n[2].f, n[3].f, n[4].f,
12631 n[5].f, n[6].f, n[7].f));
12633 case OPCODE_MATRIX_PUSH:
12634 CALL_MatrixPushEXT(ctx->Exec, (n[1].e));
12636 case OPCODE_MATRIX_POP:
12637 CALL_MatrixPopEXT(ctx->Exec, (n[1].e));
12639 case OPCODE_TEXTUREPARAMETER_F:
12642 params[0] = n[4].f;
12643 params[1] = n[5].f;
12644 params[2] = n[6].f;
12645 params[3] = n[7].f;
12646 CALL_TextureParameterfvEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].e, params));
12649 case OPCODE_TEXTUREPARAMETER_I:
12652 params[0] = n[4].i;
12653 params[1] = n[5].i;
12654 params[2] = n[6].i;
12655 params[3] = n[7].i;
12656 CALL_TextureParameterivEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].e, params));
12659 case OPCODE_TEXTUREPARAMETER_II:
12662 params[0] = n[4].i;
12663 params[1] = n[5].i;
12664 params[2] = n[6].i;
12665 params[3] = n[7].i;
12666 CALL_TextureParameterIivEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].e, params));
12669 case OPCODE_TEXTUREPARAMETER_IUI:
12672 params[0] = n[4].ui;
12673 params[1] = n[5].ui;
12674 params[2] = n[6].ui;
12675 params[3] = n[7].ui;
12676 CALL_TextureParameterIuivEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].e, params));
12679 case OPCODE_TEXTURE_IMAGE1D:
12681 const struct gl_pixelstore_attrib save = ctx->Unpack;
12682 ctx->Unpack = ctx->DefaultPacking;
12683 CALL_TextureImage1DEXT(ctx->Exec, (n[1].ui, /* texture */
12684 n[2].e, /* target */
12685 n[3].i, /* level */
12686 n[4].i, /* components */
12687 n[5].i, /* width */
12688 n[6].e, /* border */
12689 n[7].e, /* format */
12691 get_pointer(&n[9])));
12692 ctx->Unpack = save; /* restore */
12695 case OPCODE_TEXTURE_IMAGE2D:
12697 const struct gl_pixelstore_attrib save = ctx->Unpack;
12698 ctx->Unpack = ctx->DefaultPacking;
12699 CALL_TextureImage2DEXT(ctx->Exec, (n[1].ui, /* texture */
12700 n[2].e, /* target */
12701 n[3].i, /* level */
12702 n[4].i, /* components */
12703 n[5].i, /* width */
12704 n[6].i, /* height */
12705 n[7].e, /* border */
12706 n[8].e, /* format */
12708 get_pointer(&n[10])));
12709 ctx->Unpack = save; /* restore */
12712 case OPCODE_TEXTURE_IMAGE3D:
12714 const struct gl_pixelstore_attrib save = ctx->Unpack;
12715 ctx->Unpack = ctx->DefaultPacking;
12716 CALL_TextureImage3DEXT(ctx->Exec, (n[1].ui, /* texture */
12717 n[2].e, /* target */
12718 n[3].i, /* level */
12719 n[4].i, /* components */
12720 n[5].i, /* width */
12721 n[6].i, /* height */
12722 n[7].i, /* depth */
12723 n[8].e, /* border */
12724 n[9].e, /* format */
12725 n[10].e, /* type */
12726 get_pointer(&n[11])));
12727 ctx->Unpack = save; /* restore */
12730 case OPCODE_TEXTURE_SUB_IMAGE1D:
12732 const struct gl_pixelstore_attrib save = ctx->Unpack;
12733 ctx->Unpack = ctx->DefaultPacking;
12734 CALL_TextureSubImage1DEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].i,
12735 n[4].i, n[5].i, n[6].e,
12736 n[7].e, get_pointer(&n[8])));
12737 ctx->Unpack = save; /* restore */
12740 case OPCODE_TEXTURE_SUB_IMAGE2D:
12742 const struct gl_pixelstore_attrib save = ctx->Unpack;
12743 ctx->Unpack = ctx->DefaultPacking;
12744 CALL_TextureSubImage2DEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].i,
12745 n[4].i, n[5].i, n[6].e,
12746 n[7].i, n[8].e, n[9].e,
12747 get_pointer(&n[10])));
12748 ctx->Unpack = save;
12751 case OPCODE_TEXTURE_SUB_IMAGE3D:
12753 const struct gl_pixelstore_attrib save = ctx->Unpack;
12754 ctx->Unpack = ctx->DefaultPacking;
12755 CALL_TextureSubImage3DEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].i,
12756 n[4].i, n[5].i, n[6].i,
12757 n[7].i, n[8].i, n[9].i,
12759 get_pointer(&n[12])));
12760 ctx->Unpack = save; /* restore */
12763 case OPCODE_COPY_TEXTURE_IMAGE1D:
12764 CALL_CopyTextureImage1DEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].i,
12765 n[4].e, n[5].i, n[6].i,
12768 case OPCODE_COPY_TEXTURE_IMAGE2D:
12769 CALL_CopyTextureImage2DEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].i,
12770 n[4].e, n[5].i, n[6].i,
12771 n[7].i, n[8].i, n[9].i));
12773 case OPCODE_COPY_TEXTURE_SUB_IMAGE1D:
12774 CALL_CopyTextureSubImage1DEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].i,
12775 n[4].i, n[5].i, n[6].i,
12778 case OPCODE_COPY_TEXTURE_SUB_IMAGE2D:
12779 CALL_CopyTextureSubImage2DEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].i,
12780 n[4].i, n[5].i, n[6].i,
12781 n[7].i, n[8].i, n[9].i));
12783 case OPCODE_COPY_TEXTURE_SUB_IMAGE3D:
12784 CALL_CopyTextureSubImage3DEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].i,
12785 n[4].i, n[5].i, n[6].i,
12786 n[7].i, n[8].i, n[9].i,
12789 case OPCODE_BIND_MULTITEXTURE:
12790 CALL_BindMultiTextureEXT(ctx->Exec, (n[1].e, n[2].e, n[3].ui));
12792 case OPCODE_MULTITEXPARAMETER_F:
12795 params[0] = n[4].f;
12796 params[1] = n[5].f;
12797 params[2] = n[6].f;
12798 params[3] = n[7].f;
12799 CALL_MultiTexParameterfvEXT(ctx->Exec, (n[1].e, n[2].e, n[3].e, params));
12802 case OPCODE_MULTITEXPARAMETER_I:
12805 params[0] = n[4].i;
12806 params[1] = n[5].i;
12807 params[2] = n[6].i;
12808 params[3] = n[7].i;
12809 CALL_MultiTexParameterivEXT(ctx->Exec, (n[1].e, n[2].e, n[3].e, params));
12812 case OPCODE_MULTITEXPARAMETER_II:
12815 params[0] = n[4].i;
12816 params[1] = n[5].i;
12817 params[2] = n[6].i;
12818 params[3] = n[7].i;
12819 CALL_MultiTexParameterIivEXT(ctx->Exec, (n[1].e, n[2].e, n[3].e, params));
12822 case OPCODE_MULTITEXPARAMETER_IUI:
12825 params[0] = n[4].ui;
12826 params[1] = n[5].ui;
12827 params[2] = n[6].ui;
12828 params[3] = n[7].ui;
12829 CALL_MultiTexParameterIuivEXT(ctx->Exec, (n[1].e, n[2].e, n[3].e, params));
12832 case OPCODE_MULTITEX_IMAGE1D:
12834 const struct gl_pixelstore_attrib save = ctx->Unpack;
12835 ctx->Unpack = ctx->DefaultPacking;
12836 CALL_MultiTexImage1DEXT(ctx->Exec, (n[1].e, /* texture */
12837 n[2].e, /* target */
12838 n[3].i, /* level */
12839 n[4].i, /* components */
12840 n[5].i, /* width */
12841 n[6].e, /* border */
12842 n[7].e, /* format */
12844 get_pointer(&n[9])));
12845 ctx->Unpack = save; /* restore */
12848 case OPCODE_MULTITEX_IMAGE2D:
12850 const struct gl_pixelstore_attrib save = ctx->Unpack;
12851 ctx->Unpack = ctx->DefaultPacking;
12852 CALL_MultiTexImage2DEXT(ctx->Exec, (n[1].e, /* texture */
12853 n[2].e, /* target */
12854 n[3].i, /* level */
12855 n[4].i, /* components */
12856 n[5].i, /* width */
12857 n[6].i, /* height */
12858 n[7].e, /* border */
12859 n[8].e, /* format */
12861 get_pointer(&n[10])));
12862 ctx->Unpack = save; /* restore */
12865 case OPCODE_MULTITEX_IMAGE3D:
12867 const struct gl_pixelstore_attrib save = ctx->Unpack;
12868 ctx->Unpack = ctx->DefaultPacking;
12869 CALL_MultiTexImage3DEXT(ctx->Exec, (n[1].e, /* texture */
12870 n[2].e, /* target */
12871 n[3].i, /* level */
12872 n[4].i, /* components */
12873 n[5].i, /* width */
12874 n[6].i, /* height */
12875 n[7].i, /* depth */
12876 n[8].e, /* border */
12877 n[9].e, /* format */
12878 n[10].e, /* type */
12879 get_pointer(&n[11])));
12880 ctx->Unpack = save; /* restore */
12883 case OPCODE_MULTITEX_SUB_IMAGE1D:
12885 const struct gl_pixelstore_attrib save = ctx->Unpack;
12886 ctx->Unpack = ctx->DefaultPacking;
12887 CALL_MultiTexSubImage1DEXT(ctx->Exec, (n[1].e, n[2].e, n[3].i,
12888 n[4].i, n[5].i, n[6].e,
12889 n[7].e, get_pointer(&n[8])));
12890 ctx->Unpack = save; /* restore */
12893 case OPCODE_MULTITEX_SUB_IMAGE2D:
12895 const struct gl_pixelstore_attrib save = ctx->Unpack;
12896 ctx->Unpack = ctx->DefaultPacking;
12897 CALL_MultiTexSubImage2DEXT(ctx->Exec, (n[1].e, n[2].e, n[3].i,
12898 n[4].i, n[5].i, n[6].e,
12899 n[7].i, n[8].e, n[9].e,
12900 get_pointer(&n[10])));
12901 ctx->Unpack = save; /* restore */
12904 case OPCODE_MULTITEX_SUB_IMAGE3D:
12906 const struct gl_pixelstore_attrib save = ctx->Unpack;
12907 ctx->Unpack = ctx->DefaultPacking;
12908 CALL_MultiTexSubImage3DEXT(ctx->Exec, (n[1].e, n[2].e, n[3].i,
12909 n[4].i, n[5].i, n[6].i,
12910 n[7].i, n[8].i, n[9].i,
12912 get_pointer(&n[12])));
12913 ctx->Unpack = save; /* restore */
12916 case OPCODE_COPY_MULTITEX_IMAGE1D:
12917 CALL_CopyMultiTexImage1DEXT(ctx->Exec, (n[1].e, n[2].e, n[3].i,
12918 n[4].e, n[5].i, n[6].i,
12921 case OPCODE_COPY_MULTITEX_IMAGE2D:
12922 CALL_CopyMultiTexImage2DEXT(ctx->Exec, (n[1].e, n[2].e, n[3].i,
12923 n[4].e, n[5].i, n[6].i,
12924 n[7].i, n[8].i, n[9].i));
12926 case OPCODE_COPY_MULTITEX_SUB_IMAGE1D:
12927 CALL_CopyMultiTexSubImage1DEXT(ctx->Exec, (n[1].e, n[2].e, n[3].i,
12928 n[4].i, n[5].i, n[6].i,
12931 case OPCODE_COPY_MULTITEX_SUB_IMAGE2D:
12932 CALL_CopyMultiTexSubImage2DEXT(ctx->Exec, (n[1].e, n[2].e, n[3].i,
12933 n[4].i, n[5].i, n[6].i,
12934 n[7].i, n[8].i, n[9].i));
12936 case OPCODE_COPY_MULTITEX_SUB_IMAGE3D:
12937 CALL_CopyMultiTexSubImage3DEXT(ctx->Exec, (n[1].e, n[2].e, n[3].i,
12938 n[4].i, n[5].i, n[6].i,
12939 n[7].i, n[8].i, n[9].i,
12942 case OPCODE_MULTITEXENV:
12945 params[0] = n[4].f;
12946 params[1] = n[5].f;
12947 params[2] = n[6].f;
12948 params[3] = n[7].f;
12949 CALL_MultiTexEnvfvEXT(ctx->Exec, (n[1].e, n[2].e, n[3].e, params));
12952 case OPCODE_COMPRESSED_TEXTURE_IMAGE_1D:
12953 CALL_CompressedTextureImage1DEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].i,
12954 n[4].e, n[5].i, n[6].i,
12955 n[7].i, get_pointer(&n[8])));
12957 case OPCODE_COMPRESSED_TEXTURE_IMAGE_2D:
12958 CALL_CompressedTextureImage2DEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].i,
12959 n[4].e, n[5].i, n[6].i,
12961 get_pointer(&n[9])));
12963 case OPCODE_COMPRESSED_TEXTURE_IMAGE_3D:
12964 CALL_CompressedTextureImage3DEXT(ctx->Exec, (n[1].ui, n[2].e, n[3].i,
12965 n[4].e, n[5].i, n[6].i,
12966 n[7].i, n[8].i, n[9].i,
12967 get_pointer(&n[10])));
12969 case OPCODE_COMPRESSED_TEXTURE_SUB_IMAGE_1D:
12970 CALL_CompressedTextureSubImage1DEXT(ctx->Exec,
12971 (n[1].ui, n[2].e, n[3].i, n[4].i,
12972 n[5].i, n[6].e, n[7].i,
12973 get_pointer(&n[8])));
12975 case OPCODE_COMPRESSED_TEXTURE_SUB_IMAGE_2D:
12976 CALL_CompressedTextureSubImage2DEXT(ctx->Exec,
12977 (n[1].ui, n[2].e, n[3].i, n[4].i,
12978 n[5].i, n[6].i, n[7].i, n[8].e,
12979 n[9].i, get_pointer(&n[10])));
12981 case OPCODE_COMPRESSED_TEXTURE_SUB_IMAGE_3D:
12982 CALL_CompressedTextureSubImage3DEXT(ctx->Exec,
12983 (n[1].ui, n[2].e, n[3].i, n[4].i,
12984 n[5].i, n[6].i, n[7].i, n[8].i,
12985 n[9].i, n[10].e, n[11].i,
12986 get_pointer(&n[12])));
12988 case OPCODE_COMPRESSED_MULTITEX_IMAGE_1D:
12989 CALL_CompressedMultiTexImage1DEXT(ctx->Exec, (n[1].e, n[2].e, n[3].i,
12990 n[4].e, n[5].i, n[6].i,
12991 n[7].i, get_pointer(&n[8])));
12993 case OPCODE_COMPRESSED_MULTITEX_IMAGE_2D:
12994 CALL_CompressedMultiTexImage2DEXT(ctx->Exec, (n[1].e, n[2].e, n[3].i,
12995 n[4].e, n[5].i, n[6].i,
12997 get_pointer(&n[9])));
12999 case OPCODE_COMPRESSED_MULTITEX_IMAGE_3D:
13000 CALL_CompressedMultiTexImage3DEXT(ctx->Exec, (n[1].e, n[2].e, n[3].i,
13001 n[4].e, n[5].i, n[6].i,
13002 n[7].i, n[8].i, n[9].i,
13003 get_pointer(&n[10])));
13005 case OPCODE_COMPRESSED_MULTITEX_SUB_IMAGE_1D:
13006 CALL_CompressedMultiTexSubImage1DEXT(ctx->Exec,
13007 (n[1].e, n[2].e, n[3].i, n[4].i,
13008 n[5].i, n[6].e, n[7].i,
13009 get_pointer(&n[8])));
13011 case OPCODE_COMPRESSED_MULTITEX_SUB_IMAGE_2D:
13012 CALL_CompressedMultiTexSubImage2DEXT(ctx->Exec,
13013 (n[1].e, n[2].e, n[3].i, n[4].i,
13014 n[5].i, n[6].i, n[7].i, n[8].e,
13015 n[9].i, get_pointer(&n[10])));
13017 case OPCODE_COMPRESSED_MULTITEX_SUB_IMAGE_3D:
13018 CALL_CompressedMultiTexSubImage3DEXT(ctx->Exec,
13019 (n[1].e, n[2].e, n[3].i, n[4].i,
13020 n[5].i, n[6].i, n[7].i, n[8].i,
13021 n[9].i, n[10].e, n[11].i,
13022 get_pointer(&n[12])));
13024 case OPCODE_NAMED_PROGRAM_STRING:
13025 CALL_NamedProgramStringEXT(ctx->Exec,
13026 (n[1].ui, n[2].e, n[3].e, n[4].i,
13027 get_pointer(&n[5])));
13029 case OPCODE_NAMED_PROGRAM_LOCAL_PARAMETER:
13030 CALL_NamedProgramLocalParameter4fEXT(ctx->Exec,
13031 (n[1].ui, n[2].e, n[3].ui, n[4].f,
13032 n[5].f, n[6].f, n[7].f));
13035 case OPCODE_PRIMITIVE_BOUNDING_BOX:
13036 CALL_PrimitiveBoundingBox(ctx->Exec,
13037 (n[1].f, n[2].f, n[3].f, n[4].f,
13038 n[5].f, n[6].f, n[7].f, n[8].f));
13040 case OPCODE_VERTEX_LIST:
13041 vbo_save_playback_vertex_list(ctx, &n[0], false);
13044 case OPCODE_VERTEX_LIST_COPY_CURRENT:
13045 vbo_save_playback_vertex_list(ctx, &n[0], true);
13048 case OPCODE_VERTEX_LIST_LOOPBACK:
13049 vbo_save_playback_vertex_list_loopback(ctx, &n[0]);
13052 case OPCODE_CONTINUE:
13053 n = (Node *) get_pointer(&n[1]);
13058 snprintf(msg, sizeof(msg), "Error in execute_list: opcode=%d",
13060 _mesa_problem(ctx, "%s", msg);
13063 case OPCODE_END_OF_LIST:
13067 /* increment n to point to next compiled command */
13068 assert(n[0].InstSize > 0);
13069 n += n[0].InstSize;
13075 /**********************************************************************/
13077 /**********************************************************************/
13080 * Test if a display list number is valid.
13082 GLboolean GLAPIENTRY
13083 _mesa_IsList(GLuint list)
13085 GET_CURRENT_CONTEXT(ctx);
13086 FLUSH_VERTICES(ctx, 0, 0); /* must be called before assert */
13087 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
13088 return _mesa_get_list(ctx, list, NULL, false);
13093 * Delete a sequence of consecutive display lists.
13096 _mesa_DeleteLists(GLuint list, GLsizei range)
13098 GET_CURRENT_CONTEXT(ctx);
13100 FLUSH_VERTICES(ctx, 0, 0); /* must be called before assert */
13101 ASSERT_OUTSIDE_BEGIN_END(ctx);
13104 _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteLists");
13108 _mesa_HashLockMutex(ctx->Shared->DisplayList);
13109 for (i = list; i < list + range; i++) {
13110 destroy_list(ctx, i);
13112 _mesa_HashUnlockMutex(ctx->Shared->DisplayList);
13117 * Return a display list number, n, such that lists n through n+range-1
13121 _mesa_GenLists(GLsizei range)
13123 GET_CURRENT_CONTEXT(ctx);
13125 FLUSH_VERTICES(ctx, 0, 0); /* must be called before assert */
13126 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
13129 _mesa_error(ctx, GL_INVALID_VALUE, "glGenLists");
13137 * Make this an atomic operation
13139 _mesa_HashLockMutex(ctx->Shared->DisplayList);
13141 base = _mesa_HashFindFreeKeyBlock(ctx->Shared->DisplayList, range);
13143 /* reserve the list IDs by with empty/dummy lists */
13145 for (i = 0; i < range; i++) {
13146 _mesa_HashInsertLocked(ctx->Shared->DisplayList, base + i,
13147 make_list(base + i, 1), true);
13151 _mesa_HashUnlockMutex(ctx->Shared->DisplayList);
13158 * Begin a new display list.
13161 _mesa_NewList(GLuint name, GLenum mode)
13163 GET_CURRENT_CONTEXT(ctx);
13165 FLUSH_CURRENT(ctx, 0); /* must be called before assert */
13166 ASSERT_OUTSIDE_BEGIN_END(ctx);
13168 if (MESA_VERBOSE & VERBOSE_API)
13169 _mesa_debug(ctx, "glNewList %u %s\n", name,
13170 _mesa_enum_to_string(mode));
13173 _mesa_error(ctx, GL_INVALID_VALUE, "glNewList");
13177 if (mode != GL_COMPILE && mode != GL_COMPILE_AND_EXECUTE) {
13178 _mesa_error(ctx, GL_INVALID_ENUM, "glNewList");
13182 if (ctx->ListState.CurrentList) {
13183 /* already compiling a display list */
13184 _mesa_error(ctx, GL_INVALID_OPERATION, "glNewList");
13188 ctx->CompileFlag = GL_TRUE;
13189 ctx->ExecuteFlag = (mode == GL_COMPILE_AND_EXECUTE);
13191 /* Reset accumulated list state */
13192 invalidate_saved_current_state( ctx );
13194 /* Allocate new display list */
13195 ctx->ListState.CurrentList = make_list(name, BLOCK_SIZE);
13196 ctx->ListState.CurrentBlock = ctx->ListState.CurrentList->Head;
13197 ctx->ListState.CurrentPos = 0;
13198 ctx->ListState.LastInstSize = 0;
13199 ctx->ListState.Current.UseLoopback = false;
13201 vbo_save_NewList(ctx, name, mode);
13203 ctx->CurrentServerDispatch = ctx->Save;
13204 _glapi_set_dispatch(ctx->CurrentServerDispatch);
13205 if (!ctx->GLThread.enabled) {
13206 ctx->CurrentClientDispatch = ctx->CurrentServerDispatch;
13212 * Walk all the opcode from a given list, recursively if OPCODE_CALL_LIST(S) is used,
13213 * and replace OPCODE_VERTEX_LIST[_COPY_CURRENT] occurences by OPCODE_VERTEX_LIST_LOOPBACK.
13216 replace_op_vertex_list_recursively(struct gl_context *ctx, struct gl_display_list *dlist)
13218 Node *n = get_list_head(ctx, dlist);
13220 const OpCode opcode = n[0].opcode;
13222 case OPCODE_VERTEX_LIST:
13223 case OPCODE_VERTEX_LIST_COPY_CURRENT:
13224 n[0].opcode = OPCODE_VERTEX_LIST_LOOPBACK;
13226 case OPCODE_CONTINUE:
13227 n = (Node *)get_pointer(&n[1]);
13229 case OPCODE_CALL_LIST:
13230 replace_op_vertex_list_recursively(ctx, _mesa_lookup_list(ctx, (int)n[1].ui, true));
13232 case OPCODE_CALL_LISTS: {
13242 bptr = (GLbyte *) get_pointer(&n[3]);
13243 for (unsigned i = 0; i < n[1].i; i++)
13244 replace_op_vertex_list_recursively(ctx, _mesa_lookup_list(ctx, (int)bptr[i], true));
13246 case GL_UNSIGNED_BYTE:
13247 ubptr = (GLubyte *) get_pointer(&n[3]);
13248 for (unsigned i = 0; i < n[1].i; i++)
13249 replace_op_vertex_list_recursively(ctx, _mesa_lookup_list(ctx, (int)ubptr[i], true));
13252 sptr = (GLshort *) get_pointer(&n[3]);
13253 for (unsigned i = 0; i < n[1].i; i++)
13254 replace_op_vertex_list_recursively(ctx, _mesa_lookup_list(ctx, (int)sptr[i], true));
13256 case GL_UNSIGNED_SHORT:
13257 usptr = (GLushort *) get_pointer(&n[3]);
13258 for (unsigned i = 0; i < n[1].i; i++)
13259 replace_op_vertex_list_recursively(ctx, _mesa_lookup_list(ctx, (int)usptr[i], true));
13262 iptr = (GLint *) get_pointer(&n[3]);
13263 for (unsigned i = 0; i < n[1].i; i++)
13264 replace_op_vertex_list_recursively(ctx, _mesa_lookup_list(ctx, (int)iptr[i], true));
13266 case GL_UNSIGNED_INT:
13267 uiptr = (GLuint *) get_pointer(&n[3]);
13268 for (unsigned i = 0; i < n[1].i; i++)
13269 replace_op_vertex_list_recursively(ctx, _mesa_lookup_list(ctx, (int)uiptr[i], true));
13272 fptr = (GLfloat *) get_pointer(&n[3]);
13273 for (unsigned i = 0; i < n[1].i; i++)
13274 replace_op_vertex_list_recursively(ctx, _mesa_lookup_list(ctx, (int)fptr[i], true));
13277 ubptr = (GLubyte *) get_pointer(&n[3]);
13278 for (unsigned i = 0; i < n[1].i; i++) {
13279 replace_op_vertex_list_recursively(ctx,
13280 _mesa_lookup_list(ctx, (int)ubptr[2 * i] * 256 +
13281 (int)ubptr[2 * i + 1], true));
13285 ubptr = (GLubyte *) get_pointer(&n[3]);
13286 for (unsigned i = 0; i < n[1].i; i++) {
13287 replace_op_vertex_list_recursively(ctx,
13288 _mesa_lookup_list(ctx, (int)ubptr[3 * i] * 65536 +
13289 (int)ubptr[3 * i + 1] * 256 +
13290 (int)ubptr[3 * i + 2], true));
13294 ubptr = (GLubyte *) get_pointer(&n[3]);
13295 for (unsigned i = 0; i < n[1].i; i++) {
13296 replace_op_vertex_list_recursively(ctx,
13297 _mesa_lookup_list(ctx, (int)ubptr[4 * i] * 16777216 +
13298 (int)ubptr[4 * i + 1] * 65536 +
13299 (int)ubptr[4 * i + 2] * 256 +
13300 (int)ubptr[4 * i + 3], true));
13306 case OPCODE_END_OF_LIST:
13311 n += n[0].InstSize;
13317 * End definition of current display list.
13320 _mesa_EndList(void)
13322 GET_CURRENT_CONTEXT(ctx);
13323 SAVE_FLUSH_VERTICES(ctx);
13324 FLUSH_VERTICES(ctx, 0, 0);
13326 if (MESA_VERBOSE & VERBOSE_API)
13327 _mesa_debug(ctx, "glEndList\n");
13329 if (ctx->ExecuteFlag && _mesa_inside_dlist_begin_end(ctx)) {
13330 _mesa_error(ctx, GL_INVALID_OPERATION,
13331 "glEndList() called inside glBegin/End");
13334 /* Check that a list is under construction */
13335 if (!ctx->ListState.CurrentList) {
13336 _mesa_error(ctx, GL_INVALID_OPERATION, "glEndList");
13340 /* Call before emitting END_OF_LIST, in case the driver wants to
13341 * emit opcodes itself.
13343 vbo_save_EndList(ctx);
13345 (void) alloc_instruction(ctx, OPCODE_END_OF_LIST, 0);
13347 _mesa_HashLockMutex(ctx->Shared->DisplayList);
13349 if (ctx->ListState.Current.UseLoopback)
13350 replace_op_vertex_list_recursively(ctx, ctx->ListState.CurrentList);
13352 struct gl_dlist_state *list = &ctx->ListState;
13353 list->CurrentList->execute_glthread =
13354 _mesa_glthread_should_execute_list(ctx, list->CurrentList);
13355 ctx->Shared->DisplayListsAffectGLThread |= list->CurrentList->execute_glthread;
13357 if ((list->CurrentList->Head == list->CurrentBlock) &&
13358 (list->CurrentPos < BLOCK_SIZE)) {
13359 /* This list has a low number of commands. Instead of storing them in a malloc-ed block
13360 * of memory (list->CurrentBlock), we store them in ctx->Shared->small_dlist_store.ptr.
13361 * This reduces cache misses in execute_list on successive lists since their commands
13362 * are now stored in the same array instead of being scattered in memory.
13364 list->CurrentList->small_list = true;
13367 if (ctx->Shared->small_dlist_store.size == 0) {
13368 util_idalloc_init(&ctx->Shared->small_dlist_store.free_idx, MAX2(1, list->CurrentPos));
13371 start = util_idalloc_alloc_range(&ctx->Shared->small_dlist_store.free_idx, list->CurrentPos);
13373 if ((start + list->CurrentPos) > ctx->Shared->small_dlist_store.size) {
13374 ctx->Shared->small_dlist_store.size =
13375 ctx->Shared->small_dlist_store.free_idx.num_elements * 32;
13376 ctx->Shared->small_dlist_store.ptr = realloc(
13377 ctx->Shared->small_dlist_store.ptr,
13378 ctx->Shared->small_dlist_store.size * sizeof(Node));
13380 list->CurrentList->start = start;
13381 list->CurrentList->count = list->CurrentPos;
13383 memcpy(&ctx->Shared->small_dlist_store.ptr[start],
13384 list->CurrentBlock,
13385 list->CurrentList->count * sizeof(Node));
13387 assert (ctx->Shared->small_dlist_store.ptr[start + list->CurrentList->count - 1].opcode == OPCODE_END_OF_LIST);
13389 free(list->CurrentBlock);
13391 /* Keep the mallocated storage */
13392 list->CurrentList->small_list = false;
13395 /* Destroy old list, if any */
13396 destroy_list(ctx, ctx->ListState.CurrentList->Name);
13398 /* Install the new list */
13399 _mesa_HashInsertLocked(ctx->Shared->DisplayList,
13400 ctx->ListState.CurrentList->Name,
13401 ctx->ListState.CurrentList, true);
13403 if (MESA_VERBOSE & VERBOSE_DISPLAY_LIST)
13404 mesa_print_display_list(ctx->ListState.CurrentList->Name);
13406 _mesa_HashUnlockMutex(ctx->Shared->DisplayList);
13408 ctx->ListState.CurrentList = NULL;
13409 ctx->ListState.CurrentBlock = NULL;
13410 ctx->ListState.CurrentPos = 0;
13411 ctx->ListState.LastInstSize = 0;
13412 ctx->ExecuteFlag = GL_TRUE;
13413 ctx->CompileFlag = GL_FALSE;
13415 ctx->CurrentServerDispatch = ctx->Exec;
13416 _glapi_set_dispatch(ctx->CurrentServerDispatch);
13417 if (!ctx->GLThread.enabled) {
13418 ctx->CurrentClientDispatch = ctx->CurrentServerDispatch;
13424 _mesa_CallList(GLuint list)
13426 GLboolean save_compile_flag;
13427 GET_CURRENT_CONTEXT(ctx);
13428 FLUSH_CURRENT(ctx, 0);
13430 if (MESA_VERBOSE & VERBOSE_API)
13431 _mesa_debug(ctx, "glCallList %d\n", list);
13434 _mesa_error(ctx, GL_INVALID_VALUE, "glCallList(list==0)");
13439 mesa_print_display_list( list );
13441 /* Save the CompileFlag status, turn it off, execute the display list,
13442 * and restore the CompileFlag. This is needed for GL_COMPILE_AND_EXECUTE
13443 * because the call is already recorded and we just need to execute it.
13445 save_compile_flag = ctx->CompileFlag;
13446 if (save_compile_flag) {
13447 ctx->CompileFlag = GL_FALSE;
13450 _mesa_HashLockMutex(ctx->Shared->DisplayList);
13451 execute_list(ctx, list);
13452 _mesa_HashUnlockMutex(ctx->Shared->DisplayList);
13453 ctx->CompileFlag = save_compile_flag;
13455 /* also restore API function pointers to point to "save" versions */
13456 if (save_compile_flag) {
13457 ctx->CurrentServerDispatch = ctx->Save;
13458 if (!ctx->GLThread.enabled) {
13459 ctx->CurrentClientDispatch = ctx->CurrentServerDispatch;
13466 * Execute glCallLists: call multiple display lists.
13469 _mesa_CallLists(GLsizei n, GLenum type, const GLvoid * lists)
13471 GET_CURRENT_CONTEXT(ctx);
13472 GLboolean save_compile_flag;
13474 if (MESA_VERBOSE & VERBOSE_API)
13475 _mesa_debug(ctx, "glCallLists %d\n", n);
13477 if (type < GL_BYTE || type > GL_4_BYTES) {
13478 _mesa_error(ctx, GL_INVALID_ENUM, "glCallLists(type)");
13483 _mesa_error(ctx, GL_INVALID_VALUE, "glCallLists(n < 0)");
13485 } else if (n == 0 || lists == NULL) {
13486 /* nothing to do */
13490 /* Save the CompileFlag status, turn it off, execute the display lists,
13491 * and restore the CompileFlag. This is needed for GL_COMPILE_AND_EXECUTE
13492 * because the call is already recorded and we just need to execute it.
13494 save_compile_flag = ctx->CompileFlag;
13495 ctx->CompileFlag = GL_FALSE;
13505 GLuint base = ctx->List.ListBase;
13507 _mesa_HashLockMutex(ctx->Shared->DisplayList);
13509 /* A loop inside a switch is faster than a switch inside a loop. */
13512 bptr = (GLbyte *) lists;
13513 for (unsigned i = 0; i < n; i++)
13514 execute_list(ctx, base + (int)bptr[i]);
13516 case GL_UNSIGNED_BYTE:
13517 ubptr = (GLubyte *) lists;
13518 for (unsigned i = 0; i < n; i++)
13519 execute_list(ctx, base + (int)ubptr[i]);
13522 sptr = (GLshort *) lists;
13523 for (unsigned i = 0; i < n; i++)
13524 execute_list(ctx, base + (int)sptr[i]);
13526 case GL_UNSIGNED_SHORT:
13527 usptr = (GLushort *) lists;
13528 for (unsigned i = 0; i < n; i++)
13529 execute_list(ctx, base + (int)usptr[i]);
13532 iptr = (GLint *) lists;
13533 for (unsigned i = 0; i < n; i++)
13534 execute_list(ctx, base + (int)iptr[i]);
13536 case GL_UNSIGNED_INT:
13537 uiptr = (GLuint *) lists;
13538 for (unsigned i = 0; i < n; i++)
13539 execute_list(ctx, base + (int)uiptr[i]);
13542 fptr = (GLfloat *) lists;
13543 for (unsigned i = 0; i < n; i++)
13544 execute_list(ctx, base + (int)fptr[i]);
13547 ubptr = (GLubyte *) lists;
13548 for (unsigned i = 0; i < n; i++) {
13549 execute_list(ctx, base +
13550 (int)ubptr[2 * i] * 256 +
13551 (int)ubptr[2 * i + 1]);
13555 ubptr = (GLubyte *) lists;
13556 for (unsigned i = 0; i < n; i++) {
13557 execute_list(ctx, base +
13558 (int)ubptr[3 * i] * 65536 +
13559 (int)ubptr[3 * i + 1] * 256 +
13560 (int)ubptr[3 * i + 2]);
13564 ubptr = (GLubyte *) lists;
13565 for (unsigned i = 0; i < n; i++) {
13566 execute_list(ctx, base +
13567 (int)ubptr[4 * i] * 16777216 +
13568 (int)ubptr[4 * i + 1] * 65536 +
13569 (int)ubptr[4 * i + 2] * 256 +
13570 (int)ubptr[4 * i + 3]);
13575 _mesa_HashUnlockMutex(ctx->Shared->DisplayList);
13576 ctx->CompileFlag = save_compile_flag;
13578 /* also restore API function pointers to point to "save" versions */
13579 if (save_compile_flag) {
13580 ctx->CurrentServerDispatch = ctx->Save;
13581 if (!ctx->GLThread.enabled) {
13582 ctx->CurrentClientDispatch = ctx->CurrentServerDispatch;
13589 * Set the offset added to list numbers in glCallLists.
13592 _mesa_ListBase(GLuint base)
13594 GET_CURRENT_CONTEXT(ctx);
13595 FLUSH_VERTICES(ctx, 0, GL_LIST_BIT); /* must be called before assert */
13596 ASSERT_OUTSIDE_BEGIN_END(ctx);
13597 ctx->List.ListBase = base;
13601 * Setup the given dispatch table to point to Mesa's display list
13602 * building functions.
13604 * This does not include any of the tnl functions - they are
13605 * initialized from _mesa_init_api_defaults and from the active vtxfmt
13609 _mesa_initialize_save_table(const struct gl_context *ctx)
13611 struct _glapi_table *table = ctx->Save;
13612 int numEntries = MAX2(_gloffset_COUNT, _glapi_get_dispatch_table_size());
13614 /* Initially populate the dispatch table with the contents of the
13615 * normal-execution dispatch table. This lets us skip populating functions
13616 * that should be called directly instead of compiled into display lists.
13618 memcpy(table, ctx->OutsideBeginEnd, numEntries * sizeof(_glapi_proc));
13620 #include "api_save_init.h"
13625 static const char *
13626 enum_string(GLenum k)
13628 return _mesa_enum_to_string(k);
13633 * Print the commands in a display list. For debugging only.
13634 * TODO: many commands aren't handled yet.
13635 * \param fname filename to write display list to. If null, use stdout.
13638 print_list(struct gl_context *ctx, GLuint list, const char *fname)
13640 struct gl_display_list *dlist;
13645 f = fopen(fname, "w");
13650 if (!_mesa_get_list(ctx, list, &dlist, true)) {
13651 fprintf(f, "%u is not a display list ID\n", list);
13658 n = get_list_head(ctx, dlist);
13660 fprintf(f, "START-LIST %u, address %p\n", list, (void *) n);
13663 const OpCode opcode = n[0].opcode;
13667 fprintf(f, "Accum %s %g\n", enum_string(n[1].e), n[2].f);
13669 case OPCODE_ACTIVE_TEXTURE:
13670 fprintf(f, "ActiveTexture(%s)\n", enum_string(n[1].e));
13672 case OPCODE_BITMAP:
13673 fprintf(f, "Bitmap %d %d %g %g %g %g %p\n", n[1].i, n[2].i,
13674 n[3].f, n[4].f, n[5].f, n[6].f,
13675 get_pointer(&n[7]));
13677 case OPCODE_BLEND_COLOR:
13678 fprintf(f, "BlendColor %f, %f, %f, %f\n",
13679 n[1].f, n[2].f, n[3].f, n[4].f);
13681 case OPCODE_BLEND_EQUATION:
13682 fprintf(f, "BlendEquation %s\n",
13683 enum_string(n[1].e));
13685 case OPCODE_BLEND_EQUATION_SEPARATE:
13686 fprintf(f, "BlendEquationSeparate %s, %s\n",
13687 enum_string(n[1].e),
13688 enum_string(n[2].e));
13690 case OPCODE_BLEND_FUNC_SEPARATE:
13691 fprintf(f, "BlendFuncSeparate %s, %s, %s, %s\n",
13692 enum_string(n[1].e),
13693 enum_string(n[2].e),
13694 enum_string(n[3].e),
13695 enum_string(n[4].e));
13697 case OPCODE_BLEND_EQUATION_I:
13698 fprintf(f, "BlendEquationi %u, %s\n",
13699 n[1].ui, enum_string(n[2].e));
13701 case OPCODE_BLEND_EQUATION_SEPARATE_I:
13702 fprintf(f, "BlendEquationSeparatei %u, %s, %s\n",
13703 n[1].ui, enum_string(n[2].e), enum_string(n[3].e));
13705 case OPCODE_BLEND_FUNC_I:
13706 fprintf(f, "BlendFunci %u, %s, %s\n",
13707 n[1].ui, enum_string(n[2].e), enum_string(n[3].e));
13709 case OPCODE_BLEND_FUNC_SEPARATE_I:
13710 fprintf(f, "BlendFuncSeparatei %u, %s, %s, %s, %s\n",
13712 enum_string(n[2].e),
13713 enum_string(n[3].e),
13714 enum_string(n[4].e),
13715 enum_string(n[5].e));
13717 case OPCODE_CALL_LIST:
13718 fprintf(f, "CallList %d\n", (int) n[1].ui);
13720 case OPCODE_CALL_LISTS:
13721 fprintf(f, "CallLists %d, %s\n", n[1].i, enum_string(n[1].e));
13723 case OPCODE_DISABLE:
13724 fprintf(f, "Disable %s\n", enum_string(n[1].e));
13726 case OPCODE_ENABLE:
13727 fprintf(f, "Enable %s\n", enum_string(n[1].e));
13729 case OPCODE_FRUSTUM:
13730 fprintf(f, "Frustum %g %g %g %g %g %g\n",
13731 n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f);
13733 case OPCODE_LINE_STIPPLE:
13734 fprintf(f, "LineStipple %d %x\n", n[1].i, (int) n[2].us);
13736 case OPCODE_LINE_WIDTH:
13737 fprintf(f, "LineWidth %f\n", n[1].f);
13739 case OPCODE_LOAD_IDENTITY:
13740 fprintf(f, "LoadIdentity\n");
13742 case OPCODE_LOAD_MATRIX:
13743 fprintf(f, "LoadMatrix\n");
13744 fprintf(f, " %8f %8f %8f %8f\n",
13745 n[1].f, n[5].f, n[9].f, n[13].f);
13746 fprintf(f, " %8f %8f %8f %8f\n",
13747 n[2].f, n[6].f, n[10].f, n[14].f);
13748 fprintf(f, " %8f %8f %8f %8f\n",
13749 n[3].f, n[7].f, n[11].f, n[15].f);
13750 fprintf(f, " %8f %8f %8f %8f\n",
13751 n[4].f, n[8].f, n[12].f, n[16].f);
13753 case OPCODE_MULT_MATRIX:
13754 fprintf(f, "MultMatrix (or Rotate)\n");
13755 fprintf(f, " %8f %8f %8f %8f\n",
13756 n[1].f, n[5].f, n[9].f, n[13].f);
13757 fprintf(f, " %8f %8f %8f %8f\n",
13758 n[2].f, n[6].f, n[10].f, n[14].f);
13759 fprintf(f, " %8f %8f %8f %8f\n",
13760 n[3].f, n[7].f, n[11].f, n[15].f);
13761 fprintf(f, " %8f %8f %8f %8f\n",
13762 n[4].f, n[8].f, n[12].f, n[16].f);
13765 fprintf(f, "Ortho %g %g %g %g %g %g\n",
13766 n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f);
13768 case OPCODE_POINT_SIZE:
13769 fprintf(f, "PointSize %f\n", n[1].f);
13771 case OPCODE_POP_ATTRIB:
13772 fprintf(f, "PopAttrib\n");
13774 case OPCODE_POP_MATRIX:
13775 fprintf(f, "PopMatrix\n");
13777 case OPCODE_POP_NAME:
13778 fprintf(f, "PopName\n");
13780 case OPCODE_PUSH_ATTRIB:
13781 fprintf(f, "PushAttrib %x\n", n[1].bf);
13783 case OPCODE_PUSH_MATRIX:
13784 fprintf(f, "PushMatrix\n");
13786 case OPCODE_PUSH_NAME:
13787 fprintf(f, "PushName %d\n", (int) n[1].ui);
13789 case OPCODE_RASTER_POS:
13790 fprintf(f, "RasterPos %g %g %g %g\n",
13791 n[1].f, n[2].f, n[3].f, n[4].f);
13793 case OPCODE_ROTATE:
13794 fprintf(f, "Rotate %g %g %g %g\n",
13795 n[1].f, n[2].f, n[3].f, n[4].f);
13798 fprintf(f, "Scale %g %g %g\n", n[1].f, n[2].f, n[3].f);
13800 case OPCODE_TRANSLATE:
13801 fprintf(f, "Translate %g %g %g\n", n[1].f, n[2].f, n[3].f);
13803 case OPCODE_BIND_TEXTURE:
13804 fprintf(f, "BindTexture %s %d\n",
13805 _mesa_enum_to_string(n[1].ui), n[2].ui);
13807 case OPCODE_SHADE_MODEL:
13808 fprintf(f, "ShadeModel %s\n", _mesa_enum_to_string(n[1].ui));
13811 fprintf(f, "Map1 %s %.3f %.3f %d %d\n",
13812 _mesa_enum_to_string(n[1].ui),
13813 n[2].f, n[3].f, n[4].i, n[5].i);
13816 fprintf(f, "Map2 %s %.3f %.3f %.3f %.3f %d %d %d %d\n",
13817 _mesa_enum_to_string(n[1].ui),
13818 n[2].f, n[3].f, n[4].f, n[5].f,
13819 n[6].i, n[7].i, n[8].i, n[9].i);
13821 case OPCODE_MAPGRID1:
13822 fprintf(f, "MapGrid1 %d %.3f %.3f\n", n[1].i, n[2].f, n[3].f);
13824 case OPCODE_MAPGRID2:
13825 fprintf(f, "MapGrid2 %d %.3f %.3f, %d %.3f %.3f\n",
13826 n[1].i, n[2].f, n[3].f, n[4].i, n[5].f, n[6].f);
13828 case OPCODE_EVALMESH1:
13829 fprintf(f, "EvalMesh1 %d %d\n", n[1].i, n[2].i);
13831 case OPCODE_EVALMESH2:
13832 fprintf(f, "EvalMesh2 %d %d %d %d\n",
13833 n[1].i, n[2].i, n[3].i, n[4].i);
13836 case OPCODE_ATTR_1F_NV:
13837 fprintf(f, "ATTR_1F_NV attr %d: %f\n", n[1].i, n[2].f);
13839 case OPCODE_ATTR_2F_NV:
13840 fprintf(f, "ATTR_2F_NV attr %d: %f %f\n",
13841 n[1].i, n[2].f, n[3].f);
13843 case OPCODE_ATTR_3F_NV:
13844 fprintf(f, "ATTR_3F_NV attr %d: %f %f %f\n",
13845 n[1].i, n[2].f, n[3].f, n[4].f);
13847 case OPCODE_ATTR_4F_NV:
13848 fprintf(f, "ATTR_4F_NV attr %d: %f %f %f %f\n",
13849 n[1].i, n[2].f, n[3].f, n[4].f, n[5].f);
13851 case OPCODE_ATTR_1F_ARB:
13852 fprintf(f, "ATTR_1F_ARB attr %d: %f\n", n[1].i, n[2].f);
13854 case OPCODE_ATTR_2F_ARB:
13855 fprintf(f, "ATTR_2F_ARB attr %d: %f %f\n",
13856 n[1].i, n[2].f, n[3].f);
13858 case OPCODE_ATTR_3F_ARB:
13859 fprintf(f, "ATTR_3F_ARB attr %d: %f %f %f\n",
13860 n[1].i, n[2].f, n[3].f, n[4].f);
13862 case OPCODE_ATTR_4F_ARB:
13863 fprintf(f, "ATTR_4F_ARB attr %d: %f %f %f %f\n",
13864 n[1].i, n[2].f, n[3].f, n[4].f, n[5].f);
13867 case OPCODE_MATERIAL:
13868 fprintf(f, "MATERIAL %x %x: %f %f %f %f\n",
13869 n[1].i, n[2].i, n[3].f, n[4].f, n[5].f, n[6].f);
13872 fprintf(f, "BEGIN %x\n", n[1].i);
13875 fprintf(f, "END\n");
13877 case OPCODE_EVAL_C1:
13878 fprintf(f, "EVAL_C1 %f\n", n[1].f);
13880 case OPCODE_EVAL_C2:
13881 fprintf(f, "EVAL_C2 %f %f\n", n[1].f, n[2].f);
13883 case OPCODE_EVAL_P1:
13884 fprintf(f, "EVAL_P1 %d\n", n[1].i);
13886 case OPCODE_EVAL_P2:
13887 fprintf(f, "EVAL_P2 %d %d\n", n[1].i, n[2].i);
13890 case OPCODE_PROVOKING_VERTEX:
13891 fprintf(f, "ProvokingVertex %s\n",
13892 _mesa_enum_to_string(n[1].ui));
13896 * meta opcodes/commands
13899 fprintf(f, "Error: %s %s\n", enum_string(n[1].e),
13900 (const char *) get_pointer(&n[2]));
13902 case OPCODE_CONTINUE:
13903 fprintf(f, "DISPLAY-LIST-CONTINUE\n");
13904 n = (Node *) get_pointer(&n[1]);
13906 case OPCODE_VERTEX_LIST:
13907 case OPCODE_VERTEX_LIST_LOOPBACK:
13908 case OPCODE_VERTEX_LIST_COPY_CURRENT:
13909 vbo_print_vertex_list(ctx, (struct vbo_save_vertex_list *) &n[0], opcode, f);
13912 if (opcode < 0 || opcode > OPCODE_END_OF_LIST) {
13914 ("ERROR IN DISPLAY LIST: opcode = %d, address = %p\n",
13915 opcode, (void *) n);
13917 fprintf(f, "command %d, %u operands\n", opcode,
13922 case OPCODE_END_OF_LIST:
13923 fprintf(f, "END-LIST %u\n", list);
13930 /* increment n to point to next compiled command */
13931 assert(n[0].InstSize > 0);
13932 n += n[0].InstSize;
13938 _mesa_glthread_execute_list(struct gl_context *ctx, GLuint list)
13940 struct gl_display_list *dlist;
13943 !_mesa_get_list(ctx, list, &dlist, true) ||
13944 !dlist->execute_glthread)
13947 Node *n = get_list_head(ctx, dlist);
13950 const OpCode opcode = n[0].opcode;
13953 case OPCODE_CALL_LIST:
13954 /* Generated by glCallList(), don't add ListBase */
13955 if (ctx->GLThread.ListCallDepth < MAX_LIST_NESTING) {
13956 ctx->GLThread.ListCallDepth++;
13957 _mesa_glthread_execute_list(ctx, n[1].ui);
13958 ctx->GLThread.ListCallDepth--;
13961 case OPCODE_CALL_LISTS:
13962 if (ctx->GLThread.ListCallDepth < MAX_LIST_NESTING) {
13963 ctx->GLThread.ListCallDepth++;
13964 _mesa_glthread_CallLists(ctx, n[1].i, n[2].e, get_pointer(&n[3]));
13965 ctx->GLThread.ListCallDepth--;
13968 case OPCODE_DISABLE:
13969 _mesa_glthread_Disable(ctx, n[1].e);
13971 case OPCODE_ENABLE:
13972 _mesa_glthread_Enable(ctx, n[1].e);
13974 case OPCODE_LIST_BASE:
13975 _mesa_glthread_ListBase(ctx, n[1].ui);
13977 case OPCODE_MATRIX_MODE:
13978 _mesa_glthread_MatrixMode(ctx, n[1].e);
13980 case OPCODE_POP_ATTRIB:
13981 _mesa_glthread_PopAttrib(ctx);
13983 case OPCODE_POP_MATRIX:
13984 _mesa_glthread_PopMatrix(ctx);
13986 case OPCODE_PUSH_ATTRIB:
13987 _mesa_glthread_PushAttrib(ctx, n[1].bf);
13989 case OPCODE_PUSH_MATRIX:
13990 _mesa_glthread_PushMatrix(ctx);
13992 case OPCODE_ACTIVE_TEXTURE: /* GL_ARB_multitexture */
13993 _mesa_glthread_ActiveTexture(ctx, n[1].e);
13995 case OPCODE_MATRIX_PUSH:
13996 _mesa_glthread_MatrixPushEXT(ctx, n[1].e);
13998 case OPCODE_MATRIX_POP:
13999 _mesa_glthread_MatrixPopEXT(ctx, n[1].e);
14001 case OPCODE_CONTINUE:
14002 n = (Node *)get_pointer(&n[1]);
14004 case OPCODE_END_OF_LIST:
14005 ctx->GLThread.ListCallDepth--;
14012 /* increment n to point to next compiled command */
14013 assert(n[0].InstSize > 0);
14014 n += n[0].InstSize;
14019 _mesa_glthread_should_execute_list(struct gl_context *ctx,
14020 struct gl_display_list *dlist)
14022 Node *n = get_list_head(ctx, dlist);
14025 const OpCode opcode = n[0].opcode;
14028 case OPCODE_CALL_LIST:
14029 case OPCODE_CALL_LISTS:
14030 case OPCODE_DISABLE:
14031 case OPCODE_ENABLE:
14032 case OPCODE_LIST_BASE:
14033 case OPCODE_MATRIX_MODE:
14034 case OPCODE_POP_ATTRIB:
14035 case OPCODE_POP_MATRIX:
14036 case OPCODE_PUSH_ATTRIB:
14037 case OPCODE_PUSH_MATRIX:
14038 case OPCODE_ACTIVE_TEXTURE: /* GL_ARB_multitexture */
14039 case OPCODE_MATRIX_PUSH:
14040 case OPCODE_MATRIX_POP:
14042 case OPCODE_CONTINUE:
14043 n = (Node *)get_pointer(&n[1]);
14045 case OPCODE_END_OF_LIST:
14052 /* increment n to point to next compiled command */
14053 assert(n[0].InstSize > 0);
14054 n += n[0].InstSize;
14061 * Clients may call this function to help debug display list problems.
14062 * This function is _ONLY_FOR_DEBUGGING_PURPOSES_. It may be removed,
14063 * changed, or break in the future without notice.
14066 mesa_print_display_list(GLuint list)
14068 GET_CURRENT_CONTEXT(ctx);
14069 print_list(ctx, list, NULL);
14073 /**********************************************************************/
14074 /***** Initialization *****/
14075 /**********************************************************************/
14078 * Initialize display list state for given context.
14081 _mesa_init_display_list(struct gl_context *ctx)
14084 ctx->ListState.CallDepth = 1;
14085 ctx->ExecuteFlag = GL_TRUE;
14086 ctx->CompileFlag = GL_FALSE;
14087 ctx->ListState.CurrentBlock = NULL;
14088 ctx->ListState.CurrentPos = 0;
14089 ctx->ListState.LastInstSize = 0;
14091 /* Display List group */
14092 ctx->List.ListBase = 0;
14097 _mesa_install_save_vtxfmt(struct gl_context *ctx)
14099 struct _glapi_table *tab = ctx->Save;
14100 assert(ctx->API == API_OPENGL_COMPAT);
14102 #define NAME_AE(x) _mesa_##x
14103 #define NAME_CALLLIST(x) save_##x
14104 #define NAME(x) save_##x
14105 #define NAME_ES(x) save_##x
14107 #include "api_vtxfmt_init.h"