Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1901 | serge | 1 | /* |
2 | * Mesa 3-D graphics library |
||
3 | * Version: 7.7 |
||
4 | * |
||
5 | * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. |
||
6 | * Copyright (C) 2009 VMware, Inc. All Rights Reserved. |
||
7 | * |
||
8 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
9 | * copy of this software and associated documentation files (the "Software"), |
||
10 | * to deal in the Software without restriction, including without limitation |
||
11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
12 | * and/or sell copies of the Software, and to permit persons to whom the |
||
13 | * Software is furnished to do so, subject to the following conditions: |
||
14 | * |
||
15 | * The above copyright notice and this permission notice shall be included |
||
16 | * in all copies or substantial portions of the Software. |
||
17 | * |
||
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
19 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
21 | * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN |
||
22 | * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
||
23 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||
24 | */ |
||
25 | |||
26 | |||
27 | /** |
||
28 | * \file dlist.c |
||
29 | * Display lists management functions. |
||
30 | */ |
||
31 | |||
32 | #include "glheader.h" |
||
33 | #include "imports.h" |
||
34 | #include "api_arrayelt.h" |
||
35 | #include "api_exec.h" |
||
36 | #include "api_loopback.h" |
||
37 | #if FEATURE_ATI_fragment_shader |
||
38 | #include "atifragshader.h" |
||
39 | #endif |
||
40 | #include "config.h" |
||
41 | #include "mfeatures.h" |
||
42 | #if FEATURE_ARB_vertex_buffer_object |
||
43 | #include "bufferobj.h" |
||
44 | #endif |
||
45 | #include "arrayobj.h" |
||
46 | #include "context.h" |
||
47 | #include "dlist.h" |
||
48 | #include "enums.h" |
||
49 | #include "eval.h" |
||
50 | #include "framebuffer.h" |
||
51 | #include "glapi/glapi.h" |
||
52 | #include "hash.h" |
||
53 | #include "image.h" |
||
54 | #include "light.h" |
||
55 | #include "macros.h" |
||
56 | #include "pack.h" |
||
57 | #include "queryobj.h" |
||
58 | #include "teximage.h" |
||
59 | #include "mtypes.h" |
||
60 | #include "varray.h" |
||
61 | #if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program |
||
62 | #include "arbprogram.h" |
||
63 | #endif |
||
64 | #if FEATURE_NV_vertex_program || FEATURE_NV_fragment_program |
||
65 | #include "nvprogram.h" |
||
66 | #endif |
||
67 | |||
68 | #include "math/m_matrix.h" |
||
69 | |||
70 | #include "main/dispatch.h" |
||
71 | |||
72 | |||
73 | |||
74 | /** |
||
75 | * Other parts of Mesa (such as the VBO module) can plug into the display |
||
76 | * list system. This structure describes new display list instructions. |
||
77 | */ |
||
78 | struct gl_list_instruction |
||
79 | { |
||
80 | GLuint Size; |
||
81 | void (*Execute)( struct gl_context *ctx, void *data ); |
||
82 | void (*Destroy)( struct gl_context *ctx, void *data ); |
||
83 | void (*Print)( struct gl_context *ctx, void *data ); |
||
84 | }; |
||
85 | |||
86 | |||
87 | #define MAX_DLIST_EXT_OPCODES 16 |
||
88 | |||
89 | /** |
||
90 | * Used by device drivers to hook new commands into display lists. |
||
91 | */ |
||
92 | struct gl_list_extensions |
||
93 | { |
||
94 | struct gl_list_instruction Opcode[MAX_DLIST_EXT_OPCODES]; |
||
95 | GLuint NumOpcodes; |
||
96 | }; |
||
97 | |||
98 | |||
99 | |||
100 | /** |
||
101 | * Flush vertices. |
||
102 | * |
||
103 | * \param ctx GL context. |
||
104 | * |
||
105 | * Checks if dd_function_table::SaveNeedFlush is marked to flush |
||
106 | * stored (save) vertices, and calls |
||
107 | * dd_function_table::SaveFlushVertices if so. |
||
108 | */ |
||
109 | #define SAVE_FLUSH_VERTICES(ctx) \ |
||
110 | do { \ |
||
111 | if (ctx->Driver.SaveNeedFlush) \ |
||
112 | ctx->Driver.SaveFlushVertices(ctx); \ |
||
113 | } while (0) |
||
114 | |||
115 | |||
116 | /** |
||
117 | * Macro to assert that the API call was made outside the |
||
118 | * glBegin()/glEnd() pair, with return value. |
||
119 | * |
||
120 | * \param ctx GL context. |
||
121 | * \param retval value to return value in case the assertion fails. |
||
122 | */ |
||
123 | #define ASSERT_OUTSIDE_SAVE_BEGIN_END_WITH_RETVAL(ctx, retval) \ |
||
124 | do { \ |
||
125 | if (ctx->Driver.CurrentSavePrimitive <= GL_POLYGON || \ |
||
126 | ctx->Driver.CurrentSavePrimitive == PRIM_INSIDE_UNKNOWN_PRIM) { \ |
||
127 | _mesa_compile_error( ctx, GL_INVALID_OPERATION, "begin/end" ); \ |
||
128 | return retval; \ |
||
129 | } \ |
||
130 | } while (0) |
||
131 | |||
132 | /** |
||
133 | * Macro to assert that the API call was made outside the |
||
134 | * glBegin()/glEnd() pair. |
||
135 | * |
||
136 | * \param ctx GL context. |
||
137 | */ |
||
138 | #define ASSERT_OUTSIDE_SAVE_BEGIN_END(ctx) \ |
||
139 | do { \ |
||
140 | if (ctx->Driver.CurrentSavePrimitive <= GL_POLYGON || \ |
||
141 | ctx->Driver.CurrentSavePrimitive == PRIM_INSIDE_UNKNOWN_PRIM) { \ |
||
142 | _mesa_compile_error( ctx, GL_INVALID_OPERATION, "begin/end" ); \ |
||
143 | return; \ |
||
144 | } \ |
||
145 | } while (0) |
||
146 | |||
147 | /** |
||
148 | * Macro to assert that the API call was made outside the |
||
149 | * glBegin()/glEnd() pair and flush the vertices. |
||
150 | * |
||
151 | * \param ctx GL context. |
||
152 | */ |
||
153 | #define ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx) \ |
||
154 | do { \ |
||
155 | ASSERT_OUTSIDE_SAVE_BEGIN_END(ctx); \ |
||
156 | SAVE_FLUSH_VERTICES(ctx); \ |
||
157 | } while (0) |
||
158 | |||
159 | /** |
||
160 | * Macro to assert that the API call was made outside the |
||
161 | * glBegin()/glEnd() pair and flush the vertices, with return value. |
||
162 | * |
||
163 | * \param ctx GL context. |
||
164 | * \param retval value to return value in case the assertion fails. |
||
165 | */ |
||
166 | #define ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH_WITH_RETVAL(ctx, retval)\ |
||
167 | do { \ |
||
168 | ASSERT_OUTSIDE_SAVE_BEGIN_END_WITH_RETVAL(ctx, retval); \ |
||
169 | SAVE_FLUSH_VERTICES(ctx); \ |
||
170 | } while (0) |
||
171 | |||
172 | |||
173 | |||
174 | /** |
||
175 | * Display list opcodes. |
||
176 | * |
||
177 | * The fact that these identifiers are assigned consecutive |
||
178 | * integer values starting at 0 is very important, see InstSize array usage) |
||
179 | */ |
||
180 | typedef enum |
||
181 | { |
||
182 | OPCODE_INVALID = -1, /* Force signed enum */ |
||
183 | OPCODE_ACCUM, |
||
184 | OPCODE_ALPHA_FUNC, |
||
185 | OPCODE_BIND_TEXTURE, |
||
186 | OPCODE_BITMAP, |
||
187 | OPCODE_BLEND_COLOR, |
||
188 | OPCODE_BLEND_EQUATION, |
||
189 | OPCODE_BLEND_EQUATION_SEPARATE, |
||
190 | OPCODE_BLEND_FUNC_SEPARATE, |
||
191 | OPCODE_CALL_LIST, |
||
192 | OPCODE_CALL_LIST_OFFSET, |
||
193 | OPCODE_CLEAR, |
||
194 | OPCODE_CLEAR_ACCUM, |
||
195 | OPCODE_CLEAR_COLOR, |
||
196 | OPCODE_CLEAR_DEPTH, |
||
197 | OPCODE_CLEAR_INDEX, |
||
198 | OPCODE_CLEAR_STENCIL, |
||
199 | OPCODE_CLEAR_BUFFER_IV, |
||
200 | OPCODE_CLEAR_BUFFER_UIV, |
||
201 | OPCODE_CLEAR_BUFFER_FV, |
||
202 | OPCODE_CLEAR_BUFFER_FI, |
||
203 | OPCODE_CLIP_PLANE, |
||
204 | OPCODE_COLOR_MASK, |
||
205 | OPCODE_COLOR_MASK_INDEXED, |
||
206 | OPCODE_COLOR_MATERIAL, |
||
207 | OPCODE_COLOR_TABLE, |
||
208 | OPCODE_COLOR_TABLE_PARAMETER_FV, |
||
209 | OPCODE_COLOR_TABLE_PARAMETER_IV, |
||
210 | OPCODE_COLOR_SUB_TABLE, |
||
211 | OPCODE_CONVOLUTION_FILTER_1D, |
||
212 | OPCODE_CONVOLUTION_FILTER_2D, |
||
213 | OPCODE_CONVOLUTION_PARAMETER_I, |
||
214 | OPCODE_CONVOLUTION_PARAMETER_IV, |
||
215 | OPCODE_CONVOLUTION_PARAMETER_F, |
||
216 | OPCODE_CONVOLUTION_PARAMETER_FV, |
||
217 | OPCODE_COPY_COLOR_SUB_TABLE, |
||
218 | OPCODE_COPY_COLOR_TABLE, |
||
219 | OPCODE_COPY_PIXELS, |
||
220 | OPCODE_COPY_TEX_IMAGE1D, |
||
221 | OPCODE_COPY_TEX_IMAGE2D, |
||
222 | OPCODE_COPY_TEX_SUB_IMAGE1D, |
||
223 | OPCODE_COPY_TEX_SUB_IMAGE2D, |
||
224 | OPCODE_COPY_TEX_SUB_IMAGE3D, |
||
225 | OPCODE_CULL_FACE, |
||
226 | OPCODE_DEPTH_FUNC, |
||
227 | OPCODE_DEPTH_MASK, |
||
228 | OPCODE_DEPTH_RANGE, |
||
229 | OPCODE_DISABLE, |
||
230 | OPCODE_DISABLE_INDEXED, |
||
231 | OPCODE_DRAW_BUFFER, |
||
232 | OPCODE_DRAW_PIXELS, |
||
233 | OPCODE_ENABLE, |
||
234 | OPCODE_ENABLE_INDEXED, |
||
235 | OPCODE_EVALMESH1, |
||
236 | OPCODE_EVALMESH2, |
||
237 | OPCODE_FOG, |
||
238 | OPCODE_FRONT_FACE, |
||
239 | OPCODE_FRUSTUM, |
||
240 | OPCODE_HINT, |
||
241 | OPCODE_HISTOGRAM, |
||
242 | OPCODE_INDEX_MASK, |
||
243 | OPCODE_INIT_NAMES, |
||
244 | OPCODE_LIGHT, |
||
245 | OPCODE_LIGHT_MODEL, |
||
246 | OPCODE_LINE_STIPPLE, |
||
247 | OPCODE_LINE_WIDTH, |
||
248 | OPCODE_LIST_BASE, |
||
249 | OPCODE_LOAD_IDENTITY, |
||
250 | OPCODE_LOAD_MATRIX, |
||
251 | OPCODE_LOAD_NAME, |
||
252 | OPCODE_LOGIC_OP, |
||
253 | OPCODE_MAP1, |
||
254 | OPCODE_MAP2, |
||
255 | OPCODE_MAPGRID1, |
||
256 | OPCODE_MAPGRID2, |
||
257 | OPCODE_MATRIX_MODE, |
||
258 | OPCODE_MIN_MAX, |
||
259 | OPCODE_MULT_MATRIX, |
||
260 | OPCODE_ORTHO, |
||
261 | OPCODE_PASSTHROUGH, |
||
262 | OPCODE_PIXEL_MAP, |
||
263 | OPCODE_PIXEL_TRANSFER, |
||
264 | OPCODE_PIXEL_ZOOM, |
||
265 | OPCODE_POINT_SIZE, |
||
266 | OPCODE_POINT_PARAMETERS, |
||
267 | OPCODE_POLYGON_MODE, |
||
268 | OPCODE_POLYGON_STIPPLE, |
||
269 | OPCODE_POLYGON_OFFSET, |
||
270 | OPCODE_POP_ATTRIB, |
||
271 | OPCODE_POP_MATRIX, |
||
272 | OPCODE_POP_NAME, |
||
273 | OPCODE_PRIORITIZE_TEXTURE, |
||
274 | OPCODE_PUSH_ATTRIB, |
||
275 | OPCODE_PUSH_MATRIX, |
||
276 | OPCODE_PUSH_NAME, |
||
277 | OPCODE_RASTER_POS, |
||
278 | OPCODE_READ_BUFFER, |
||
279 | OPCODE_RESET_HISTOGRAM, |
||
280 | OPCODE_RESET_MIN_MAX, |
||
281 | OPCODE_ROTATE, |
||
282 | OPCODE_SCALE, |
||
283 | OPCODE_SCISSOR, |
||
284 | OPCODE_SELECT_TEXTURE_SGIS, |
||
285 | OPCODE_SELECT_TEXTURE_COORD_SET, |
||
286 | OPCODE_SHADE_MODEL, |
||
287 | OPCODE_STENCIL_FUNC, |
||
288 | OPCODE_STENCIL_MASK, |
||
289 | OPCODE_STENCIL_OP, |
||
290 | OPCODE_TEXENV, |
||
291 | OPCODE_TEXGEN, |
||
292 | OPCODE_TEXPARAMETER, |
||
293 | OPCODE_TEX_IMAGE1D, |
||
294 | OPCODE_TEX_IMAGE2D, |
||
295 | OPCODE_TEX_IMAGE3D, |
||
296 | OPCODE_TEX_SUB_IMAGE1D, |
||
297 | OPCODE_TEX_SUB_IMAGE2D, |
||
298 | OPCODE_TEX_SUB_IMAGE3D, |
||
299 | OPCODE_TRANSLATE, |
||
300 | OPCODE_VIEWPORT, |
||
301 | OPCODE_WINDOW_POS, |
||
302 | /* GL_ARB_multitexture */ |
||
303 | OPCODE_ACTIVE_TEXTURE, |
||
304 | /* GL_ARB_texture_compression */ |
||
305 | OPCODE_COMPRESSED_TEX_IMAGE_1D, |
||
306 | OPCODE_COMPRESSED_TEX_IMAGE_2D, |
||
307 | OPCODE_COMPRESSED_TEX_IMAGE_3D, |
||
308 | OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D, |
||
309 | OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D, |
||
310 | OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D, |
||
311 | /* GL_ARB_multisample */ |
||
312 | OPCODE_SAMPLE_COVERAGE, |
||
313 | /* GL_ARB_window_pos */ |
||
314 | OPCODE_WINDOW_POS_ARB, |
||
315 | /* GL_NV_vertex_program */ |
||
316 | OPCODE_BIND_PROGRAM_NV, |
||
317 | OPCODE_EXECUTE_PROGRAM_NV, |
||
318 | OPCODE_REQUEST_RESIDENT_PROGRAMS_NV, |
||
319 | OPCODE_LOAD_PROGRAM_NV, |
||
320 | OPCODE_TRACK_MATRIX_NV, |
||
321 | /* GL_NV_fragment_program */ |
||
322 | OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, |
||
323 | OPCODE_PROGRAM_NAMED_PARAMETER_NV, |
||
324 | /* GL_EXT_stencil_two_side */ |
||
325 | OPCODE_ACTIVE_STENCIL_FACE_EXT, |
||
326 | /* GL_EXT_depth_bounds_test */ |
||
327 | OPCODE_DEPTH_BOUNDS_EXT, |
||
328 | /* GL_ARB_vertex/fragment_program */ |
||
329 | OPCODE_PROGRAM_STRING_ARB, |
||
330 | OPCODE_PROGRAM_ENV_PARAMETER_ARB, |
||
331 | /* GL_ARB_occlusion_query */ |
||
332 | OPCODE_BEGIN_QUERY_ARB, |
||
333 | OPCODE_END_QUERY_ARB, |
||
334 | /* GL_ARB_draw_buffers */ |
||
335 | OPCODE_DRAW_BUFFERS_ARB, |
||
336 | /* GL_ATI_fragment_shader */ |
||
337 | OPCODE_TEX_BUMP_PARAMETER_ATI, |
||
338 | /* GL_ATI_fragment_shader */ |
||
339 | OPCODE_BIND_FRAGMENT_SHADER_ATI, |
||
340 | OPCODE_SET_FRAGMENT_SHADER_CONSTANTS_ATI, |
||
341 | /* OpenGL 2.0 */ |
||
342 | OPCODE_STENCIL_FUNC_SEPARATE, |
||
343 | OPCODE_STENCIL_OP_SEPARATE, |
||
344 | OPCODE_STENCIL_MASK_SEPARATE, |
||
345 | |||
346 | /* GL_ARB_shader_objects */ |
||
347 | OPCODE_USE_PROGRAM, |
||
348 | OPCODE_UNIFORM_1F, |
||
349 | OPCODE_UNIFORM_2F, |
||
350 | OPCODE_UNIFORM_3F, |
||
351 | OPCODE_UNIFORM_4F, |
||
352 | OPCODE_UNIFORM_1FV, |
||
353 | OPCODE_UNIFORM_2FV, |
||
354 | OPCODE_UNIFORM_3FV, |
||
355 | OPCODE_UNIFORM_4FV, |
||
356 | OPCODE_UNIFORM_1I, |
||
357 | OPCODE_UNIFORM_2I, |
||
358 | OPCODE_UNIFORM_3I, |
||
359 | OPCODE_UNIFORM_4I, |
||
360 | OPCODE_UNIFORM_1IV, |
||
361 | OPCODE_UNIFORM_2IV, |
||
362 | OPCODE_UNIFORM_3IV, |
||
363 | OPCODE_UNIFORM_4IV, |
||
364 | OPCODE_UNIFORM_MATRIX22, |
||
365 | OPCODE_UNIFORM_MATRIX33, |
||
366 | OPCODE_UNIFORM_MATRIX44, |
||
367 | OPCODE_UNIFORM_MATRIX23, |
||
368 | OPCODE_UNIFORM_MATRIX32, |
||
369 | OPCODE_UNIFORM_MATRIX24, |
||
370 | OPCODE_UNIFORM_MATRIX42, |
||
371 | OPCODE_UNIFORM_MATRIX34, |
||
372 | OPCODE_UNIFORM_MATRIX43, |
||
373 | |||
374 | /* OpenGL 3.0 */ |
||
375 | OPCODE_UNIFORM_1UI, |
||
376 | OPCODE_UNIFORM_2UI, |
||
377 | OPCODE_UNIFORM_3UI, |
||
378 | OPCODE_UNIFORM_4UI, |
||
379 | OPCODE_UNIFORM_1UIV, |
||
380 | OPCODE_UNIFORM_2UIV, |
||
381 | OPCODE_UNIFORM_3UIV, |
||
382 | OPCODE_UNIFORM_4UIV, |
||
383 | |||
384 | /* GL_EXT_framebuffer_blit */ |
||
385 | OPCODE_BLIT_FRAMEBUFFER, |
||
386 | |||
387 | /* Vertex attributes -- fallback for when optimized display |
||
388 | * list build isn't active. |
||
389 | */ |
||
390 | OPCODE_ATTR_1F_NV, |
||
391 | OPCODE_ATTR_2F_NV, |
||
392 | OPCODE_ATTR_3F_NV, |
||
393 | OPCODE_ATTR_4F_NV, |
||
394 | OPCODE_ATTR_1F_ARB, |
||
395 | OPCODE_ATTR_2F_ARB, |
||
396 | OPCODE_ATTR_3F_ARB, |
||
397 | OPCODE_ATTR_4F_ARB, |
||
398 | OPCODE_MATERIAL, |
||
399 | OPCODE_BEGIN, |
||
400 | OPCODE_END, |
||
401 | OPCODE_RECTF, |
||
402 | OPCODE_EVAL_C1, |
||
403 | OPCODE_EVAL_C2, |
||
404 | OPCODE_EVAL_P1, |
||
405 | OPCODE_EVAL_P2, |
||
406 | |||
407 | /* GL_EXT_provoking_vertex */ |
||
408 | OPCODE_PROVOKING_VERTEX, |
||
409 | |||
410 | /* GL_EXT_transform_feedback */ |
||
411 | OPCODE_BEGIN_TRANSFORM_FEEDBACK, |
||
412 | OPCODE_END_TRANSFORM_FEEDBACK, |
||
413 | |||
414 | /* GL_EXT_texture_integer */ |
||
415 | OPCODE_CLEARCOLOR_I, |
||
416 | OPCODE_CLEARCOLOR_UI, |
||
417 | OPCODE_TEXPARAMETER_I, |
||
418 | OPCODE_TEXPARAMETER_UI, |
||
419 | |||
420 | /* GL_EXT_separate_shader_objects */ |
||
421 | OPCODE_ACTIVE_PROGRAM_EXT, |
||
422 | OPCODE_USE_SHADER_PROGRAM_EXT, |
||
423 | |||
424 | /* The following three are meta instructions */ |
||
425 | OPCODE_ERROR, /* raise compiled-in error */ |
||
426 | OPCODE_CONTINUE, |
||
427 | OPCODE_END_OF_LIST, |
||
428 | OPCODE_EXT_0 |
||
429 | } OpCode; |
||
430 | |||
431 | |||
432 | |||
433 | /** |
||
434 | * Display list node. |
||
435 | * |
||
436 | * Display list instructions are stored as sequences of "nodes". Nodes |
||
437 | * are allocated in blocks. Each block has BLOCK_SIZE nodes. Blocks |
||
438 | * are linked together with a pointer. |
||
439 | * |
||
440 | * Each instruction in the display list is stored as a sequence of |
||
441 | * contiguous nodes in memory. |
||
442 | * Each node is the union of a variety of data types. |
||
443 | */ |
||
444 | union gl_dlist_node |
||
445 | { |
||
446 | OpCode opcode; |
||
447 | GLboolean b; |
||
448 | GLbitfield bf; |
||
449 | GLubyte ub; |
||
450 | GLshort s; |
||
451 | GLushort us; |
||
452 | GLint i; |
||
453 | GLuint ui; |
||
454 | GLenum e; |
||
455 | GLfloat f; |
||
456 | GLvoid *data; |
||
457 | void *next; /* If prev node's opcode==OPCODE_CONTINUE */ |
||
458 | }; |
||
459 | |||
460 | |||
461 | typedef union gl_dlist_node Node; |
||
462 | |||
463 | |||
464 | /** |
||
465 | * How many nodes to allocate at a time. |
||
466 | * |
||
467 | * \note Reduced now that we hold vertices etc. elsewhere. |
||
468 | */ |
||
469 | #define BLOCK_SIZE 256 |
||
470 | |||
471 | |||
472 | |||
473 | /** |
||
474 | * Number of nodes of storage needed for each instruction. |
||
475 | * Sizes for dynamically allocated opcodes are stored in the context struct. |
||
476 | */ |
||
477 | static GLuint InstSize[OPCODE_END_OF_LIST + 1]; |
||
478 | |||
479 | |||
480 | #if FEATURE_dlist |
||
481 | |||
482 | |||
483 | void mesa_print_display_list(GLuint list); |
||
484 | |||
485 | |||
486 | /**********************************************************************/ |
||
487 | /***** Private *****/ |
||
488 | /**********************************************************************/ |
||
489 | |||
490 | |||
491 | /** |
||
492 | * Make an empty display list. This is used by glGenLists() to |
||
493 | * reserve display list IDs. |
||
494 | */ |
||
495 | static struct gl_display_list * |
||
496 | make_list(GLuint name, GLuint count) |
||
497 | { |
||
498 | struct gl_display_list *dlist = CALLOC_STRUCT(gl_display_list); |
||
499 | dlist->Name = name; |
||
500 | dlist->Head = (Node *) malloc(sizeof(Node) * count); |
||
501 | dlist->Head[0].opcode = OPCODE_END_OF_LIST; |
||
502 | return dlist; |
||
503 | } |
||
504 | |||
505 | |||
506 | /** |
||
507 | * Lookup function to just encapsulate casting. |
||
508 | */ |
||
509 | static INLINE struct gl_display_list * |
||
510 | lookup_list(struct gl_context *ctx, GLuint list) |
||
511 | { |
||
512 | return (struct gl_display_list *) |
||
513 | _mesa_HashLookup(ctx->Shared->DisplayList, list); |
||
514 | } |
||
515 | |||
516 | |||
517 | /** Is the given opcode an extension code? */ |
||
518 | static INLINE GLboolean |
||
519 | is_ext_opcode(OpCode opcode) |
||
520 | { |
||
521 | return (opcode >= OPCODE_EXT_0); |
||
522 | } |
||
523 | |||
524 | |||
525 | /** Destroy an extended opcode instruction */ |
||
526 | static GLint |
||
527 | ext_opcode_destroy(struct gl_context *ctx, Node *node) |
||
528 | { |
||
529 | const GLint i = node[0].opcode - OPCODE_EXT_0; |
||
530 | GLint step; |
||
531 | ctx->ListExt->Opcode[i].Destroy(ctx, &node[1]); |
||
532 | step = ctx->ListExt->Opcode[i].Size; |
||
533 | return step; |
||
534 | } |
||
535 | |||
536 | |||
537 | /** Execute an extended opcode instruction */ |
||
538 | static GLint |
||
539 | ext_opcode_execute(struct gl_context *ctx, Node *node) |
||
540 | { |
||
541 | const GLint i = node[0].opcode - OPCODE_EXT_0; |
||
542 | GLint step; |
||
543 | ctx->ListExt->Opcode[i].Execute(ctx, &node[1]); |
||
544 | step = ctx->ListExt->Opcode[i].Size; |
||
545 | return step; |
||
546 | } |
||
547 | |||
548 | |||
549 | /** Print an extended opcode instruction */ |
||
550 | static GLint |
||
551 | ext_opcode_print(struct gl_context *ctx, Node *node) |
||
552 | { |
||
553 | const GLint i = node[0].opcode - OPCODE_EXT_0; |
||
554 | GLint step; |
||
555 | ctx->ListExt->Opcode[i].Print(ctx, &node[1]); |
||
556 | step = ctx->ListExt->Opcode[i].Size; |
||
557 | return step; |
||
558 | } |
||
559 | |||
560 | |||
561 | /** |
||
562 | * Delete the named display list, but don't remove from hash table. |
||
563 | * \param dlist - display list pointer |
||
564 | */ |
||
565 | void |
||
566 | _mesa_delete_list(struct gl_context *ctx, struct gl_display_list *dlist) |
||
567 | { |
||
568 | Node *n, *block; |
||
569 | GLboolean done; |
||
570 | |||
571 | n = block = dlist->Head; |
||
572 | |||
573 | done = block ? GL_FALSE : GL_TRUE; |
||
574 | while (!done) { |
||
575 | const OpCode opcode = n[0].opcode; |
||
576 | |||
577 | /* check for extension opcodes first */ |
||
578 | if (is_ext_opcode(opcode)) { |
||
579 | n += ext_opcode_destroy(ctx, n); |
||
580 | } |
||
581 | else { |
||
582 | switch (opcode) { |
||
583 | /* for some commands, we need to free malloc'd memory */ |
||
584 | case OPCODE_MAP1: |
||
585 | free(n[6].data); |
||
586 | n += InstSize[n[0].opcode]; |
||
587 | break; |
||
588 | case OPCODE_MAP2: |
||
589 | free(n[10].data); |
||
590 | n += InstSize[n[0].opcode]; |
||
591 | break; |
||
592 | case OPCODE_DRAW_PIXELS: |
||
593 | free(n[5].data); |
||
594 | n += InstSize[n[0].opcode]; |
||
595 | break; |
||
596 | case OPCODE_BITMAP: |
||
597 | free(n[7].data); |
||
598 | n += InstSize[n[0].opcode]; |
||
599 | break; |
||
600 | case OPCODE_COLOR_TABLE: |
||
601 | free(n[6].data); |
||
602 | n += InstSize[n[0].opcode]; |
||
603 | break; |
||
604 | case OPCODE_COLOR_SUB_TABLE: |
||
605 | free(n[6].data); |
||
606 | n += InstSize[n[0].opcode]; |
||
607 | break; |
||
608 | case OPCODE_CONVOLUTION_FILTER_1D: |
||
609 | free(n[6].data); |
||
610 | n += InstSize[n[0].opcode]; |
||
611 | break; |
||
612 | case OPCODE_CONVOLUTION_FILTER_2D: |
||
613 | free(n[7].data); |
||
614 | n += InstSize[n[0].opcode]; |
||
615 | break; |
||
616 | case OPCODE_POLYGON_STIPPLE: |
||
617 | free(n[1].data); |
||
618 | n += InstSize[n[0].opcode]; |
||
619 | break; |
||
620 | case OPCODE_TEX_IMAGE1D: |
||
621 | free(n[8].data); |
||
622 | n += InstSize[n[0].opcode]; |
||
623 | break; |
||
624 | case OPCODE_TEX_IMAGE2D: |
||
625 | free(n[9].data); |
||
626 | n += InstSize[n[0].opcode]; |
||
627 | break; |
||
628 | case OPCODE_TEX_IMAGE3D: |
||
629 | free(n[10].data); |
||
630 | n += InstSize[n[0].opcode]; |
||
631 | break; |
||
632 | case OPCODE_TEX_SUB_IMAGE1D: |
||
633 | free(n[7].data); |
||
634 | n += InstSize[n[0].opcode]; |
||
635 | break; |
||
636 | case OPCODE_TEX_SUB_IMAGE2D: |
||
637 | free(n[9].data); |
||
638 | n += InstSize[n[0].opcode]; |
||
639 | break; |
||
640 | case OPCODE_TEX_SUB_IMAGE3D: |
||
641 | free(n[11].data); |
||
642 | n += InstSize[n[0].opcode]; |
||
643 | break; |
||
644 | case OPCODE_COMPRESSED_TEX_IMAGE_1D: |
||
645 | free(n[7].data); |
||
646 | n += InstSize[n[0].opcode]; |
||
647 | break; |
||
648 | case OPCODE_COMPRESSED_TEX_IMAGE_2D: |
||
649 | free(n[8].data); |
||
650 | n += InstSize[n[0].opcode]; |
||
651 | break; |
||
652 | case OPCODE_COMPRESSED_TEX_IMAGE_3D: |
||
653 | free(n[9].data); |
||
654 | n += InstSize[n[0].opcode]; |
||
655 | break; |
||
656 | case OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D: |
||
657 | free(n[7].data); |
||
658 | n += InstSize[n[0].opcode]; |
||
659 | break; |
||
660 | case OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D: |
||
661 | free(n[9].data); |
||
662 | n += InstSize[n[0].opcode]; |
||
663 | break; |
||
664 | case OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D: |
||
665 | free(n[11].data); |
||
666 | n += InstSize[n[0].opcode]; |
||
667 | break; |
||
668 | #if FEATURE_NV_vertex_program |
||
669 | case OPCODE_LOAD_PROGRAM_NV: |
||
670 | free(n[4].data); /* program string */ |
||
671 | n += InstSize[n[0].opcode]; |
||
672 | break; |
||
673 | case OPCODE_REQUEST_RESIDENT_PROGRAMS_NV: |
||
674 | free(n[2].data); /* array of program ids */ |
||
675 | n += InstSize[n[0].opcode]; |
||
676 | break; |
||
677 | #endif |
||
678 | #if FEATURE_NV_fragment_program |
||
679 | case OPCODE_PROGRAM_NAMED_PARAMETER_NV: |
||
680 | free(n[3].data); /* parameter name */ |
||
681 | n += InstSize[n[0].opcode]; |
||
682 | break; |
||
683 | #endif |
||
684 | #if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program |
||
685 | case OPCODE_PROGRAM_STRING_ARB: |
||
686 | free(n[4].data); /* program string */ |
||
687 | n += InstSize[n[0].opcode]; |
||
688 | break; |
||
689 | #endif |
||
690 | case OPCODE_UNIFORM_1FV: |
||
691 | case OPCODE_UNIFORM_2FV: |
||
692 | case OPCODE_UNIFORM_3FV: |
||
693 | case OPCODE_UNIFORM_4FV: |
||
694 | case OPCODE_UNIFORM_1IV: |
||
695 | case OPCODE_UNIFORM_2IV: |
||
696 | case OPCODE_UNIFORM_3IV: |
||
697 | case OPCODE_UNIFORM_4IV: |
||
698 | case OPCODE_UNIFORM_1UIV: |
||
699 | case OPCODE_UNIFORM_2UIV: |
||
700 | case OPCODE_UNIFORM_3UIV: |
||
701 | case OPCODE_UNIFORM_4UIV: |
||
702 | free(n[3].data); |
||
703 | n += InstSize[n[0].opcode]; |
||
704 | break; |
||
705 | case OPCODE_UNIFORM_MATRIX22: |
||
706 | case OPCODE_UNIFORM_MATRIX33: |
||
707 | case OPCODE_UNIFORM_MATRIX44: |
||
708 | case OPCODE_UNIFORM_MATRIX24: |
||
709 | case OPCODE_UNIFORM_MATRIX42: |
||
710 | case OPCODE_UNIFORM_MATRIX23: |
||
711 | case OPCODE_UNIFORM_MATRIX32: |
||
712 | case OPCODE_UNIFORM_MATRIX34: |
||
713 | case OPCODE_UNIFORM_MATRIX43: |
||
714 | free(n[4].data); |
||
715 | n += InstSize[n[0].opcode]; |
||
716 | break; |
||
717 | |||
718 | case OPCODE_CONTINUE: |
||
719 | n = (Node *) n[1].next; |
||
720 | free(block); |
||
721 | block = n; |
||
722 | break; |
||
723 | case OPCODE_END_OF_LIST: |
||
724 | free(block); |
||
725 | done = GL_TRUE; |
||
726 | break; |
||
727 | default: |
||
728 | /* Most frequent case */ |
||
729 | n += InstSize[n[0].opcode]; |
||
730 | break; |
||
731 | } |
||
732 | } |
||
733 | } |
||
734 | |||
735 | free(dlist); |
||
736 | } |
||
737 | |||
738 | |||
739 | /** |
||
740 | * Destroy a display list and remove from hash table. |
||
741 | * \param list - display list number |
||
742 | */ |
||
743 | static void |
||
744 | destroy_list(struct gl_context *ctx, GLuint list) |
||
745 | { |
||
746 | struct gl_display_list *dlist; |
||
747 | |||
748 | if (list == 0) |
||
749 | return; |
||
750 | |||
751 | dlist = lookup_list(ctx, list); |
||
752 | if (!dlist) |
||
753 | return; |
||
754 | |||
755 | _mesa_delete_list(ctx, dlist); |
||
756 | _mesa_HashRemove(ctx->Shared->DisplayList, list); |
||
757 | } |
||
758 | |||
759 | |||
760 | /* |
||
761 | * Translate the nth element of list from |
||
762 | */ |
||
763 | static GLint |
||
764 | translate_id(GLsizei n, GLenum type, const GLvoid * list) |
||
765 | { |
||
766 | GLbyte *bptr; |
||
767 | GLubyte *ubptr; |
||
768 | GLshort *sptr; |
||
769 | GLushort *usptr; |
||
770 | GLint *iptr; |
||
771 | GLuint *uiptr; |
||
772 | GLfloat *fptr; |
||
773 | |||
774 | switch (type) { |
||
775 | case GL_BYTE: |
||
776 | bptr = (GLbyte *) list; |
||
777 | return (GLint) bptr[n]; |
||
778 | case GL_UNSIGNED_BYTE: |
||
779 | ubptr = (GLubyte *) list; |
||
780 | return (GLint) ubptr[n]; |
||
781 | case GL_SHORT: |
||
782 | sptr = (GLshort *) list; |
||
783 | return (GLint) sptr[n]; |
||
784 | case GL_UNSIGNED_SHORT: |
||
785 | usptr = (GLushort *) list; |
||
786 | return (GLint) usptr[n]; |
||
787 | case GL_INT: |
||
788 | iptr = (GLint *) list; |
||
789 | return iptr[n]; |
||
790 | case GL_UNSIGNED_INT: |
||
791 | uiptr = (GLuint *) list; |
||
792 | return (GLint) uiptr[n]; |
||
793 | case GL_FLOAT: |
||
794 | fptr = (GLfloat *) list; |
||
795 | return (GLint) FLOORF(fptr[n]); |
||
796 | case GL_2_BYTES: |
||
797 | ubptr = ((GLubyte *) list) + 2 * n; |
||
798 | return (GLint) ubptr[0] * 256 |
||
799 | + (GLint) ubptr[1]; |
||
800 | case GL_3_BYTES: |
||
801 | ubptr = ((GLubyte *) list) + 3 * n; |
||
802 | return (GLint) ubptr[0] * 65536 |
||
803 | + (GLint) ubptr[1] * 256 |
||
804 | + (GLint) ubptr[2]; |
||
805 | case GL_4_BYTES: |
||
806 | ubptr = ((GLubyte *) list) + 4 * n; |
||
807 | return (GLint) ubptr[0] * 16777216 |
||
808 | + (GLint) ubptr[1] * 65536 |
||
809 | + (GLint) ubptr[2] * 256 |
||
810 | + (GLint) ubptr[3]; |
||
811 | default: |
||
812 | return 0; |
||
813 | } |
||
814 | } |
||
815 | |||
816 | |||
817 | |||
818 | |||
819 | /**********************************************************************/ |
||
820 | /***** Public *****/ |
||
821 | /**********************************************************************/ |
||
822 | |||
823 | /** |
||
824 | * Wrapper for _mesa_unpack_image() that handles pixel buffer objects. |
||
825 | * If we run out of memory, GL_OUT_OF_MEMORY will be recorded. |
||
826 | */ |
||
827 | static GLvoid * |
||
828 | unpack_image(struct gl_context *ctx, GLuint dimensions, |
||
829 | GLsizei width, GLsizei height, GLsizei depth, |
||
830 | GLenum format, GLenum type, const GLvoid * pixels, |
||
831 | const struct gl_pixelstore_attrib *unpack) |
||
832 | { |
||
833 | if (!_mesa_is_bufferobj(unpack->BufferObj)) { |
||
834 | /* no PBO */ |
||
835 | GLvoid *image = _mesa_unpack_image(dimensions, width, height, depth, |
||
836 | format, type, pixels, unpack); |
||
837 | if (pixels && !image) { |
||
838 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "display list construction"); |
||
839 | } |
||
840 | return image; |
||
841 | } |
||
842 | else if (_mesa_validate_pbo_access(dimensions, unpack, width, height, depth, |
||
843 | format, type, pixels)) { |
||
844 | const GLubyte *map, *src; |
||
845 | GLvoid *image; |
||
846 | |||
847 | map = (GLubyte *) |
||
848 | ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, |
||
849 | GL_READ_ONLY_ARB, unpack->BufferObj); |
||
850 | if (!map) { |
||
851 | /* unable to map src buffer! */ |
||
852 | _mesa_error(ctx, GL_INVALID_OPERATION, "unable to map PBO"); |
||
853 | return NULL; |
||
854 | } |
||
855 | |||
856 | src = ADD_POINTERS(map, pixels); |
||
857 | image = _mesa_unpack_image(dimensions, width, height, depth, |
||
858 | format, type, src, unpack); |
||
859 | |||
860 | ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, |
||
861 | unpack->BufferObj); |
||
862 | |||
863 | if (!image) { |
||
864 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "display list construction"); |
||
865 | } |
||
866 | return image; |
||
867 | } |
||
868 | /* bad access! */ |
||
869 | return NULL; |
||
870 | } |
||
871 | |||
872 | |||
873 | /** |
||
874 | * Allocate space for a display list instruction (opcode + payload space). |
||
875 | * \param opcode the instruction opcode (OPCODE_* value) |
||
876 | * \param bytes instruction payload size (not counting opcode) |
||
877 | * \return pointer to allocated memory (the opcode space) |
||
878 | */ |
||
879 | static Node * |
||
880 | dlist_alloc(struct gl_context *ctx, OpCode opcode, GLuint bytes) |
||
881 | { |
||
882 | const GLuint numNodes = 1 + (bytes + sizeof(Node) - 1) / sizeof(Node); |
||
883 | Node *n; |
||
884 | |||
885 | if (opcode < (GLuint) OPCODE_EXT_0) { |
||
886 | if (InstSize[opcode] == 0) { |
||
887 | /* save instruction size now */ |
||
888 | InstSize[opcode] = numNodes; |
||
889 | } |
||
890 | else { |
||
891 | /* make sure instruction size agrees */ |
||
892 | ASSERT(numNodes == InstSize[opcode]); |
||
893 | } |
||
894 | } |
||
895 | |||
896 | if (ctx->ListState.CurrentPos + numNodes + 2 > BLOCK_SIZE) { |
||
897 | /* This block is full. Allocate a new block and chain to it */ |
||
898 | Node *newblock; |
||
899 | n = ctx->ListState.CurrentBlock + ctx->ListState.CurrentPos; |
||
900 | n[0].opcode = OPCODE_CONTINUE; |
||
901 | newblock = (Node *) malloc(sizeof(Node) * BLOCK_SIZE); |
||
902 | if (!newblock) { |
||
903 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "Building display list"); |
||
904 | return NULL; |
||
905 | } |
||
906 | n[1].next = (Node *) newblock; |
||
907 | ctx->ListState.CurrentBlock = newblock; |
||
908 | ctx->ListState.CurrentPos = 0; |
||
909 | } |
||
910 | |||
911 | n = ctx->ListState.CurrentBlock + ctx->ListState.CurrentPos; |
||
912 | ctx->ListState.CurrentPos += numNodes; |
||
913 | |||
914 | n[0].opcode = opcode; |
||
915 | |||
916 | return n; |
||
917 | } |
||
918 | |||
919 | |||
920 | |||
921 | /** |
||
922 | * Allocate space for a display list instruction. Used by callers outside |
||
923 | * this file for things like VBO vertex data. |
||
924 | * |
||
925 | * \param opcode the instruction opcode (OPCODE_* value) |
||
926 | * \param bytes instruction size in bytes, not counting opcode. |
||
927 | * \return pointer to the usable data area (not including the internal |
||
928 | * opcode). |
||
929 | */ |
||
930 | void * |
||
931 | _mesa_dlist_alloc(struct gl_context *ctx, GLuint opcode, GLuint bytes) |
||
932 | { |
||
933 | Node *n = dlist_alloc(ctx, (OpCode) opcode, bytes); |
||
934 | if (n) |
||
935 | return n + 1; /* return pointer to payload area, after opcode */ |
||
936 | else |
||
937 | return NULL; |
||
938 | } |
||
939 | |||
940 | |||
941 | /** |
||
942 | * This function allows modules and drivers to get their own opcodes |
||
943 | * for extending display list functionality. |
||
944 | * \param ctx the rendering context |
||
945 | * \param size number of bytes for storing the new display list command |
||
946 | * \param execute function to execute the new display list command |
||
947 | * \param destroy function to destroy the new display list command |
||
948 | * \param print function to print the new display list command |
||
949 | * \return the new opcode number or -1 if error |
||
950 | */ |
||
951 | GLint |
||
952 | _mesa_dlist_alloc_opcode(struct gl_context *ctx, |
||
953 | GLuint size, |
||
954 | void (*execute) (struct gl_context *, void *), |
||
955 | void (*destroy) (struct gl_context *, void *), |
||
956 | void (*print) (struct gl_context *, void *)) |
||
957 | { |
||
958 | if (ctx->ListExt->NumOpcodes < MAX_DLIST_EXT_OPCODES) { |
||
959 | const GLuint i = ctx->ListExt->NumOpcodes++; |
||
960 | ctx->ListExt->Opcode[i].Size = |
||
961 | 1 + (size + sizeof(Node) - 1) / sizeof(Node); |
||
962 | ctx->ListExt->Opcode[i].Execute = execute; |
||
963 | ctx->ListExt->Opcode[i].Destroy = destroy; |
||
964 | ctx->ListExt->Opcode[i].Print = print; |
||
965 | return i + OPCODE_EXT_0; |
||
966 | } |
||
967 | return -1; |
||
968 | } |
||
969 | |||
970 | |||
971 | /** |
||
972 | * Allocate space for a display list instruction. The space is basically |
||
973 | * an array of Nodes where node[0] holds the opcode, node[1] is the first |
||
974 | * function parameter, node[2] is the second parameter, etc. |
||
975 | * |
||
976 | * \param opcode one of OPCODE_x |
||
977 | * \param nparams number of function parameters |
||
978 | * \return pointer to start of instruction space |
||
979 | */ |
||
980 | static INLINE Node * |
||
981 | alloc_instruction(struct gl_context *ctx, OpCode opcode, GLuint nparams) |
||
982 | { |
||
983 | return dlist_alloc(ctx, opcode, nparams * sizeof(Node)); |
||
984 | } |
||
985 | |||
986 | |||
987 | |||
988 | /* |
||
989 | * Display List compilation functions |
||
990 | */ |
||
991 | static void GLAPIENTRY |
||
992 | save_Accum(GLenum op, GLfloat value) |
||
993 | { |
||
994 | GET_CURRENT_CONTEXT(ctx); |
||
995 | Node *n; |
||
996 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
997 | n = alloc_instruction(ctx, OPCODE_ACCUM, 2); |
||
998 | if (n) { |
||
999 | n[1].e = op; |
||
1000 | n[2].f = value; |
||
1001 | } |
||
1002 | if (ctx->ExecuteFlag) { |
||
1003 | CALL_Accum(ctx->Exec, (op, value)); |
||
1004 | } |
||
1005 | } |
||
1006 | |||
1007 | |||
1008 | static void GLAPIENTRY |
||
1009 | save_AlphaFunc(GLenum func, GLclampf ref) |
||
1010 | { |
||
1011 | GET_CURRENT_CONTEXT(ctx); |
||
1012 | Node *n; |
||
1013 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1014 | n = alloc_instruction(ctx, OPCODE_ALPHA_FUNC, 2); |
||
1015 | if (n) { |
||
1016 | n[1].e = func; |
||
1017 | n[2].f = (GLfloat) ref; |
||
1018 | } |
||
1019 | if (ctx->ExecuteFlag) { |
||
1020 | CALL_AlphaFunc(ctx->Exec, (func, ref)); |
||
1021 | } |
||
1022 | } |
||
1023 | |||
1024 | |||
1025 | static void GLAPIENTRY |
||
1026 | save_BindTexture(GLenum target, GLuint texture) |
||
1027 | { |
||
1028 | GET_CURRENT_CONTEXT(ctx); |
||
1029 | Node *n; |
||
1030 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1031 | n = alloc_instruction(ctx, OPCODE_BIND_TEXTURE, 2); |
||
1032 | if (n) { |
||
1033 | n[1].e = target; |
||
1034 | n[2].ui = texture; |
||
1035 | } |
||
1036 | if (ctx->ExecuteFlag) { |
||
1037 | CALL_BindTexture(ctx->Exec, (target, texture)); |
||
1038 | } |
||
1039 | } |
||
1040 | |||
1041 | |||
1042 | static void GLAPIENTRY |
||
1043 | save_Bitmap(GLsizei width, GLsizei height, |
||
1044 | GLfloat xorig, GLfloat yorig, |
||
1045 | GLfloat xmove, GLfloat ymove, const GLubyte * pixels) |
||
1046 | { |
||
1047 | GET_CURRENT_CONTEXT(ctx); |
||
1048 | Node *n; |
||
1049 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1050 | n = alloc_instruction(ctx, OPCODE_BITMAP, 7); |
||
1051 | if (n) { |
||
1052 | n[1].i = (GLint) width; |
||
1053 | n[2].i = (GLint) height; |
||
1054 | n[3].f = xorig; |
||
1055 | n[4].f = yorig; |
||
1056 | n[5].f = xmove; |
||
1057 | n[6].f = ymove; |
||
1058 | n[7].data = _mesa_unpack_bitmap(width, height, pixels, &ctx->Unpack); |
||
1059 | } |
||
1060 | if (ctx->ExecuteFlag) { |
||
1061 | CALL_Bitmap(ctx->Exec, (width, height, |
||
1062 | xorig, yorig, xmove, ymove, pixels)); |
||
1063 | } |
||
1064 | } |
||
1065 | |||
1066 | |||
1067 | static void GLAPIENTRY |
||
1068 | save_BlendEquation(GLenum mode) |
||
1069 | { |
||
1070 | GET_CURRENT_CONTEXT(ctx); |
||
1071 | Node *n; |
||
1072 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1073 | n = alloc_instruction(ctx, OPCODE_BLEND_EQUATION, 1); |
||
1074 | if (n) { |
||
1075 | n[1].e = mode; |
||
1076 | } |
||
1077 | if (ctx->ExecuteFlag) { |
||
1078 | CALL_BlendEquation(ctx->Exec, (mode)); |
||
1079 | } |
||
1080 | } |
||
1081 | |||
1082 | |||
1083 | static void GLAPIENTRY |
||
1084 | save_BlendEquationSeparateEXT(GLenum modeRGB, GLenum modeA) |
||
1085 | { |
||
1086 | GET_CURRENT_CONTEXT(ctx); |
||
1087 | Node *n; |
||
1088 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1089 | n = alloc_instruction(ctx, OPCODE_BLEND_EQUATION_SEPARATE, 2); |
||
1090 | if (n) { |
||
1091 | n[1].e = modeRGB; |
||
1092 | n[2].e = modeA; |
||
1093 | } |
||
1094 | if (ctx->ExecuteFlag) { |
||
1095 | CALL_BlendEquationSeparateEXT(ctx->Exec, (modeRGB, modeA)); |
||
1096 | } |
||
1097 | } |
||
1098 | |||
1099 | |||
1100 | static void GLAPIENTRY |
||
1101 | save_BlendFuncSeparateEXT(GLenum sfactorRGB, GLenum dfactorRGB, |
||
1102 | GLenum sfactorA, GLenum dfactorA) |
||
1103 | { |
||
1104 | GET_CURRENT_CONTEXT(ctx); |
||
1105 | Node *n; |
||
1106 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1107 | n = alloc_instruction(ctx, OPCODE_BLEND_FUNC_SEPARATE, 4); |
||
1108 | if (n) { |
||
1109 | n[1].e = sfactorRGB; |
||
1110 | n[2].e = dfactorRGB; |
||
1111 | n[3].e = sfactorA; |
||
1112 | n[4].e = dfactorA; |
||
1113 | } |
||
1114 | if (ctx->ExecuteFlag) { |
||
1115 | CALL_BlendFuncSeparateEXT(ctx->Exec, |
||
1116 | (sfactorRGB, dfactorRGB, sfactorA, dfactorA)); |
||
1117 | } |
||
1118 | } |
||
1119 | |||
1120 | |||
1121 | static void GLAPIENTRY |
||
1122 | save_BlendFunc(GLenum srcfactor, GLenum dstfactor) |
||
1123 | { |
||
1124 | save_BlendFuncSeparateEXT(srcfactor, dstfactor, srcfactor, dstfactor); |
||
1125 | } |
||
1126 | |||
1127 | |||
1128 | static void GLAPIENTRY |
||
1129 | save_BlendColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) |
||
1130 | { |
||
1131 | GET_CURRENT_CONTEXT(ctx); |
||
1132 | Node *n; |
||
1133 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1134 | n = alloc_instruction(ctx, OPCODE_BLEND_COLOR, 4); |
||
1135 | if (n) { |
||
1136 | n[1].f = red; |
||
1137 | n[2].f = green; |
||
1138 | n[3].f = blue; |
||
1139 | n[4].f = alpha; |
||
1140 | } |
||
1141 | if (ctx->ExecuteFlag) { |
||
1142 | CALL_BlendColor(ctx->Exec, (red, green, blue, alpha)); |
||
1143 | } |
||
1144 | } |
||
1145 | |||
1146 | static void invalidate_saved_current_state( struct gl_context *ctx ) |
||
1147 | { |
||
1148 | GLint i; |
||
1149 | |||
1150 | for (i = 0; i < VERT_ATTRIB_MAX; i++) |
||
1151 | ctx->ListState.ActiveAttribSize[i] = 0; |
||
1152 | |||
1153 | for (i = 0; i < MAT_ATTRIB_MAX; i++) |
||
1154 | ctx->ListState.ActiveMaterialSize[i] = 0; |
||
1155 | |||
1156 | memset(&ctx->ListState.Current, 0, sizeof ctx->ListState.Current); |
||
1157 | |||
1158 | ctx->Driver.CurrentSavePrimitive = PRIM_UNKNOWN; |
||
1159 | } |
||
1160 | |||
1161 | static void GLAPIENTRY |
||
1162 | save_CallList(GLuint list) |
||
1163 | { |
||
1164 | GET_CURRENT_CONTEXT(ctx); |
||
1165 | Node *n; |
||
1166 | SAVE_FLUSH_VERTICES(ctx); |
||
1167 | |||
1168 | n = alloc_instruction(ctx, OPCODE_CALL_LIST, 1); |
||
1169 | if (n) { |
||
1170 | n[1].ui = list; |
||
1171 | } |
||
1172 | |||
1173 | /* After this, we don't know what state we're in. Invalidate all |
||
1174 | * cached information previously gathered: |
||
1175 | */ |
||
1176 | invalidate_saved_current_state( ctx ); |
||
1177 | |||
1178 | if (ctx->ExecuteFlag) { |
||
1179 | _mesa_CallList(list); |
||
1180 | } |
||
1181 | } |
||
1182 | |||
1183 | |||
1184 | static void GLAPIENTRY |
||
1185 | save_CallLists(GLsizei num, GLenum type, const GLvoid * lists) |
||
1186 | { |
||
1187 | GET_CURRENT_CONTEXT(ctx); |
||
1188 | GLint i; |
||
1189 | GLboolean typeErrorFlag; |
||
1190 | |||
1191 | SAVE_FLUSH_VERTICES(ctx); |
||
1192 | |||
1193 | switch (type) { |
||
1194 | case GL_BYTE: |
||
1195 | case GL_UNSIGNED_BYTE: |
||
1196 | case GL_SHORT: |
||
1197 | case GL_UNSIGNED_SHORT: |
||
1198 | case GL_INT: |
||
1199 | case GL_UNSIGNED_INT: |
||
1200 | case GL_FLOAT: |
||
1201 | case GL_2_BYTES: |
||
1202 | case GL_3_BYTES: |
||
1203 | case GL_4_BYTES: |
||
1204 | typeErrorFlag = GL_FALSE; |
||
1205 | break; |
||
1206 | default: |
||
1207 | typeErrorFlag = GL_TRUE; |
||
1208 | } |
||
1209 | |||
1210 | for (i = 0; i < num; i++) { |
||
1211 | GLint list = translate_id(i, type, lists); |
||
1212 | Node *n = alloc_instruction(ctx, OPCODE_CALL_LIST_OFFSET, 2); |
||
1213 | if (n) { |
||
1214 | n[1].i = list; |
||
1215 | n[2].b = typeErrorFlag; |
||
1216 | } |
||
1217 | } |
||
1218 | |||
1219 | /* After this, we don't know what state we're in. Invalidate all |
||
1220 | * cached information previously gathered: |
||
1221 | */ |
||
1222 | invalidate_saved_current_state( ctx ); |
||
1223 | |||
1224 | if (ctx->ExecuteFlag) { |
||
1225 | CALL_CallLists(ctx->Exec, (num, type, lists)); |
||
1226 | } |
||
1227 | } |
||
1228 | |||
1229 | |||
1230 | static void GLAPIENTRY |
||
1231 | save_Clear(GLbitfield mask) |
||
1232 | { |
||
1233 | GET_CURRENT_CONTEXT(ctx); |
||
1234 | Node *n; |
||
1235 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1236 | n = alloc_instruction(ctx, OPCODE_CLEAR, 1); |
||
1237 | if (n) { |
||
1238 | n[1].bf = mask; |
||
1239 | } |
||
1240 | if (ctx->ExecuteFlag) { |
||
1241 | CALL_Clear(ctx->Exec, (mask)); |
||
1242 | } |
||
1243 | } |
||
1244 | |||
1245 | |||
1246 | static void GLAPIENTRY |
||
1247 | save_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value) |
||
1248 | { |
||
1249 | GET_CURRENT_CONTEXT(ctx); |
||
1250 | Node *n; |
||
1251 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1252 | n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_IV, 6); |
||
1253 | if (n) { |
||
1254 | n[1].e = buffer; |
||
1255 | n[2].i = drawbuffer; |
||
1256 | n[3].i = value[0]; |
||
1257 | if (buffer == GL_COLOR) { |
||
1258 | n[4].i = value[1]; |
||
1259 | n[5].i = value[2]; |
||
1260 | n[6].i = value[3]; |
||
1261 | } |
||
1262 | else { |
||
1263 | n[4].i = 0; |
||
1264 | n[5].i = 0; |
||
1265 | n[6].i = 0; |
||
1266 | } |
||
1267 | } |
||
1268 | if (ctx->ExecuteFlag) { |
||
1269 | /*CALL_ClearBufferiv(ctx->Exec, (buffer, drawbuffer, value));*/ |
||
1270 | } |
||
1271 | } |
||
1272 | |||
1273 | |||
1274 | static void GLAPIENTRY |
||
1275 | save_ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value) |
||
1276 | { |
||
1277 | GET_CURRENT_CONTEXT(ctx); |
||
1278 | Node *n; |
||
1279 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1280 | n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_UIV, 6); |
||
1281 | if (n) { |
||
1282 | n[1].e = buffer; |
||
1283 | n[2].i = drawbuffer; |
||
1284 | n[3].ui = value[0]; |
||
1285 | if (buffer == GL_COLOR) { |
||
1286 | n[4].ui = value[1]; |
||
1287 | n[5].ui = value[2]; |
||
1288 | n[6].ui = value[3]; |
||
1289 | } |
||
1290 | else { |
||
1291 | n[4].ui = 0; |
||
1292 | n[5].ui = 0; |
||
1293 | n[6].ui = 0; |
||
1294 | } |
||
1295 | } |
||
1296 | if (ctx->ExecuteFlag) { |
||
1297 | /*CALL_ClearBufferuiv(ctx->Exec, (buffer, drawbuffer, value));*/ |
||
1298 | } |
||
1299 | } |
||
1300 | |||
1301 | |||
1302 | static void GLAPIENTRY |
||
1303 | save_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value) |
||
1304 | { |
||
1305 | GET_CURRENT_CONTEXT(ctx); |
||
1306 | Node *n; |
||
1307 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1308 | n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_FV, 6); |
||
1309 | if (n) { |
||
1310 | n[1].e = buffer; |
||
1311 | n[2].i = drawbuffer; |
||
1312 | n[3].f = value[0]; |
||
1313 | if (buffer == GL_COLOR) { |
||
1314 | n[4].f = value[1]; |
||
1315 | n[5].f = value[2]; |
||
1316 | n[6].f = value[3]; |
||
1317 | } |
||
1318 | else { |
||
1319 | n[4].f = 0.0F; |
||
1320 | n[5].f = 0.0F; |
||
1321 | n[6].f = 0.0F; |
||
1322 | } |
||
1323 | } |
||
1324 | if (ctx->ExecuteFlag) { |
||
1325 | /*CALL_ClearBufferuiv(ctx->Exec, (buffer, drawbuffer, value));*/ |
||
1326 | } |
||
1327 | } |
||
1328 | |||
1329 | |||
1330 | static void GLAPIENTRY |
||
1331 | save_ClearBufferfi(GLenum buffer, GLint drawbuffer, |
||
1332 | GLfloat depth, GLint stencil) |
||
1333 | { |
||
1334 | GET_CURRENT_CONTEXT(ctx); |
||
1335 | Node *n; |
||
1336 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1337 | n = alloc_instruction(ctx, OPCODE_CLEAR_BUFFER_FI, 4); |
||
1338 | if (n) { |
||
1339 | n[1].e = buffer; |
||
1340 | n[2].i = drawbuffer; |
||
1341 | n[3].f = depth; |
||
1342 | n[4].i = stencil; |
||
1343 | } |
||
1344 | if (ctx->ExecuteFlag) { |
||
1345 | /*CALL_ClearBufferfi(ctx->Exec, (buffer, drawbuffer, depth, stencil));*/ |
||
1346 | } |
||
1347 | } |
||
1348 | |||
1349 | |||
1350 | static void GLAPIENTRY |
||
1351 | save_ClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) |
||
1352 | { |
||
1353 | GET_CURRENT_CONTEXT(ctx); |
||
1354 | Node *n; |
||
1355 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1356 | n = alloc_instruction(ctx, OPCODE_CLEAR_ACCUM, 4); |
||
1357 | if (n) { |
||
1358 | n[1].f = red; |
||
1359 | n[2].f = green; |
||
1360 | n[3].f = blue; |
||
1361 | n[4].f = alpha; |
||
1362 | } |
||
1363 | if (ctx->ExecuteFlag) { |
||
1364 | CALL_ClearAccum(ctx->Exec, (red, green, blue, alpha)); |
||
1365 | } |
||
1366 | } |
||
1367 | |||
1368 | |||
1369 | static void GLAPIENTRY |
||
1370 | save_ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) |
||
1371 | { |
||
1372 | GET_CURRENT_CONTEXT(ctx); |
||
1373 | Node *n; |
||
1374 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1375 | n = alloc_instruction(ctx, OPCODE_CLEAR_COLOR, 4); |
||
1376 | if (n) { |
||
1377 | n[1].f = red; |
||
1378 | n[2].f = green; |
||
1379 | n[3].f = blue; |
||
1380 | n[4].f = alpha; |
||
1381 | } |
||
1382 | if (ctx->ExecuteFlag) { |
||
1383 | CALL_ClearColor(ctx->Exec, (red, green, blue, alpha)); |
||
1384 | } |
||
1385 | } |
||
1386 | |||
1387 | |||
1388 | static void GLAPIENTRY |
||
1389 | save_ClearDepth(GLclampd depth) |
||
1390 | { |
||
1391 | GET_CURRENT_CONTEXT(ctx); |
||
1392 | Node *n; |
||
1393 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1394 | n = alloc_instruction(ctx, OPCODE_CLEAR_DEPTH, 1); |
||
1395 | if (n) { |
||
1396 | n[1].f = (GLfloat) depth; |
||
1397 | } |
||
1398 | if (ctx->ExecuteFlag) { |
||
1399 | CALL_ClearDepth(ctx->Exec, (depth)); |
||
1400 | } |
||
1401 | } |
||
1402 | |||
1403 | |||
1404 | static void GLAPIENTRY |
||
1405 | save_ClearIndex(GLfloat c) |
||
1406 | { |
||
1407 | GET_CURRENT_CONTEXT(ctx); |
||
1408 | Node *n; |
||
1409 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1410 | n = alloc_instruction(ctx, OPCODE_CLEAR_INDEX, 1); |
||
1411 | if (n) { |
||
1412 | n[1].f = c; |
||
1413 | } |
||
1414 | if (ctx->ExecuteFlag) { |
||
1415 | CALL_ClearIndex(ctx->Exec, (c)); |
||
1416 | } |
||
1417 | } |
||
1418 | |||
1419 | |||
1420 | static void GLAPIENTRY |
||
1421 | save_ClearStencil(GLint s) |
||
1422 | { |
||
1423 | GET_CURRENT_CONTEXT(ctx); |
||
1424 | Node *n; |
||
1425 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1426 | n = alloc_instruction(ctx, OPCODE_CLEAR_STENCIL, 1); |
||
1427 | if (n) { |
||
1428 | n[1].i = s; |
||
1429 | } |
||
1430 | if (ctx->ExecuteFlag) { |
||
1431 | CALL_ClearStencil(ctx->Exec, (s)); |
||
1432 | } |
||
1433 | } |
||
1434 | |||
1435 | |||
1436 | static void GLAPIENTRY |
||
1437 | save_ClipPlane(GLenum plane, const GLdouble * equ) |
||
1438 | { |
||
1439 | GET_CURRENT_CONTEXT(ctx); |
||
1440 | Node *n; |
||
1441 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1442 | n = alloc_instruction(ctx, OPCODE_CLIP_PLANE, 5); |
||
1443 | if (n) { |
||
1444 | n[1].e = plane; |
||
1445 | n[2].f = (GLfloat) equ[0]; |
||
1446 | n[3].f = (GLfloat) equ[1]; |
||
1447 | n[4].f = (GLfloat) equ[2]; |
||
1448 | n[5].f = (GLfloat) equ[3]; |
||
1449 | } |
||
1450 | if (ctx->ExecuteFlag) { |
||
1451 | CALL_ClipPlane(ctx->Exec, (plane, equ)); |
||
1452 | } |
||
1453 | } |
||
1454 | |||
1455 | |||
1456 | |||
1457 | static void GLAPIENTRY |
||
1458 | save_ColorMask(GLboolean red, GLboolean green, |
||
1459 | GLboolean blue, GLboolean alpha) |
||
1460 | { |
||
1461 | GET_CURRENT_CONTEXT(ctx); |
||
1462 | Node *n; |
||
1463 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1464 | n = alloc_instruction(ctx, OPCODE_COLOR_MASK, 4); |
||
1465 | if (n) { |
||
1466 | n[1].b = red; |
||
1467 | n[2].b = green; |
||
1468 | n[3].b = blue; |
||
1469 | n[4].b = alpha; |
||
1470 | } |
||
1471 | if (ctx->ExecuteFlag) { |
||
1472 | CALL_ColorMask(ctx->Exec, (red, green, blue, alpha)); |
||
1473 | } |
||
1474 | } |
||
1475 | |||
1476 | |||
1477 | static void GLAPIENTRY |
||
1478 | save_ColorMaskIndexed(GLuint buf, GLboolean red, GLboolean green, |
||
1479 | GLboolean blue, GLboolean alpha) |
||
1480 | { |
||
1481 | GET_CURRENT_CONTEXT(ctx); |
||
1482 | Node *n; |
||
1483 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1484 | n = alloc_instruction(ctx, OPCODE_COLOR_MASK_INDEXED, 5); |
||
1485 | if (n) { |
||
1486 | n[1].ui = buf; |
||
1487 | n[2].b = red; |
||
1488 | n[3].b = green; |
||
1489 | n[4].b = blue; |
||
1490 | n[5].b = alpha; |
||
1491 | } |
||
1492 | if (ctx->ExecuteFlag) { |
||
1493 | /*CALL_ColorMaskIndexedEXT(ctx->Exec, (buf, red, green, blue, alpha));*/ |
||
1494 | } |
||
1495 | } |
||
1496 | |||
1497 | |||
1498 | static void GLAPIENTRY |
||
1499 | save_ColorMaterial(GLenum face, GLenum mode) |
||
1500 | { |
||
1501 | GET_CURRENT_CONTEXT(ctx); |
||
1502 | Node *n; |
||
1503 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1504 | |||
1505 | n = alloc_instruction(ctx, OPCODE_COLOR_MATERIAL, 2); |
||
1506 | if (n) { |
||
1507 | n[1].e = face; |
||
1508 | n[2].e = mode; |
||
1509 | } |
||
1510 | if (ctx->ExecuteFlag) { |
||
1511 | CALL_ColorMaterial(ctx->Exec, (face, mode)); |
||
1512 | } |
||
1513 | } |
||
1514 | |||
1515 | |||
1516 | static void GLAPIENTRY |
||
1517 | save_ColorTable(GLenum target, GLenum internalFormat, |
||
1518 | GLsizei width, GLenum format, GLenum type, |
||
1519 | const GLvoid * table) |
||
1520 | { |
||
1521 | GET_CURRENT_CONTEXT(ctx); |
||
1522 | if (_mesa_is_proxy_texture(target)) { |
||
1523 | /* execute immediately */ |
||
1524 | CALL_ColorTable(ctx->Exec, (target, internalFormat, width, |
||
1525 | format, type, table)); |
||
1526 | } |
||
1527 | else { |
||
1528 | Node *n; |
||
1529 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1530 | n = alloc_instruction(ctx, OPCODE_COLOR_TABLE, 6); |
||
1531 | if (n) { |
||
1532 | n[1].e = target; |
||
1533 | n[2].e = internalFormat; |
||
1534 | n[3].i = width; |
||
1535 | n[4].e = format; |
||
1536 | n[5].e = type; |
||
1537 | n[6].data = unpack_image(ctx, 1, width, 1, 1, format, type, table, |
||
1538 | &ctx->Unpack); |
||
1539 | } |
||
1540 | if (ctx->ExecuteFlag) { |
||
1541 | CALL_ColorTable(ctx->Exec, (target, internalFormat, width, |
||
1542 | format, type, table)); |
||
1543 | } |
||
1544 | } |
||
1545 | } |
||
1546 | |||
1547 | |||
1548 | |||
1549 | static void GLAPIENTRY |
||
1550 | save_ColorTableParameterfv(GLenum target, GLenum pname, |
||
1551 | const GLfloat *params) |
||
1552 | { |
||
1553 | GET_CURRENT_CONTEXT(ctx); |
||
1554 | Node *n; |
||
1555 | |||
1556 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1557 | |||
1558 | n = alloc_instruction(ctx, OPCODE_COLOR_TABLE_PARAMETER_FV, 6); |
||
1559 | if (n) { |
||
1560 | n[1].e = target; |
||
1561 | n[2].e = pname; |
||
1562 | n[3].f = params[0]; |
||
1563 | if (pname == GL_COLOR_TABLE_SGI || |
||
1564 | pname == GL_POST_CONVOLUTION_COLOR_TABLE_SGI || |
||
1565 | pname == GL_TEXTURE_COLOR_TABLE_SGI) { |
||
1566 | n[4].f = params[1]; |
||
1567 | n[5].f = params[2]; |
||
1568 | n[6].f = params[3]; |
||
1569 | } |
||
1570 | } |
||
1571 | |||
1572 | if (ctx->ExecuteFlag) { |
||
1573 | CALL_ColorTableParameterfv(ctx->Exec, (target, pname, params)); |
||
1574 | } |
||
1575 | } |
||
1576 | |||
1577 | |||
1578 | static void GLAPIENTRY |
||
1579 | save_ColorTableParameteriv(GLenum target, GLenum pname, const GLint *params) |
||
1580 | { |
||
1581 | GET_CURRENT_CONTEXT(ctx); |
||
1582 | Node *n; |
||
1583 | |||
1584 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1585 | |||
1586 | n = alloc_instruction(ctx, OPCODE_COLOR_TABLE_PARAMETER_IV, 6); |
||
1587 | if (n) { |
||
1588 | n[1].e = target; |
||
1589 | n[2].e = pname; |
||
1590 | n[3].i = params[0]; |
||
1591 | if (pname == GL_COLOR_TABLE_SGI || |
||
1592 | pname == GL_POST_CONVOLUTION_COLOR_TABLE_SGI || |
||
1593 | pname == GL_TEXTURE_COLOR_TABLE_SGI) { |
||
1594 | n[4].i = params[1]; |
||
1595 | n[5].i = params[2]; |
||
1596 | n[6].i = params[3]; |
||
1597 | } |
||
1598 | } |
||
1599 | |||
1600 | if (ctx->ExecuteFlag) { |
||
1601 | CALL_ColorTableParameteriv(ctx->Exec, (target, pname, params)); |
||
1602 | } |
||
1603 | } |
||
1604 | |||
1605 | |||
1606 | |||
1607 | static void GLAPIENTRY |
||
1608 | save_ColorSubTable(GLenum target, GLsizei start, GLsizei count, |
||
1609 | GLenum format, GLenum type, const GLvoid * table) |
||
1610 | { |
||
1611 | GET_CURRENT_CONTEXT(ctx); |
||
1612 | Node *n; |
||
1613 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1614 | n = alloc_instruction(ctx, OPCODE_COLOR_SUB_TABLE, 6); |
||
1615 | if (n) { |
||
1616 | n[1].e = target; |
||
1617 | n[2].i = start; |
||
1618 | n[3].i = count; |
||
1619 | n[4].e = format; |
||
1620 | n[5].e = type; |
||
1621 | n[6].data = unpack_image(ctx, 1, count, 1, 1, format, type, table, |
||
1622 | &ctx->Unpack); |
||
1623 | } |
||
1624 | if (ctx->ExecuteFlag) { |
||
1625 | CALL_ColorSubTable(ctx->Exec, |
||
1626 | (target, start, count, format, type, table)); |
||
1627 | } |
||
1628 | } |
||
1629 | |||
1630 | |||
1631 | static void GLAPIENTRY |
||
1632 | save_CopyColorSubTable(GLenum target, GLsizei start, |
||
1633 | GLint x, GLint y, GLsizei width) |
||
1634 | { |
||
1635 | GET_CURRENT_CONTEXT(ctx); |
||
1636 | Node *n; |
||
1637 | |||
1638 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1639 | n = alloc_instruction(ctx, OPCODE_COPY_COLOR_SUB_TABLE, 5); |
||
1640 | if (n) { |
||
1641 | n[1].e = target; |
||
1642 | n[2].i = start; |
||
1643 | n[3].i = x; |
||
1644 | n[4].i = y; |
||
1645 | n[5].i = width; |
||
1646 | } |
||
1647 | if (ctx->ExecuteFlag) { |
||
1648 | CALL_CopyColorSubTable(ctx->Exec, (target, start, x, y, width)); |
||
1649 | } |
||
1650 | } |
||
1651 | |||
1652 | |||
1653 | static void GLAPIENTRY |
||
1654 | save_CopyColorTable(GLenum target, GLenum internalformat, |
||
1655 | GLint x, GLint y, GLsizei width) |
||
1656 | { |
||
1657 | GET_CURRENT_CONTEXT(ctx); |
||
1658 | Node *n; |
||
1659 | |||
1660 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1661 | n = alloc_instruction(ctx, OPCODE_COPY_COLOR_TABLE, 5); |
||
1662 | if (n) { |
||
1663 | n[1].e = target; |
||
1664 | n[2].e = internalformat; |
||
1665 | n[3].i = x; |
||
1666 | n[4].i = y; |
||
1667 | n[5].i = width; |
||
1668 | } |
||
1669 | if (ctx->ExecuteFlag) { |
||
1670 | CALL_CopyColorTable(ctx->Exec, (target, internalformat, x, y, width)); |
||
1671 | } |
||
1672 | } |
||
1673 | |||
1674 | |||
1675 | static void GLAPIENTRY |
||
1676 | save_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width, |
||
1677 | GLenum format, GLenum type, const GLvoid * filter) |
||
1678 | { |
||
1679 | GET_CURRENT_CONTEXT(ctx); |
||
1680 | Node *n; |
||
1681 | |||
1682 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1683 | |||
1684 | n = alloc_instruction(ctx, OPCODE_CONVOLUTION_FILTER_1D, 6); |
||
1685 | if (n) { |
||
1686 | n[1].e = target; |
||
1687 | n[2].e = internalFormat; |
||
1688 | n[3].i = width; |
||
1689 | n[4].e = format; |
||
1690 | n[5].e = type; |
||
1691 | n[6].data = unpack_image(ctx, 1, width, 1, 1, format, type, filter, |
||
1692 | &ctx->Unpack); |
||
1693 | } |
||
1694 | if (ctx->ExecuteFlag) { |
||
1695 | CALL_ConvolutionFilter1D(ctx->Exec, (target, internalFormat, width, |
||
1696 | format, type, filter)); |
||
1697 | } |
||
1698 | } |
||
1699 | |||
1700 | |||
1701 | static void GLAPIENTRY |
||
1702 | save_ConvolutionFilter2D(GLenum target, GLenum internalFormat, |
||
1703 | GLsizei width, GLsizei height, GLenum format, |
||
1704 | GLenum type, const GLvoid * filter) |
||
1705 | { |
||
1706 | GET_CURRENT_CONTEXT(ctx); |
||
1707 | Node *n; |
||
1708 | |||
1709 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1710 | |||
1711 | n = alloc_instruction(ctx, OPCODE_CONVOLUTION_FILTER_2D, 7); |
||
1712 | if (n) { |
||
1713 | n[1].e = target; |
||
1714 | n[2].e = internalFormat; |
||
1715 | n[3].i = width; |
||
1716 | n[4].i = height; |
||
1717 | n[5].e = format; |
||
1718 | n[6].e = type; |
||
1719 | n[7].data = unpack_image(ctx, 2, width, height, 1, format, type, filter, |
||
1720 | &ctx->Unpack); |
||
1721 | } |
||
1722 | if (ctx->ExecuteFlag) { |
||
1723 | CALL_ConvolutionFilter2D(ctx->Exec, |
||
1724 | (target, internalFormat, width, height, format, |
||
1725 | type, filter)); |
||
1726 | } |
||
1727 | } |
||
1728 | |||
1729 | |||
1730 | static void GLAPIENTRY |
||
1731 | save_ConvolutionParameteri(GLenum target, GLenum pname, GLint param) |
||
1732 | { |
||
1733 | GET_CURRENT_CONTEXT(ctx); |
||
1734 | Node *n; |
||
1735 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1736 | n = alloc_instruction(ctx, OPCODE_CONVOLUTION_PARAMETER_I, 3); |
||
1737 | if (n) { |
||
1738 | n[1].e = target; |
||
1739 | n[2].e = pname; |
||
1740 | n[3].i = param; |
||
1741 | } |
||
1742 | if (ctx->ExecuteFlag) { |
||
1743 | CALL_ConvolutionParameteri(ctx->Exec, (target, pname, param)); |
||
1744 | } |
||
1745 | } |
||
1746 | |||
1747 | |||
1748 | static void GLAPIENTRY |
||
1749 | save_ConvolutionParameteriv(GLenum target, GLenum pname, const GLint *params) |
||
1750 | { |
||
1751 | GET_CURRENT_CONTEXT(ctx); |
||
1752 | Node *n; |
||
1753 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1754 | n = alloc_instruction(ctx, OPCODE_CONVOLUTION_PARAMETER_IV, 6); |
||
1755 | if (n) { |
||
1756 | n[1].e = target; |
||
1757 | n[2].e = pname; |
||
1758 | n[3].i = params[0]; |
||
1759 | if (pname == GL_CONVOLUTION_BORDER_COLOR || |
||
1760 | pname == GL_CONVOLUTION_FILTER_SCALE || |
||
1761 | pname == GL_CONVOLUTION_FILTER_BIAS) { |
||
1762 | n[4].i = params[1]; |
||
1763 | n[5].i = params[2]; |
||
1764 | n[6].i = params[3]; |
||
1765 | } |
||
1766 | else { |
||
1767 | n[4].i = n[5].i = n[6].i = 0; |
||
1768 | } |
||
1769 | } |
||
1770 | if (ctx->ExecuteFlag) { |
||
1771 | CALL_ConvolutionParameteriv(ctx->Exec, (target, pname, params)); |
||
1772 | } |
||
1773 | } |
||
1774 | |||
1775 | |||
1776 | static void GLAPIENTRY |
||
1777 | save_ConvolutionParameterf(GLenum target, GLenum pname, GLfloat param) |
||
1778 | { |
||
1779 | GET_CURRENT_CONTEXT(ctx); |
||
1780 | Node *n; |
||
1781 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1782 | n = alloc_instruction(ctx, OPCODE_CONVOLUTION_PARAMETER_F, 3); |
||
1783 | if (n) { |
||
1784 | n[1].e = target; |
||
1785 | n[2].e = pname; |
||
1786 | n[3].f = param; |
||
1787 | } |
||
1788 | if (ctx->ExecuteFlag) { |
||
1789 | CALL_ConvolutionParameterf(ctx->Exec, (target, pname, param)); |
||
1790 | } |
||
1791 | } |
||
1792 | |||
1793 | |||
1794 | static void GLAPIENTRY |
||
1795 | save_ConvolutionParameterfv(GLenum target, GLenum pname, |
||
1796 | const GLfloat *params) |
||
1797 | { |
||
1798 | GET_CURRENT_CONTEXT(ctx); |
||
1799 | Node *n; |
||
1800 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1801 | n = alloc_instruction(ctx, OPCODE_CONVOLUTION_PARAMETER_FV, 6); |
||
1802 | if (n) { |
||
1803 | n[1].e = target; |
||
1804 | n[2].e = pname; |
||
1805 | n[3].f = params[0]; |
||
1806 | if (pname == GL_CONVOLUTION_BORDER_COLOR || |
||
1807 | pname == GL_CONVOLUTION_FILTER_SCALE || |
||
1808 | pname == GL_CONVOLUTION_FILTER_BIAS) { |
||
1809 | n[4].f = params[1]; |
||
1810 | n[5].f = params[2]; |
||
1811 | n[6].f = params[3]; |
||
1812 | } |
||
1813 | else { |
||
1814 | n[4].f = n[5].f = n[6].f = 0.0F; |
||
1815 | } |
||
1816 | } |
||
1817 | if (ctx->ExecuteFlag) { |
||
1818 | CALL_ConvolutionParameterfv(ctx->Exec, (target, pname, params)); |
||
1819 | } |
||
1820 | } |
||
1821 | |||
1822 | |||
1823 | static void GLAPIENTRY |
||
1824 | save_CopyPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type) |
||
1825 | { |
||
1826 | GET_CURRENT_CONTEXT(ctx); |
||
1827 | Node *n; |
||
1828 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1829 | n = alloc_instruction(ctx, OPCODE_COPY_PIXELS, 5); |
||
1830 | if (n) { |
||
1831 | n[1].i = x; |
||
1832 | n[2].i = y; |
||
1833 | n[3].i = (GLint) width; |
||
1834 | n[4].i = (GLint) height; |
||
1835 | n[5].e = type; |
||
1836 | } |
||
1837 | if (ctx->ExecuteFlag) { |
||
1838 | CALL_CopyPixels(ctx->Exec, (x, y, width, height, type)); |
||
1839 | } |
||
1840 | } |
||
1841 | |||
1842 | |||
1843 | |||
1844 | static void GLAPIENTRY |
||
1845 | save_CopyTexImage1D(GLenum target, GLint level, GLenum internalformat, |
||
1846 | GLint x, GLint y, GLsizei width, GLint border) |
||
1847 | { |
||
1848 | GET_CURRENT_CONTEXT(ctx); |
||
1849 | Node *n; |
||
1850 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1851 | n = alloc_instruction(ctx, OPCODE_COPY_TEX_IMAGE1D, 7); |
||
1852 | if (n) { |
||
1853 | n[1].e = target; |
||
1854 | n[2].i = level; |
||
1855 | n[3].e = internalformat; |
||
1856 | n[4].i = x; |
||
1857 | n[5].i = y; |
||
1858 | n[6].i = width; |
||
1859 | n[7].i = border; |
||
1860 | } |
||
1861 | if (ctx->ExecuteFlag) { |
||
1862 | CALL_CopyTexImage1D(ctx->Exec, (target, level, internalformat, |
||
1863 | x, y, width, border)); |
||
1864 | } |
||
1865 | } |
||
1866 | |||
1867 | |||
1868 | static void GLAPIENTRY |
||
1869 | save_CopyTexImage2D(GLenum target, GLint level, |
||
1870 | GLenum internalformat, |
||
1871 | GLint x, GLint y, GLsizei width, |
||
1872 | GLsizei height, GLint border) |
||
1873 | { |
||
1874 | GET_CURRENT_CONTEXT(ctx); |
||
1875 | Node *n; |
||
1876 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1877 | n = alloc_instruction(ctx, OPCODE_COPY_TEX_IMAGE2D, 8); |
||
1878 | if (n) { |
||
1879 | n[1].e = target; |
||
1880 | n[2].i = level; |
||
1881 | n[3].e = internalformat; |
||
1882 | n[4].i = x; |
||
1883 | n[5].i = y; |
||
1884 | n[6].i = width; |
||
1885 | n[7].i = height; |
||
1886 | n[8].i = border; |
||
1887 | } |
||
1888 | if (ctx->ExecuteFlag) { |
||
1889 | CALL_CopyTexImage2D(ctx->Exec, (target, level, internalformat, |
||
1890 | x, y, width, height, border)); |
||
1891 | } |
||
1892 | } |
||
1893 | |||
1894 | |||
1895 | |||
1896 | static void GLAPIENTRY |
||
1897 | save_CopyTexSubImage1D(GLenum target, GLint level, |
||
1898 | GLint xoffset, GLint x, GLint y, GLsizei width) |
||
1899 | { |
||
1900 | GET_CURRENT_CONTEXT(ctx); |
||
1901 | Node *n; |
||
1902 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1903 | n = alloc_instruction(ctx, OPCODE_COPY_TEX_SUB_IMAGE1D, 6); |
||
1904 | if (n) { |
||
1905 | n[1].e = target; |
||
1906 | n[2].i = level; |
||
1907 | n[3].i = xoffset; |
||
1908 | n[4].i = x; |
||
1909 | n[5].i = y; |
||
1910 | n[6].i = width; |
||
1911 | } |
||
1912 | if (ctx->ExecuteFlag) { |
||
1913 | CALL_CopyTexSubImage1D(ctx->Exec, |
||
1914 | (target, level, xoffset, x, y, width)); |
||
1915 | } |
||
1916 | } |
||
1917 | |||
1918 | |||
1919 | static void GLAPIENTRY |
||
1920 | save_CopyTexSubImage2D(GLenum target, GLint level, |
||
1921 | GLint xoffset, GLint yoffset, |
||
1922 | GLint x, GLint y, GLsizei width, GLint height) |
||
1923 | { |
||
1924 | GET_CURRENT_CONTEXT(ctx); |
||
1925 | Node *n; |
||
1926 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1927 | n = alloc_instruction(ctx, OPCODE_COPY_TEX_SUB_IMAGE2D, 8); |
||
1928 | if (n) { |
||
1929 | n[1].e = target; |
||
1930 | n[2].i = level; |
||
1931 | n[3].i = xoffset; |
||
1932 | n[4].i = yoffset; |
||
1933 | n[5].i = x; |
||
1934 | n[6].i = y; |
||
1935 | n[7].i = width; |
||
1936 | n[8].i = height; |
||
1937 | } |
||
1938 | if (ctx->ExecuteFlag) { |
||
1939 | CALL_CopyTexSubImage2D(ctx->Exec, (target, level, xoffset, yoffset, |
||
1940 | x, y, width, height)); |
||
1941 | } |
||
1942 | } |
||
1943 | |||
1944 | |||
1945 | static void GLAPIENTRY |
||
1946 | save_CopyTexSubImage3D(GLenum target, GLint level, |
||
1947 | GLint xoffset, GLint yoffset, GLint zoffset, |
||
1948 | GLint x, GLint y, GLsizei width, GLint height) |
||
1949 | { |
||
1950 | GET_CURRENT_CONTEXT(ctx); |
||
1951 | Node *n; |
||
1952 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1953 | n = alloc_instruction(ctx, OPCODE_COPY_TEX_SUB_IMAGE3D, 9); |
||
1954 | if (n) { |
||
1955 | n[1].e = target; |
||
1956 | n[2].i = level; |
||
1957 | n[3].i = xoffset; |
||
1958 | n[4].i = yoffset; |
||
1959 | n[5].i = zoffset; |
||
1960 | n[6].i = x; |
||
1961 | n[7].i = y; |
||
1962 | n[8].i = width; |
||
1963 | n[9].i = height; |
||
1964 | } |
||
1965 | if (ctx->ExecuteFlag) { |
||
1966 | CALL_CopyTexSubImage3D(ctx->Exec, (target, level, |
||
1967 | xoffset, yoffset, zoffset, |
||
1968 | x, y, width, height)); |
||
1969 | } |
||
1970 | } |
||
1971 | |||
1972 | |||
1973 | static void GLAPIENTRY |
||
1974 | save_CullFace(GLenum mode) |
||
1975 | { |
||
1976 | GET_CURRENT_CONTEXT(ctx); |
||
1977 | Node *n; |
||
1978 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1979 | n = alloc_instruction(ctx, OPCODE_CULL_FACE, 1); |
||
1980 | if (n) { |
||
1981 | n[1].e = mode; |
||
1982 | } |
||
1983 | if (ctx->ExecuteFlag) { |
||
1984 | CALL_CullFace(ctx->Exec, (mode)); |
||
1985 | } |
||
1986 | } |
||
1987 | |||
1988 | |||
1989 | static void GLAPIENTRY |
||
1990 | save_DepthFunc(GLenum func) |
||
1991 | { |
||
1992 | GET_CURRENT_CONTEXT(ctx); |
||
1993 | Node *n; |
||
1994 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
1995 | n = alloc_instruction(ctx, OPCODE_DEPTH_FUNC, 1); |
||
1996 | if (n) { |
||
1997 | n[1].e = func; |
||
1998 | } |
||
1999 | if (ctx->ExecuteFlag) { |
||
2000 | CALL_DepthFunc(ctx->Exec, (func)); |
||
2001 | } |
||
2002 | } |
||
2003 | |||
2004 | |||
2005 | static void GLAPIENTRY |
||
2006 | save_DepthMask(GLboolean mask) |
||
2007 | { |
||
2008 | GET_CURRENT_CONTEXT(ctx); |
||
2009 | Node *n; |
||
2010 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2011 | n = alloc_instruction(ctx, OPCODE_DEPTH_MASK, 1); |
||
2012 | if (n) { |
||
2013 | n[1].b = mask; |
||
2014 | } |
||
2015 | if (ctx->ExecuteFlag) { |
||
2016 | CALL_DepthMask(ctx->Exec, (mask)); |
||
2017 | } |
||
2018 | } |
||
2019 | |||
2020 | |||
2021 | static void GLAPIENTRY |
||
2022 | save_DepthRange(GLclampd nearval, GLclampd farval) |
||
2023 | { |
||
2024 | GET_CURRENT_CONTEXT(ctx); |
||
2025 | Node *n; |
||
2026 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2027 | n = alloc_instruction(ctx, OPCODE_DEPTH_RANGE, 2); |
||
2028 | if (n) { |
||
2029 | n[1].f = (GLfloat) nearval; |
||
2030 | n[2].f = (GLfloat) farval; |
||
2031 | } |
||
2032 | if (ctx->ExecuteFlag) { |
||
2033 | CALL_DepthRange(ctx->Exec, (nearval, farval)); |
||
2034 | } |
||
2035 | } |
||
2036 | |||
2037 | |||
2038 | static void GLAPIENTRY |
||
2039 | save_Disable(GLenum cap) |
||
2040 | { |
||
2041 | GET_CURRENT_CONTEXT(ctx); |
||
2042 | Node *n; |
||
2043 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2044 | n = alloc_instruction(ctx, OPCODE_DISABLE, 1); |
||
2045 | if (n) { |
||
2046 | n[1].e = cap; |
||
2047 | } |
||
2048 | if (ctx->ExecuteFlag) { |
||
2049 | CALL_Disable(ctx->Exec, (cap)); |
||
2050 | } |
||
2051 | } |
||
2052 | |||
2053 | |||
2054 | static void GLAPIENTRY |
||
2055 | save_DisableIndexed(GLuint index, GLenum cap) |
||
2056 | { |
||
2057 | GET_CURRENT_CONTEXT(ctx); |
||
2058 | Node *n; |
||
2059 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2060 | n = alloc_instruction(ctx, OPCODE_DISABLE_INDEXED, 2); |
||
2061 | if (n) { |
||
2062 | n[1].ui = index; |
||
2063 | n[2].e = cap; |
||
2064 | } |
||
2065 | if (ctx->ExecuteFlag) { |
||
2066 | CALL_DisableIndexedEXT(ctx->Exec, (index, cap)); |
||
2067 | } |
||
2068 | } |
||
2069 | |||
2070 | |||
2071 | static void GLAPIENTRY |
||
2072 | save_DrawBuffer(GLenum mode) |
||
2073 | { |
||
2074 | GET_CURRENT_CONTEXT(ctx); |
||
2075 | Node *n; |
||
2076 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2077 | n = alloc_instruction(ctx, OPCODE_DRAW_BUFFER, 1); |
||
2078 | if (n) { |
||
2079 | n[1].e = mode; |
||
2080 | } |
||
2081 | if (ctx->ExecuteFlag) { |
||
2082 | CALL_DrawBuffer(ctx->Exec, (mode)); |
||
2083 | } |
||
2084 | } |
||
2085 | |||
2086 | |||
2087 | static void GLAPIENTRY |
||
2088 | save_DrawPixels(GLsizei width, GLsizei height, |
||
2089 | GLenum format, GLenum type, const GLvoid * pixels) |
||
2090 | { |
||
2091 | GET_CURRENT_CONTEXT(ctx); |
||
2092 | Node *n; |
||
2093 | |||
2094 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2095 | |||
2096 | n = alloc_instruction(ctx, OPCODE_DRAW_PIXELS, 5); |
||
2097 | if (n) { |
||
2098 | n[1].i = width; |
||
2099 | n[2].i = height; |
||
2100 | n[3].e = format; |
||
2101 | n[4].e = type; |
||
2102 | n[5].data = unpack_image(ctx, 2, width, height, 1, format, type, |
||
2103 | pixels, &ctx->Unpack); |
||
2104 | } |
||
2105 | if (ctx->ExecuteFlag) { |
||
2106 | CALL_DrawPixels(ctx->Exec, (width, height, format, type, pixels)); |
||
2107 | } |
||
2108 | } |
||
2109 | |||
2110 | |||
2111 | |||
2112 | static void GLAPIENTRY |
||
2113 | save_Enable(GLenum cap) |
||
2114 | { |
||
2115 | GET_CURRENT_CONTEXT(ctx); |
||
2116 | Node *n; |
||
2117 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2118 | n = alloc_instruction(ctx, OPCODE_ENABLE, 1); |
||
2119 | if (n) { |
||
2120 | n[1].e = cap; |
||
2121 | } |
||
2122 | if (ctx->ExecuteFlag) { |
||
2123 | CALL_Enable(ctx->Exec, (cap)); |
||
2124 | } |
||
2125 | } |
||
2126 | |||
2127 | |||
2128 | |||
2129 | static void GLAPIENTRY |
||
2130 | save_EnableIndexed(GLuint index, GLenum cap) |
||
2131 | { |
||
2132 | GET_CURRENT_CONTEXT(ctx); |
||
2133 | Node *n; |
||
2134 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2135 | n = alloc_instruction(ctx, OPCODE_ENABLE_INDEXED, 2); |
||
2136 | if (n) { |
||
2137 | n[1].ui = index; |
||
2138 | n[2].e = cap; |
||
2139 | } |
||
2140 | if (ctx->ExecuteFlag) { |
||
2141 | CALL_EnableIndexedEXT(ctx->Exec, (index, cap)); |
||
2142 | } |
||
2143 | } |
||
2144 | |||
2145 | |||
2146 | |||
2147 | static void GLAPIENTRY |
||
2148 | save_EvalMesh1(GLenum mode, GLint i1, GLint i2) |
||
2149 | { |
||
2150 | GET_CURRENT_CONTEXT(ctx); |
||
2151 | Node *n; |
||
2152 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2153 | n = alloc_instruction(ctx, OPCODE_EVALMESH1, 3); |
||
2154 | if (n) { |
||
2155 | n[1].e = mode; |
||
2156 | n[2].i = i1; |
||
2157 | n[3].i = i2; |
||
2158 | } |
||
2159 | if (ctx->ExecuteFlag) { |
||
2160 | CALL_EvalMesh1(ctx->Exec, (mode, i1, i2)); |
||
2161 | } |
||
2162 | } |
||
2163 | |||
2164 | |||
2165 | static void GLAPIENTRY |
||
2166 | save_EvalMesh2(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2) |
||
2167 | { |
||
2168 | GET_CURRENT_CONTEXT(ctx); |
||
2169 | Node *n; |
||
2170 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2171 | n = alloc_instruction(ctx, OPCODE_EVALMESH2, 5); |
||
2172 | if (n) { |
||
2173 | n[1].e = mode; |
||
2174 | n[2].i = i1; |
||
2175 | n[3].i = i2; |
||
2176 | n[4].i = j1; |
||
2177 | n[5].i = j2; |
||
2178 | } |
||
2179 | if (ctx->ExecuteFlag) { |
||
2180 | CALL_EvalMesh2(ctx->Exec, (mode, i1, i2, j1, j2)); |
||
2181 | } |
||
2182 | } |
||
2183 | |||
2184 | |||
2185 | |||
2186 | |||
2187 | static void GLAPIENTRY |
||
2188 | save_Fogfv(GLenum pname, const GLfloat *params) |
||
2189 | { |
||
2190 | GET_CURRENT_CONTEXT(ctx); |
||
2191 | Node *n; |
||
2192 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2193 | n = alloc_instruction(ctx, OPCODE_FOG, 5); |
||
2194 | if (n) { |
||
2195 | n[1].e = pname; |
||
2196 | n[2].f = params[0]; |
||
2197 | n[3].f = params[1]; |
||
2198 | n[4].f = params[2]; |
||
2199 | n[5].f = params[3]; |
||
2200 | } |
||
2201 | if (ctx->ExecuteFlag) { |
||
2202 | CALL_Fogfv(ctx->Exec, (pname, params)); |
||
2203 | } |
||
2204 | } |
||
2205 | |||
2206 | |||
2207 | static void GLAPIENTRY |
||
2208 | save_Fogf(GLenum pname, GLfloat param) |
||
2209 | { |
||
2210 | GLfloat parray[4]; |
||
2211 | parray[0] = param; |
||
2212 | parray[1] = parray[2] = parray[3] = 0.0F; |
||
2213 | save_Fogfv(pname, parray); |
||
2214 | } |
||
2215 | |||
2216 | |||
2217 | static void GLAPIENTRY |
||
2218 | save_Fogiv(GLenum pname, const GLint *params) |
||
2219 | { |
||
2220 | GLfloat p[4]; |
||
2221 | switch (pname) { |
||
2222 | case GL_FOG_MODE: |
||
2223 | case GL_FOG_DENSITY: |
||
2224 | case GL_FOG_START: |
||
2225 | case GL_FOG_END: |
||
2226 | case GL_FOG_INDEX: |
||
2227 | p[0] = (GLfloat) *params; |
||
2228 | p[1] = 0.0f; |
||
2229 | p[2] = 0.0f; |
||
2230 | p[3] = 0.0f; |
||
2231 | break; |
||
2232 | case GL_FOG_COLOR: |
||
2233 | p[0] = INT_TO_FLOAT(params[0]); |
||
2234 | p[1] = INT_TO_FLOAT(params[1]); |
||
2235 | p[2] = INT_TO_FLOAT(params[2]); |
||
2236 | p[3] = INT_TO_FLOAT(params[3]); |
||
2237 | break; |
||
2238 | default: |
||
2239 | /* Error will be caught later in gl_Fogfv */ |
||
2240 | ASSIGN_4V(p, 0.0F, 0.0F, 0.0F, 0.0F); |
||
2241 | } |
||
2242 | save_Fogfv(pname, p); |
||
2243 | } |
||
2244 | |||
2245 | |||
2246 | static void GLAPIENTRY |
||
2247 | save_Fogi(GLenum pname, GLint param) |
||
2248 | { |
||
2249 | GLint parray[4]; |
||
2250 | parray[0] = param; |
||
2251 | parray[1] = parray[2] = parray[3] = 0; |
||
2252 | save_Fogiv(pname, parray); |
||
2253 | } |
||
2254 | |||
2255 | |||
2256 | static void GLAPIENTRY |
||
2257 | save_FrontFace(GLenum mode) |
||
2258 | { |
||
2259 | GET_CURRENT_CONTEXT(ctx); |
||
2260 | Node *n; |
||
2261 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2262 | n = alloc_instruction(ctx, OPCODE_FRONT_FACE, 1); |
||
2263 | if (n) { |
||
2264 | n[1].e = mode; |
||
2265 | } |
||
2266 | if (ctx->ExecuteFlag) { |
||
2267 | CALL_FrontFace(ctx->Exec, (mode)); |
||
2268 | } |
||
2269 | } |
||
2270 | |||
2271 | |||
2272 | static void GLAPIENTRY |
||
2273 | save_Frustum(GLdouble left, GLdouble right, |
||
2274 | GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval) |
||
2275 | { |
||
2276 | GET_CURRENT_CONTEXT(ctx); |
||
2277 | Node *n; |
||
2278 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2279 | n = alloc_instruction(ctx, OPCODE_FRUSTUM, 6); |
||
2280 | if (n) { |
||
2281 | n[1].f = (GLfloat) left; |
||
2282 | n[2].f = (GLfloat) right; |
||
2283 | n[3].f = (GLfloat) bottom; |
||
2284 | n[4].f = (GLfloat) top; |
||
2285 | n[5].f = (GLfloat) nearval; |
||
2286 | n[6].f = (GLfloat) farval; |
||
2287 | } |
||
2288 | if (ctx->ExecuteFlag) { |
||
2289 | CALL_Frustum(ctx->Exec, (left, right, bottom, top, nearval, farval)); |
||
2290 | } |
||
2291 | } |
||
2292 | |||
2293 | |||
2294 | static void GLAPIENTRY |
||
2295 | save_Hint(GLenum target, GLenum mode) |
||
2296 | { |
||
2297 | GET_CURRENT_CONTEXT(ctx); |
||
2298 | Node *n; |
||
2299 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2300 | n = alloc_instruction(ctx, OPCODE_HINT, 2); |
||
2301 | if (n) { |
||
2302 | n[1].e = target; |
||
2303 | n[2].e = mode; |
||
2304 | } |
||
2305 | if (ctx->ExecuteFlag) { |
||
2306 | CALL_Hint(ctx->Exec, (target, mode)); |
||
2307 | } |
||
2308 | } |
||
2309 | |||
2310 | |||
2311 | static void GLAPIENTRY |
||
2312 | save_Histogram(GLenum target, GLsizei width, GLenum internalFormat, |
||
2313 | GLboolean sink) |
||
2314 | { |
||
2315 | GET_CURRENT_CONTEXT(ctx); |
||
2316 | Node *n; |
||
2317 | |||
2318 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2319 | n = alloc_instruction(ctx, OPCODE_HISTOGRAM, 4); |
||
2320 | if (n) { |
||
2321 | n[1].e = target; |
||
2322 | n[2].i = width; |
||
2323 | n[3].e = internalFormat; |
||
2324 | n[4].b = sink; |
||
2325 | } |
||
2326 | if (ctx->ExecuteFlag) { |
||
2327 | CALL_Histogram(ctx->Exec, (target, width, internalFormat, sink)); |
||
2328 | } |
||
2329 | } |
||
2330 | |||
2331 | |||
2332 | static void GLAPIENTRY |
||
2333 | save_IndexMask(GLuint mask) |
||
2334 | { |
||
2335 | GET_CURRENT_CONTEXT(ctx); |
||
2336 | Node *n; |
||
2337 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2338 | n = alloc_instruction(ctx, OPCODE_INDEX_MASK, 1); |
||
2339 | if (n) { |
||
2340 | n[1].ui = mask; |
||
2341 | } |
||
2342 | if (ctx->ExecuteFlag) { |
||
2343 | CALL_IndexMask(ctx->Exec, (mask)); |
||
2344 | } |
||
2345 | } |
||
2346 | |||
2347 | |||
2348 | static void GLAPIENTRY |
||
2349 | save_InitNames(void) |
||
2350 | { |
||
2351 | GET_CURRENT_CONTEXT(ctx); |
||
2352 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2353 | (void) alloc_instruction(ctx, OPCODE_INIT_NAMES, 0); |
||
2354 | if (ctx->ExecuteFlag) { |
||
2355 | CALL_InitNames(ctx->Exec, ()); |
||
2356 | } |
||
2357 | } |
||
2358 | |||
2359 | |||
2360 | static void GLAPIENTRY |
||
2361 | save_Lightfv(GLenum light, GLenum pname, const GLfloat *params) |
||
2362 | { |
||
2363 | GET_CURRENT_CONTEXT(ctx); |
||
2364 | Node *n; |
||
2365 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2366 | n = alloc_instruction(ctx, OPCODE_LIGHT, 6); |
||
2367 | if (n) { |
||
2368 | GLint i, nParams; |
||
2369 | n[1].e = light; |
||
2370 | n[2].e = pname; |
||
2371 | switch (pname) { |
||
2372 | case GL_AMBIENT: |
||
2373 | nParams = 4; |
||
2374 | break; |
||
2375 | case GL_DIFFUSE: |
||
2376 | nParams = 4; |
||
2377 | break; |
||
2378 | case GL_SPECULAR: |
||
2379 | nParams = 4; |
||
2380 | break; |
||
2381 | case GL_POSITION: |
||
2382 | nParams = 4; |
||
2383 | break; |
||
2384 | case GL_SPOT_DIRECTION: |
||
2385 | nParams = 3; |
||
2386 | break; |
||
2387 | case GL_SPOT_EXPONENT: |
||
2388 | nParams = 1; |
||
2389 | break; |
||
2390 | case GL_SPOT_CUTOFF: |
||
2391 | nParams = 1; |
||
2392 | break; |
||
2393 | case GL_CONSTANT_ATTENUATION: |
||
2394 | nParams = 1; |
||
2395 | break; |
||
2396 | case GL_LINEAR_ATTENUATION: |
||
2397 | nParams = 1; |
||
2398 | break; |
||
2399 | case GL_QUADRATIC_ATTENUATION: |
||
2400 | nParams = 1; |
||
2401 | break; |
||
2402 | default: |
||
2403 | nParams = 0; |
||
2404 | } |
||
2405 | for (i = 0; i < nParams; i++) { |
||
2406 | n[3 + i].f = params[i]; |
||
2407 | } |
||
2408 | } |
||
2409 | if (ctx->ExecuteFlag) { |
||
2410 | CALL_Lightfv(ctx->Exec, (light, pname, params)); |
||
2411 | } |
||
2412 | } |
||
2413 | |||
2414 | |||
2415 | static void GLAPIENTRY |
||
2416 | save_Lightf(GLenum light, GLenum pname, GLfloat param) |
||
2417 | { |
||
2418 | GLfloat parray[4]; |
||
2419 | parray[0] = param; |
||
2420 | parray[1] = parray[2] = parray[3] = 0.0F; |
||
2421 | save_Lightfv(light, pname, parray); |
||
2422 | } |
||
2423 | |||
2424 | |||
2425 | static void GLAPIENTRY |
||
2426 | save_Lightiv(GLenum light, GLenum pname, const GLint *params) |
||
2427 | { |
||
2428 | GLfloat fparam[4]; |
||
2429 | switch (pname) { |
||
2430 | case GL_AMBIENT: |
||
2431 | case GL_DIFFUSE: |
||
2432 | case GL_SPECULAR: |
||
2433 | fparam[0] = INT_TO_FLOAT(params[0]); |
||
2434 | fparam[1] = INT_TO_FLOAT(params[1]); |
||
2435 | fparam[2] = INT_TO_FLOAT(params[2]); |
||
2436 | fparam[3] = INT_TO_FLOAT(params[3]); |
||
2437 | break; |
||
2438 | case GL_POSITION: |
||
2439 | fparam[0] = (GLfloat) params[0]; |
||
2440 | fparam[1] = (GLfloat) params[1]; |
||
2441 | fparam[2] = (GLfloat) params[2]; |
||
2442 | fparam[3] = (GLfloat) params[3]; |
||
2443 | break; |
||
2444 | case GL_SPOT_DIRECTION: |
||
2445 | fparam[0] = (GLfloat) params[0]; |
||
2446 | fparam[1] = (GLfloat) params[1]; |
||
2447 | fparam[2] = (GLfloat) params[2]; |
||
2448 | break; |
||
2449 | case GL_SPOT_EXPONENT: |
||
2450 | case GL_SPOT_CUTOFF: |
||
2451 | case GL_CONSTANT_ATTENUATION: |
||
2452 | case GL_LINEAR_ATTENUATION: |
||
2453 | case GL_QUADRATIC_ATTENUATION: |
||
2454 | fparam[0] = (GLfloat) params[0]; |
||
2455 | break; |
||
2456 | default: |
||
2457 | /* error will be caught later in gl_Lightfv */ |
||
2458 | ; |
||
2459 | } |
||
2460 | save_Lightfv(light, pname, fparam); |
||
2461 | } |
||
2462 | |||
2463 | |||
2464 | static void GLAPIENTRY |
||
2465 | save_Lighti(GLenum light, GLenum pname, GLint param) |
||
2466 | { |
||
2467 | GLint parray[4]; |
||
2468 | parray[0] = param; |
||
2469 | parray[1] = parray[2] = parray[3] = 0; |
||
2470 | save_Lightiv(light, pname, parray); |
||
2471 | } |
||
2472 | |||
2473 | |||
2474 | static void GLAPIENTRY |
||
2475 | save_LightModelfv(GLenum pname, const GLfloat *params) |
||
2476 | { |
||
2477 | GET_CURRENT_CONTEXT(ctx); |
||
2478 | Node *n; |
||
2479 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2480 | n = alloc_instruction(ctx, OPCODE_LIGHT_MODEL, 5); |
||
2481 | if (n) { |
||
2482 | n[1].e = pname; |
||
2483 | n[2].f = params[0]; |
||
2484 | n[3].f = params[1]; |
||
2485 | n[4].f = params[2]; |
||
2486 | n[5].f = params[3]; |
||
2487 | } |
||
2488 | if (ctx->ExecuteFlag) { |
||
2489 | CALL_LightModelfv(ctx->Exec, (pname, params)); |
||
2490 | } |
||
2491 | } |
||
2492 | |||
2493 | |||
2494 | static void GLAPIENTRY |
||
2495 | save_LightModelf(GLenum pname, GLfloat param) |
||
2496 | { |
||
2497 | GLfloat parray[4]; |
||
2498 | parray[0] = param; |
||
2499 | parray[1] = parray[2] = parray[3] = 0.0F; |
||
2500 | save_LightModelfv(pname, parray); |
||
2501 | } |
||
2502 | |||
2503 | |||
2504 | static void GLAPIENTRY |
||
2505 | save_LightModeliv(GLenum pname, const GLint *params) |
||
2506 | { |
||
2507 | GLfloat fparam[4]; |
||
2508 | switch (pname) { |
||
2509 | case GL_LIGHT_MODEL_AMBIENT: |
||
2510 | fparam[0] = INT_TO_FLOAT(params[0]); |
||
2511 | fparam[1] = INT_TO_FLOAT(params[1]); |
||
2512 | fparam[2] = INT_TO_FLOAT(params[2]); |
||
2513 | fparam[3] = INT_TO_FLOAT(params[3]); |
||
2514 | break; |
||
2515 | case GL_LIGHT_MODEL_LOCAL_VIEWER: |
||
2516 | case GL_LIGHT_MODEL_TWO_SIDE: |
||
2517 | case GL_LIGHT_MODEL_COLOR_CONTROL: |
||
2518 | fparam[0] = (GLfloat) params[0]; |
||
2519 | fparam[1] = 0.0F; |
||
2520 | fparam[2] = 0.0F; |
||
2521 | fparam[3] = 0.0F; |
||
2522 | break; |
||
2523 | default: |
||
2524 | /* Error will be caught later in gl_LightModelfv */ |
||
2525 | ASSIGN_4V(fparam, 0.0F, 0.0F, 0.0F, 0.0F); |
||
2526 | } |
||
2527 | save_LightModelfv(pname, fparam); |
||
2528 | } |
||
2529 | |||
2530 | |||
2531 | static void GLAPIENTRY |
||
2532 | save_LightModeli(GLenum pname, GLint param) |
||
2533 | { |
||
2534 | GLint parray[4]; |
||
2535 | parray[0] = param; |
||
2536 | parray[1] = parray[2] = parray[3] = 0; |
||
2537 | save_LightModeliv(pname, parray); |
||
2538 | } |
||
2539 | |||
2540 | |||
2541 | static void GLAPIENTRY |
||
2542 | save_LineStipple(GLint factor, GLushort pattern) |
||
2543 | { |
||
2544 | GET_CURRENT_CONTEXT(ctx); |
||
2545 | Node *n; |
||
2546 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2547 | n = alloc_instruction(ctx, OPCODE_LINE_STIPPLE, 2); |
||
2548 | if (n) { |
||
2549 | n[1].i = factor; |
||
2550 | n[2].us = pattern; |
||
2551 | } |
||
2552 | if (ctx->ExecuteFlag) { |
||
2553 | CALL_LineStipple(ctx->Exec, (factor, pattern)); |
||
2554 | } |
||
2555 | } |
||
2556 | |||
2557 | |||
2558 | static void GLAPIENTRY |
||
2559 | save_LineWidth(GLfloat width) |
||
2560 | { |
||
2561 | GET_CURRENT_CONTEXT(ctx); |
||
2562 | Node *n; |
||
2563 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2564 | n = alloc_instruction(ctx, OPCODE_LINE_WIDTH, 1); |
||
2565 | if (n) { |
||
2566 | n[1].f = width; |
||
2567 | } |
||
2568 | if (ctx->ExecuteFlag) { |
||
2569 | CALL_LineWidth(ctx->Exec, (width)); |
||
2570 | } |
||
2571 | } |
||
2572 | |||
2573 | |||
2574 | static void GLAPIENTRY |
||
2575 | save_ListBase(GLuint base) |
||
2576 | { |
||
2577 | GET_CURRENT_CONTEXT(ctx); |
||
2578 | Node *n; |
||
2579 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2580 | n = alloc_instruction(ctx, OPCODE_LIST_BASE, 1); |
||
2581 | if (n) { |
||
2582 | n[1].ui = base; |
||
2583 | } |
||
2584 | if (ctx->ExecuteFlag) { |
||
2585 | CALL_ListBase(ctx->Exec, (base)); |
||
2586 | } |
||
2587 | } |
||
2588 | |||
2589 | |||
2590 | static void GLAPIENTRY |
||
2591 | save_LoadIdentity(void) |
||
2592 | { |
||
2593 | GET_CURRENT_CONTEXT(ctx); |
||
2594 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2595 | (void) alloc_instruction(ctx, OPCODE_LOAD_IDENTITY, 0); |
||
2596 | if (ctx->ExecuteFlag) { |
||
2597 | CALL_LoadIdentity(ctx->Exec, ()); |
||
2598 | } |
||
2599 | } |
||
2600 | |||
2601 | |||
2602 | static void GLAPIENTRY |
||
2603 | save_LoadMatrixf(const GLfloat * m) |
||
2604 | { |
||
2605 | GET_CURRENT_CONTEXT(ctx); |
||
2606 | Node *n; |
||
2607 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2608 | n = alloc_instruction(ctx, OPCODE_LOAD_MATRIX, 16); |
||
2609 | if (n) { |
||
2610 | GLuint i; |
||
2611 | for (i = 0; i < 16; i++) { |
||
2612 | n[1 + i].f = m[i]; |
||
2613 | } |
||
2614 | } |
||
2615 | if (ctx->ExecuteFlag) { |
||
2616 | CALL_LoadMatrixf(ctx->Exec, (m)); |
||
2617 | } |
||
2618 | } |
||
2619 | |||
2620 | |||
2621 | static void GLAPIENTRY |
||
2622 | save_LoadMatrixd(const GLdouble * m) |
||
2623 | { |
||
2624 | GLfloat f[16]; |
||
2625 | GLint i; |
||
2626 | for (i = 0; i < 16; i++) { |
||
2627 | f[i] = (GLfloat) m[i]; |
||
2628 | } |
||
2629 | save_LoadMatrixf(f); |
||
2630 | } |
||
2631 | |||
2632 | |||
2633 | static void GLAPIENTRY |
||
2634 | save_LoadName(GLuint name) |
||
2635 | { |
||
2636 | GET_CURRENT_CONTEXT(ctx); |
||
2637 | Node *n; |
||
2638 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2639 | n = alloc_instruction(ctx, OPCODE_LOAD_NAME, 1); |
||
2640 | if (n) { |
||
2641 | n[1].ui = name; |
||
2642 | } |
||
2643 | if (ctx->ExecuteFlag) { |
||
2644 | CALL_LoadName(ctx->Exec, (name)); |
||
2645 | } |
||
2646 | } |
||
2647 | |||
2648 | |||
2649 | static void GLAPIENTRY |
||
2650 | save_LogicOp(GLenum opcode) |
||
2651 | { |
||
2652 | GET_CURRENT_CONTEXT(ctx); |
||
2653 | Node *n; |
||
2654 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2655 | n = alloc_instruction(ctx, OPCODE_LOGIC_OP, 1); |
||
2656 | if (n) { |
||
2657 | n[1].e = opcode; |
||
2658 | } |
||
2659 | if (ctx->ExecuteFlag) { |
||
2660 | CALL_LogicOp(ctx->Exec, (opcode)); |
||
2661 | } |
||
2662 | } |
||
2663 | |||
2664 | |||
2665 | static void GLAPIENTRY |
||
2666 | save_Map1d(GLenum target, GLdouble u1, GLdouble u2, GLint stride, |
||
2667 | GLint order, const GLdouble * points) |
||
2668 | { |
||
2669 | GET_CURRENT_CONTEXT(ctx); |
||
2670 | Node *n; |
||
2671 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2672 | n = alloc_instruction(ctx, OPCODE_MAP1, 6); |
||
2673 | if (n) { |
||
2674 | GLfloat *pnts = _mesa_copy_map_points1d(target, stride, order, points); |
||
2675 | n[1].e = target; |
||
2676 | n[2].f = (GLfloat) u1; |
||
2677 | n[3].f = (GLfloat) u2; |
||
2678 | n[4].i = _mesa_evaluator_components(target); /* stride */ |
||
2679 | n[5].i = order; |
||
2680 | n[6].data = (void *) pnts; |
||
2681 | } |
||
2682 | if (ctx->ExecuteFlag) { |
||
2683 | CALL_Map1d(ctx->Exec, (target, u1, u2, stride, order, points)); |
||
2684 | } |
||
2685 | } |
||
2686 | |||
2687 | static void GLAPIENTRY |
||
2688 | save_Map1f(GLenum target, GLfloat u1, GLfloat u2, GLint stride, |
||
2689 | GLint order, const GLfloat * points) |
||
2690 | { |
||
2691 | GET_CURRENT_CONTEXT(ctx); |
||
2692 | Node *n; |
||
2693 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2694 | n = alloc_instruction(ctx, OPCODE_MAP1, 6); |
||
2695 | if (n) { |
||
2696 | GLfloat *pnts = _mesa_copy_map_points1f(target, stride, order, points); |
||
2697 | n[1].e = target; |
||
2698 | n[2].f = u1; |
||
2699 | n[3].f = u2; |
||
2700 | n[4].i = _mesa_evaluator_components(target); /* stride */ |
||
2701 | n[5].i = order; |
||
2702 | n[6].data = (void *) pnts; |
||
2703 | } |
||
2704 | if (ctx->ExecuteFlag) { |
||
2705 | CALL_Map1f(ctx->Exec, (target, u1, u2, stride, order, points)); |
||
2706 | } |
||
2707 | } |
||
2708 | |||
2709 | |||
2710 | static void GLAPIENTRY |
||
2711 | save_Map2d(GLenum target, |
||
2712 | GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, |
||
2713 | GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, |
||
2714 | const GLdouble * points) |
||
2715 | { |
||
2716 | GET_CURRENT_CONTEXT(ctx); |
||
2717 | Node *n; |
||
2718 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2719 | n = alloc_instruction(ctx, OPCODE_MAP2, 10); |
||
2720 | if (n) { |
||
2721 | GLfloat *pnts = _mesa_copy_map_points2d(target, ustride, uorder, |
||
2722 | vstride, vorder, points); |
||
2723 | n[1].e = target; |
||
2724 | n[2].f = (GLfloat) u1; |
||
2725 | n[3].f = (GLfloat) u2; |
||
2726 | n[4].f = (GLfloat) v1; |
||
2727 | n[5].f = (GLfloat) v2; |
||
2728 | /* XXX verify these strides are correct */ |
||
2729 | n[6].i = _mesa_evaluator_components(target) * vorder; /*ustride */ |
||
2730 | n[7].i = _mesa_evaluator_components(target); /*vstride */ |
||
2731 | n[8].i = uorder; |
||
2732 | n[9].i = vorder; |
||
2733 | n[10].data = (void *) pnts; |
||
2734 | } |
||
2735 | if (ctx->ExecuteFlag) { |
||
2736 | CALL_Map2d(ctx->Exec, (target, |
||
2737 | u1, u2, ustride, uorder, |
||
2738 | v1, v2, vstride, vorder, points)); |
||
2739 | } |
||
2740 | } |
||
2741 | |||
2742 | |||
2743 | static void GLAPIENTRY |
||
2744 | save_Map2f(GLenum target, |
||
2745 | GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, |
||
2746 | GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, |
||
2747 | const GLfloat * points) |
||
2748 | { |
||
2749 | GET_CURRENT_CONTEXT(ctx); |
||
2750 | Node *n; |
||
2751 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2752 | n = alloc_instruction(ctx, OPCODE_MAP2, 10); |
||
2753 | if (n) { |
||
2754 | GLfloat *pnts = _mesa_copy_map_points2f(target, ustride, uorder, |
||
2755 | vstride, vorder, points); |
||
2756 | n[1].e = target; |
||
2757 | n[2].f = u1; |
||
2758 | n[3].f = u2; |
||
2759 | n[4].f = v1; |
||
2760 | n[5].f = v2; |
||
2761 | /* XXX verify these strides are correct */ |
||
2762 | n[6].i = _mesa_evaluator_components(target) * vorder; /*ustride */ |
||
2763 | n[7].i = _mesa_evaluator_components(target); /*vstride */ |
||
2764 | n[8].i = uorder; |
||
2765 | n[9].i = vorder; |
||
2766 | n[10].data = (void *) pnts; |
||
2767 | } |
||
2768 | if (ctx->ExecuteFlag) { |
||
2769 | CALL_Map2f(ctx->Exec, (target, u1, u2, ustride, uorder, |
||
2770 | v1, v2, vstride, vorder, points)); |
||
2771 | } |
||
2772 | } |
||
2773 | |||
2774 | |||
2775 | static void GLAPIENTRY |
||
2776 | save_MapGrid1f(GLint un, GLfloat u1, GLfloat u2) |
||
2777 | { |
||
2778 | GET_CURRENT_CONTEXT(ctx); |
||
2779 | Node *n; |
||
2780 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2781 | n = alloc_instruction(ctx, OPCODE_MAPGRID1, 3); |
||
2782 | if (n) { |
||
2783 | n[1].i = un; |
||
2784 | n[2].f = u1; |
||
2785 | n[3].f = u2; |
||
2786 | } |
||
2787 | if (ctx->ExecuteFlag) { |
||
2788 | CALL_MapGrid1f(ctx->Exec, (un, u1, u2)); |
||
2789 | } |
||
2790 | } |
||
2791 | |||
2792 | |||
2793 | static void GLAPIENTRY |
||
2794 | save_MapGrid1d(GLint un, GLdouble u1, GLdouble u2) |
||
2795 | { |
||
2796 | save_MapGrid1f(un, (GLfloat) u1, (GLfloat) u2); |
||
2797 | } |
||
2798 | |||
2799 | |||
2800 | static void GLAPIENTRY |
||
2801 | save_MapGrid2f(GLint un, GLfloat u1, GLfloat u2, |
||
2802 | GLint vn, GLfloat v1, GLfloat v2) |
||
2803 | { |
||
2804 | GET_CURRENT_CONTEXT(ctx); |
||
2805 | Node *n; |
||
2806 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2807 | n = alloc_instruction(ctx, OPCODE_MAPGRID2, 6); |
||
2808 | if (n) { |
||
2809 | n[1].i = un; |
||
2810 | n[2].f = u1; |
||
2811 | n[3].f = u2; |
||
2812 | n[4].i = vn; |
||
2813 | n[5].f = v1; |
||
2814 | n[6].f = v2; |
||
2815 | } |
||
2816 | if (ctx->ExecuteFlag) { |
||
2817 | CALL_MapGrid2f(ctx->Exec, (un, u1, u2, vn, v1, v2)); |
||
2818 | } |
||
2819 | } |
||
2820 | |||
2821 | |||
2822 | |||
2823 | static void GLAPIENTRY |
||
2824 | save_MapGrid2d(GLint un, GLdouble u1, GLdouble u2, |
||
2825 | GLint vn, GLdouble v1, GLdouble v2) |
||
2826 | { |
||
2827 | save_MapGrid2f(un, (GLfloat) u1, (GLfloat) u2, |
||
2828 | vn, (GLfloat) v1, (GLfloat) v2); |
||
2829 | } |
||
2830 | |||
2831 | |||
2832 | static void GLAPIENTRY |
||
2833 | save_MatrixMode(GLenum mode) |
||
2834 | { |
||
2835 | GET_CURRENT_CONTEXT(ctx); |
||
2836 | Node *n; |
||
2837 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2838 | n = alloc_instruction(ctx, OPCODE_MATRIX_MODE, 1); |
||
2839 | if (n) { |
||
2840 | n[1].e = mode; |
||
2841 | } |
||
2842 | if (ctx->ExecuteFlag) { |
||
2843 | CALL_MatrixMode(ctx->Exec, (mode)); |
||
2844 | } |
||
2845 | } |
||
2846 | |||
2847 | |||
2848 | static void GLAPIENTRY |
||
2849 | save_Minmax(GLenum target, GLenum internalFormat, GLboolean sink) |
||
2850 | { |
||
2851 | GET_CURRENT_CONTEXT(ctx); |
||
2852 | Node *n; |
||
2853 | |||
2854 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2855 | n = alloc_instruction(ctx, OPCODE_MIN_MAX, 3); |
||
2856 | if (n) { |
||
2857 | n[1].e = target; |
||
2858 | n[2].e = internalFormat; |
||
2859 | n[3].b = sink; |
||
2860 | } |
||
2861 | if (ctx->ExecuteFlag) { |
||
2862 | CALL_Minmax(ctx->Exec, (target, internalFormat, sink)); |
||
2863 | } |
||
2864 | } |
||
2865 | |||
2866 | |||
2867 | static void GLAPIENTRY |
||
2868 | save_MultMatrixf(const GLfloat * m) |
||
2869 | { |
||
2870 | GET_CURRENT_CONTEXT(ctx); |
||
2871 | Node *n; |
||
2872 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2873 | n = alloc_instruction(ctx, OPCODE_MULT_MATRIX, 16); |
||
2874 | if (n) { |
||
2875 | GLuint i; |
||
2876 | for (i = 0; i < 16; i++) { |
||
2877 | n[1 + i].f = m[i]; |
||
2878 | } |
||
2879 | } |
||
2880 | if (ctx->ExecuteFlag) { |
||
2881 | CALL_MultMatrixf(ctx->Exec, (m)); |
||
2882 | } |
||
2883 | } |
||
2884 | |||
2885 | |||
2886 | static void GLAPIENTRY |
||
2887 | save_MultMatrixd(const GLdouble * m) |
||
2888 | { |
||
2889 | GLfloat f[16]; |
||
2890 | GLint i; |
||
2891 | for (i = 0; i < 16; i++) { |
||
2892 | f[i] = (GLfloat) m[i]; |
||
2893 | } |
||
2894 | save_MultMatrixf(f); |
||
2895 | } |
||
2896 | |||
2897 | |||
2898 | static void GLAPIENTRY |
||
2899 | save_NewList(GLuint name, GLenum mode) |
||
2900 | { |
||
2901 | GET_CURRENT_CONTEXT(ctx); |
||
2902 | /* It's an error to call this function while building a display list */ |
||
2903 | _mesa_error(ctx, GL_INVALID_OPERATION, "glNewList"); |
||
2904 | (void) name; |
||
2905 | (void) mode; |
||
2906 | } |
||
2907 | |||
2908 | |||
2909 | |||
2910 | static void GLAPIENTRY |
||
2911 | save_Ortho(GLdouble left, GLdouble right, |
||
2912 | GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval) |
||
2913 | { |
||
2914 | GET_CURRENT_CONTEXT(ctx); |
||
2915 | Node *n; |
||
2916 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2917 | n = alloc_instruction(ctx, OPCODE_ORTHO, 6); |
||
2918 | if (n) { |
||
2919 | n[1].f = (GLfloat) left; |
||
2920 | n[2].f = (GLfloat) right; |
||
2921 | n[3].f = (GLfloat) bottom; |
||
2922 | n[4].f = (GLfloat) top; |
||
2923 | n[5].f = (GLfloat) nearval; |
||
2924 | n[6].f = (GLfloat) farval; |
||
2925 | } |
||
2926 | if (ctx->ExecuteFlag) { |
||
2927 | CALL_Ortho(ctx->Exec, (left, right, bottom, top, nearval, farval)); |
||
2928 | } |
||
2929 | } |
||
2930 | |||
2931 | |||
2932 | static void GLAPIENTRY |
||
2933 | save_PixelMapfv(GLenum map, GLint mapsize, const GLfloat *values) |
||
2934 | { |
||
2935 | GET_CURRENT_CONTEXT(ctx); |
||
2936 | Node *n; |
||
2937 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2938 | n = alloc_instruction(ctx, OPCODE_PIXEL_MAP, 3); |
||
2939 | if (n) { |
||
2940 | n[1].e = map; |
||
2941 | n[2].i = mapsize; |
||
2942 | n[3].data = (void *) malloc(mapsize * sizeof(GLfloat)); |
||
2943 | memcpy(n[3].data, (void *) values, mapsize * sizeof(GLfloat)); |
||
2944 | } |
||
2945 | if (ctx->ExecuteFlag) { |
||
2946 | CALL_PixelMapfv(ctx->Exec, (map, mapsize, values)); |
||
2947 | } |
||
2948 | } |
||
2949 | |||
2950 | |||
2951 | static void GLAPIENTRY |
||
2952 | save_PixelMapuiv(GLenum map, GLint mapsize, const GLuint *values) |
||
2953 | { |
||
2954 | GLfloat fvalues[MAX_PIXEL_MAP_TABLE]; |
||
2955 | GLint i; |
||
2956 | if (map == GL_PIXEL_MAP_I_TO_I || map == GL_PIXEL_MAP_S_TO_S) { |
||
2957 | for (i = 0; i < mapsize; i++) { |
||
2958 | fvalues[i] = (GLfloat) values[i]; |
||
2959 | } |
||
2960 | } |
||
2961 | else { |
||
2962 | for (i = 0; i < mapsize; i++) { |
||
2963 | fvalues[i] = UINT_TO_FLOAT(values[i]); |
||
2964 | } |
||
2965 | } |
||
2966 | save_PixelMapfv(map, mapsize, fvalues); |
||
2967 | } |
||
2968 | |||
2969 | |||
2970 | static void GLAPIENTRY |
||
2971 | save_PixelMapusv(GLenum map, GLint mapsize, const GLushort *values) |
||
2972 | { |
||
2973 | GLfloat fvalues[MAX_PIXEL_MAP_TABLE]; |
||
2974 | GLint i; |
||
2975 | if (map == GL_PIXEL_MAP_I_TO_I || map == GL_PIXEL_MAP_S_TO_S) { |
||
2976 | for (i = 0; i < mapsize; i++) { |
||
2977 | fvalues[i] = (GLfloat) values[i]; |
||
2978 | } |
||
2979 | } |
||
2980 | else { |
||
2981 | for (i = 0; i < mapsize; i++) { |
||
2982 | fvalues[i] = USHORT_TO_FLOAT(values[i]); |
||
2983 | } |
||
2984 | } |
||
2985 | save_PixelMapfv(map, mapsize, fvalues); |
||
2986 | } |
||
2987 | |||
2988 | |||
2989 | static void GLAPIENTRY |
||
2990 | save_PixelTransferf(GLenum pname, GLfloat param) |
||
2991 | { |
||
2992 | GET_CURRENT_CONTEXT(ctx); |
||
2993 | Node *n; |
||
2994 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
2995 | n = alloc_instruction(ctx, OPCODE_PIXEL_TRANSFER, 2); |
||
2996 | if (n) { |
||
2997 | n[1].e = pname; |
||
2998 | n[2].f = param; |
||
2999 | } |
||
3000 | if (ctx->ExecuteFlag) { |
||
3001 | CALL_PixelTransferf(ctx->Exec, (pname, param)); |
||
3002 | } |
||
3003 | } |
||
3004 | |||
3005 | |||
3006 | static void GLAPIENTRY |
||
3007 | save_PixelTransferi(GLenum pname, GLint param) |
||
3008 | { |
||
3009 | save_PixelTransferf(pname, (GLfloat) param); |
||
3010 | } |
||
3011 | |||
3012 | |||
3013 | static void GLAPIENTRY |
||
3014 | save_PixelZoom(GLfloat xfactor, GLfloat yfactor) |
||
3015 | { |
||
3016 | GET_CURRENT_CONTEXT(ctx); |
||
3017 | Node *n; |
||
3018 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3019 | n = alloc_instruction(ctx, OPCODE_PIXEL_ZOOM, 2); |
||
3020 | if (n) { |
||
3021 | n[1].f = xfactor; |
||
3022 | n[2].f = yfactor; |
||
3023 | } |
||
3024 | if (ctx->ExecuteFlag) { |
||
3025 | CALL_PixelZoom(ctx->Exec, (xfactor, yfactor)); |
||
3026 | } |
||
3027 | } |
||
3028 | |||
3029 | |||
3030 | static void GLAPIENTRY |
||
3031 | save_PointParameterfvEXT(GLenum pname, const GLfloat *params) |
||
3032 | { |
||
3033 | GET_CURRENT_CONTEXT(ctx); |
||
3034 | Node *n; |
||
3035 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3036 | n = alloc_instruction(ctx, OPCODE_POINT_PARAMETERS, 4); |
||
3037 | if (n) { |
||
3038 | n[1].e = pname; |
||
3039 | n[2].f = params[0]; |
||
3040 | n[3].f = params[1]; |
||
3041 | n[4].f = params[2]; |
||
3042 | } |
||
3043 | if (ctx->ExecuteFlag) { |
||
3044 | CALL_PointParameterfvEXT(ctx->Exec, (pname, params)); |
||
3045 | } |
||
3046 | } |
||
3047 | |||
3048 | |||
3049 | static void GLAPIENTRY |
||
3050 | save_PointParameterfEXT(GLenum pname, GLfloat param) |
||
3051 | { |
||
3052 | GLfloat parray[3]; |
||
3053 | parray[0] = param; |
||
3054 | parray[1] = parray[2] = 0.0F; |
||
3055 | save_PointParameterfvEXT(pname, parray); |
||
3056 | } |
||
3057 | |||
3058 | static void GLAPIENTRY |
||
3059 | save_PointParameteriNV(GLenum pname, GLint param) |
||
3060 | { |
||
3061 | GLfloat parray[3]; |
||
3062 | parray[0] = (GLfloat) param; |
||
3063 | parray[1] = parray[2] = 0.0F; |
||
3064 | save_PointParameterfvEXT(pname, parray); |
||
3065 | } |
||
3066 | |||
3067 | static void GLAPIENTRY |
||
3068 | save_PointParameterivNV(GLenum pname, const GLint * param) |
||
3069 | { |
||
3070 | GLfloat parray[3]; |
||
3071 | parray[0] = (GLfloat) param[0]; |
||
3072 | parray[1] = parray[2] = 0.0F; |
||
3073 | save_PointParameterfvEXT(pname, parray); |
||
3074 | } |
||
3075 | |||
3076 | |||
3077 | static void GLAPIENTRY |
||
3078 | save_PointSize(GLfloat size) |
||
3079 | { |
||
3080 | GET_CURRENT_CONTEXT(ctx); |
||
3081 | Node *n; |
||
3082 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3083 | n = alloc_instruction(ctx, OPCODE_POINT_SIZE, 1); |
||
3084 | if (n) { |
||
3085 | n[1].f = size; |
||
3086 | } |
||
3087 | if (ctx->ExecuteFlag) { |
||
3088 | CALL_PointSize(ctx->Exec, (size)); |
||
3089 | } |
||
3090 | } |
||
3091 | |||
3092 | |||
3093 | static void GLAPIENTRY |
||
3094 | save_PolygonMode(GLenum face, GLenum mode) |
||
3095 | { |
||
3096 | GET_CURRENT_CONTEXT(ctx); |
||
3097 | Node *n; |
||
3098 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3099 | n = alloc_instruction(ctx, OPCODE_POLYGON_MODE, 2); |
||
3100 | if (n) { |
||
3101 | n[1].e = face; |
||
3102 | n[2].e = mode; |
||
3103 | } |
||
3104 | if (ctx->ExecuteFlag) { |
||
3105 | CALL_PolygonMode(ctx->Exec, (face, mode)); |
||
3106 | } |
||
3107 | } |
||
3108 | |||
3109 | |||
3110 | static void GLAPIENTRY |
||
3111 | save_PolygonStipple(const GLubyte * pattern) |
||
3112 | { |
||
3113 | GET_CURRENT_CONTEXT(ctx); |
||
3114 | Node *n; |
||
3115 | |||
3116 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3117 | |||
3118 | n = alloc_instruction(ctx, OPCODE_POLYGON_STIPPLE, 1); |
||
3119 | if (n) { |
||
3120 | n[1].data = unpack_image(ctx, 2, 32, 32, 1, GL_COLOR_INDEX, GL_BITMAP, |
||
3121 | pattern, &ctx->Unpack); |
||
3122 | } |
||
3123 | if (ctx->ExecuteFlag) { |
||
3124 | CALL_PolygonStipple(ctx->Exec, ((GLubyte *) pattern)); |
||
3125 | } |
||
3126 | } |
||
3127 | |||
3128 | |||
3129 | static void GLAPIENTRY |
||
3130 | save_PolygonOffset(GLfloat factor, GLfloat units) |
||
3131 | { |
||
3132 | GET_CURRENT_CONTEXT(ctx); |
||
3133 | Node *n; |
||
3134 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3135 | n = alloc_instruction(ctx, OPCODE_POLYGON_OFFSET, 2); |
||
3136 | if (n) { |
||
3137 | n[1].f = factor; |
||
3138 | n[2].f = units; |
||
3139 | } |
||
3140 | if (ctx->ExecuteFlag) { |
||
3141 | CALL_PolygonOffset(ctx->Exec, (factor, units)); |
||
3142 | } |
||
3143 | } |
||
3144 | |||
3145 | |||
3146 | static void GLAPIENTRY |
||
3147 | save_PolygonOffsetEXT(GLfloat factor, GLfloat bias) |
||
3148 | { |
||
3149 | GET_CURRENT_CONTEXT(ctx); |
||
3150 | /* XXX mult by DepthMaxF here??? */ |
||
3151 | save_PolygonOffset(factor, ctx->DrawBuffer->_DepthMaxF * bias); |
||
3152 | } |
||
3153 | |||
3154 | |||
3155 | static void GLAPIENTRY |
||
3156 | save_PopAttrib(void) |
||
3157 | { |
||
3158 | GET_CURRENT_CONTEXT(ctx); |
||
3159 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3160 | (void) alloc_instruction(ctx, OPCODE_POP_ATTRIB, 0); |
||
3161 | if (ctx->ExecuteFlag) { |
||
3162 | CALL_PopAttrib(ctx->Exec, ()); |
||
3163 | } |
||
3164 | } |
||
3165 | |||
3166 | |||
3167 | static void GLAPIENTRY |
||
3168 | save_PopMatrix(void) |
||
3169 | { |
||
3170 | GET_CURRENT_CONTEXT(ctx); |
||
3171 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3172 | (void) alloc_instruction(ctx, OPCODE_POP_MATRIX, 0); |
||
3173 | if (ctx->ExecuteFlag) { |
||
3174 | CALL_PopMatrix(ctx->Exec, ()); |
||
3175 | } |
||
3176 | } |
||
3177 | |||
3178 | |||
3179 | static void GLAPIENTRY |
||
3180 | save_PopName(void) |
||
3181 | { |
||
3182 | GET_CURRENT_CONTEXT(ctx); |
||
3183 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3184 | (void) alloc_instruction(ctx, OPCODE_POP_NAME, 0); |
||
3185 | if (ctx->ExecuteFlag) { |
||
3186 | CALL_PopName(ctx->Exec, ()); |
||
3187 | } |
||
3188 | } |
||
3189 | |||
3190 | |||
3191 | static void GLAPIENTRY |
||
3192 | save_PrioritizeTextures(GLsizei num, const GLuint * textures, |
||
3193 | const GLclampf * priorities) |
||
3194 | { |
||
3195 | GET_CURRENT_CONTEXT(ctx); |
||
3196 | GLint i; |
||
3197 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3198 | |||
3199 | for (i = 0; i < num; i++) { |
||
3200 | Node *n; |
||
3201 | n = alloc_instruction(ctx, OPCODE_PRIORITIZE_TEXTURE, 2); |
||
3202 | if (n) { |
||
3203 | n[1].ui = textures[i]; |
||
3204 | n[2].f = priorities[i]; |
||
3205 | } |
||
3206 | } |
||
3207 | if (ctx->ExecuteFlag) { |
||
3208 | CALL_PrioritizeTextures(ctx->Exec, (num, textures, priorities)); |
||
3209 | } |
||
3210 | } |
||
3211 | |||
3212 | |||
3213 | static void GLAPIENTRY |
||
3214 | save_PushAttrib(GLbitfield mask) |
||
3215 | { |
||
3216 | GET_CURRENT_CONTEXT(ctx); |
||
3217 | Node *n; |
||
3218 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3219 | n = alloc_instruction(ctx, OPCODE_PUSH_ATTRIB, 1); |
||
3220 | if (n) { |
||
3221 | n[1].bf = mask; |
||
3222 | } |
||
3223 | if (ctx->ExecuteFlag) { |
||
3224 | CALL_PushAttrib(ctx->Exec, (mask)); |
||
3225 | } |
||
3226 | } |
||
3227 | |||
3228 | |||
3229 | static void GLAPIENTRY |
||
3230 | save_PushMatrix(void) |
||
3231 | { |
||
3232 | GET_CURRENT_CONTEXT(ctx); |
||
3233 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3234 | (void) alloc_instruction(ctx, OPCODE_PUSH_MATRIX, 0); |
||
3235 | if (ctx->ExecuteFlag) { |
||
3236 | CALL_PushMatrix(ctx->Exec, ()); |
||
3237 | } |
||
3238 | } |
||
3239 | |||
3240 | |||
3241 | static void GLAPIENTRY |
||
3242 | save_PushName(GLuint name) |
||
3243 | { |
||
3244 | GET_CURRENT_CONTEXT(ctx); |
||
3245 | Node *n; |
||
3246 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3247 | n = alloc_instruction(ctx, OPCODE_PUSH_NAME, 1); |
||
3248 | if (n) { |
||
3249 | n[1].ui = name; |
||
3250 | } |
||
3251 | if (ctx->ExecuteFlag) { |
||
3252 | CALL_PushName(ctx->Exec, (name)); |
||
3253 | } |
||
3254 | } |
||
3255 | |||
3256 | |||
3257 | static void GLAPIENTRY |
||
3258 | save_RasterPos4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) |
||
3259 | { |
||
3260 | GET_CURRENT_CONTEXT(ctx); |
||
3261 | Node *n; |
||
3262 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3263 | n = alloc_instruction(ctx, OPCODE_RASTER_POS, 4); |
||
3264 | if (n) { |
||
3265 | n[1].f = x; |
||
3266 | n[2].f = y; |
||
3267 | n[3].f = z; |
||
3268 | n[4].f = w; |
||
3269 | } |
||
3270 | if (ctx->ExecuteFlag) { |
||
3271 | CALL_RasterPos4f(ctx->Exec, (x, y, z, w)); |
||
3272 | } |
||
3273 | } |
||
3274 | |||
3275 | static void GLAPIENTRY |
||
3276 | save_RasterPos2d(GLdouble x, GLdouble y) |
||
3277 | { |
||
3278 | save_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); |
||
3279 | } |
||
3280 | |||
3281 | static void GLAPIENTRY |
||
3282 | save_RasterPos2f(GLfloat x, GLfloat y) |
||
3283 | { |
||
3284 | save_RasterPos4f(x, y, 0.0F, 1.0F); |
||
3285 | } |
||
3286 | |||
3287 | static void GLAPIENTRY |
||
3288 | save_RasterPos2i(GLint x, GLint y) |
||
3289 | { |
||
3290 | save_RasterPos4f((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); |
||
3291 | } |
||
3292 | |||
3293 | static void GLAPIENTRY |
||
3294 | save_RasterPos2s(GLshort x, GLshort y) |
||
3295 | { |
||
3296 | save_RasterPos4f(x, y, 0.0F, 1.0F); |
||
3297 | } |
||
3298 | |||
3299 | static void GLAPIENTRY |
||
3300 | save_RasterPos3d(GLdouble x, GLdouble y, GLdouble z) |
||
3301 | { |
||
3302 | save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); |
||
3303 | } |
||
3304 | |||
3305 | static void GLAPIENTRY |
||
3306 | save_RasterPos3f(GLfloat x, GLfloat y, GLfloat z) |
||
3307 | { |
||
3308 | save_RasterPos4f(x, y, z, 1.0F); |
||
3309 | } |
||
3310 | |||
3311 | static void GLAPIENTRY |
||
3312 | save_RasterPos3i(GLint x, GLint y, GLint z) |
||
3313 | { |
||
3314 | save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); |
||
3315 | } |
||
3316 | |||
3317 | static void GLAPIENTRY |
||
3318 | save_RasterPos3s(GLshort x, GLshort y, GLshort z) |
||
3319 | { |
||
3320 | save_RasterPos4f(x, y, z, 1.0F); |
||
3321 | } |
||
3322 | |||
3323 | static void GLAPIENTRY |
||
3324 | save_RasterPos4d(GLdouble x, GLdouble y, GLdouble z, GLdouble w) |
||
3325 | { |
||
3326 | save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); |
||
3327 | } |
||
3328 | |||
3329 | static void GLAPIENTRY |
||
3330 | save_RasterPos4i(GLint x, GLint y, GLint z, GLint w) |
||
3331 | { |
||
3332 | save_RasterPos4f((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); |
||
3333 | } |
||
3334 | |||
3335 | static void GLAPIENTRY |
||
3336 | save_RasterPos4s(GLshort x, GLshort y, GLshort z, GLshort w) |
||
3337 | { |
||
3338 | save_RasterPos4f(x, y, z, w); |
||
3339 | } |
||
3340 | |||
3341 | static void GLAPIENTRY |
||
3342 | save_RasterPos2dv(const GLdouble * v) |
||
3343 | { |
||
3344 | save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); |
||
3345 | } |
||
3346 | |||
3347 | static void GLAPIENTRY |
||
3348 | save_RasterPos2fv(const GLfloat * v) |
||
3349 | { |
||
3350 | save_RasterPos4f(v[0], v[1], 0.0F, 1.0F); |
||
3351 | } |
||
3352 | |||
3353 | static void GLAPIENTRY |
||
3354 | save_RasterPos2iv(const GLint * v) |
||
3355 | { |
||
3356 | save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); |
||
3357 | } |
||
3358 | |||
3359 | static void GLAPIENTRY |
||
3360 | save_RasterPos2sv(const GLshort * v) |
||
3361 | { |
||
3362 | save_RasterPos4f(v[0], v[1], 0.0F, 1.0F); |
||
3363 | } |
||
3364 | |||
3365 | static void GLAPIENTRY |
||
3366 | save_RasterPos3dv(const GLdouble * v) |
||
3367 | { |
||
3368 | save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); |
||
3369 | } |
||
3370 | |||
3371 | static void GLAPIENTRY |
||
3372 | save_RasterPos3fv(const GLfloat * v) |
||
3373 | { |
||
3374 | save_RasterPos4f(v[0], v[1], v[2], 1.0F); |
||
3375 | } |
||
3376 | |||
3377 | static void GLAPIENTRY |
||
3378 | save_RasterPos3iv(const GLint * v) |
||
3379 | { |
||
3380 | save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); |
||
3381 | } |
||
3382 | |||
3383 | static void GLAPIENTRY |
||
3384 | save_RasterPos3sv(const GLshort * v) |
||
3385 | { |
||
3386 | save_RasterPos4f(v[0], v[1], v[2], 1.0F); |
||
3387 | } |
||
3388 | |||
3389 | static void GLAPIENTRY |
||
3390 | save_RasterPos4dv(const GLdouble * v) |
||
3391 | { |
||
3392 | save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], |
||
3393 | (GLfloat) v[2], (GLfloat) v[3]); |
||
3394 | } |
||
3395 | |||
3396 | static void GLAPIENTRY |
||
3397 | save_RasterPos4fv(const GLfloat * v) |
||
3398 | { |
||
3399 | save_RasterPos4f(v[0], v[1], v[2], v[3]); |
||
3400 | } |
||
3401 | |||
3402 | static void GLAPIENTRY |
||
3403 | save_RasterPos4iv(const GLint * v) |
||
3404 | { |
||
3405 | save_RasterPos4f((GLfloat) v[0], (GLfloat) v[1], |
||
3406 | (GLfloat) v[2], (GLfloat) v[3]); |
||
3407 | } |
||
3408 | |||
3409 | static void GLAPIENTRY |
||
3410 | save_RasterPos4sv(const GLshort * v) |
||
3411 | { |
||
3412 | save_RasterPos4f(v[0], v[1], v[2], v[3]); |
||
3413 | } |
||
3414 | |||
3415 | |||
3416 | static void GLAPIENTRY |
||
3417 | save_PassThrough(GLfloat token) |
||
3418 | { |
||
3419 | GET_CURRENT_CONTEXT(ctx); |
||
3420 | Node *n; |
||
3421 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3422 | n = alloc_instruction(ctx, OPCODE_PASSTHROUGH, 1); |
||
3423 | if (n) { |
||
3424 | n[1].f = token; |
||
3425 | } |
||
3426 | if (ctx->ExecuteFlag) { |
||
3427 | CALL_PassThrough(ctx->Exec, (token)); |
||
3428 | } |
||
3429 | } |
||
3430 | |||
3431 | |||
3432 | static void GLAPIENTRY |
||
3433 | save_ReadBuffer(GLenum mode) |
||
3434 | { |
||
3435 | GET_CURRENT_CONTEXT(ctx); |
||
3436 | Node *n; |
||
3437 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3438 | n = alloc_instruction(ctx, OPCODE_READ_BUFFER, 1); |
||
3439 | if (n) { |
||
3440 | n[1].e = mode; |
||
3441 | } |
||
3442 | if (ctx->ExecuteFlag) { |
||
3443 | CALL_ReadBuffer(ctx->Exec, (mode)); |
||
3444 | } |
||
3445 | } |
||
3446 | |||
3447 | |||
3448 | static void GLAPIENTRY |
||
3449 | save_ResetHistogram(GLenum target) |
||
3450 | { |
||
3451 | GET_CURRENT_CONTEXT(ctx); |
||
3452 | Node *n; |
||
3453 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3454 | n = alloc_instruction(ctx, OPCODE_RESET_HISTOGRAM, 1); |
||
3455 | if (n) { |
||
3456 | n[1].e = target; |
||
3457 | } |
||
3458 | if (ctx->ExecuteFlag) { |
||
3459 | CALL_ResetHistogram(ctx->Exec, (target)); |
||
3460 | } |
||
3461 | } |
||
3462 | |||
3463 | |||
3464 | static void GLAPIENTRY |
||
3465 | save_ResetMinmax(GLenum target) |
||
3466 | { |
||
3467 | GET_CURRENT_CONTEXT(ctx); |
||
3468 | Node *n; |
||
3469 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3470 | n = alloc_instruction(ctx, OPCODE_RESET_MIN_MAX, 1); |
||
3471 | if (n) { |
||
3472 | n[1].e = target; |
||
3473 | } |
||
3474 | if (ctx->ExecuteFlag) { |
||
3475 | CALL_ResetMinmax(ctx->Exec, (target)); |
||
3476 | } |
||
3477 | } |
||
3478 | |||
3479 | |||
3480 | static void GLAPIENTRY |
||
3481 | save_Rotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) |
||
3482 | { |
||
3483 | GET_CURRENT_CONTEXT(ctx); |
||
3484 | Node *n; |
||
3485 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3486 | n = alloc_instruction(ctx, OPCODE_ROTATE, 4); |
||
3487 | if (n) { |
||
3488 | n[1].f = angle; |
||
3489 | n[2].f = x; |
||
3490 | n[3].f = y; |
||
3491 | n[4].f = z; |
||
3492 | } |
||
3493 | if (ctx->ExecuteFlag) { |
||
3494 | CALL_Rotatef(ctx->Exec, (angle, x, y, z)); |
||
3495 | } |
||
3496 | } |
||
3497 | |||
3498 | |||
3499 | static void GLAPIENTRY |
||
3500 | save_Rotated(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) |
||
3501 | { |
||
3502 | save_Rotatef((GLfloat) angle, (GLfloat) x, (GLfloat) y, (GLfloat) z); |
||
3503 | } |
||
3504 | |||
3505 | |||
3506 | static void GLAPIENTRY |
||
3507 | save_Scalef(GLfloat x, GLfloat y, GLfloat z) |
||
3508 | { |
||
3509 | GET_CURRENT_CONTEXT(ctx); |
||
3510 | Node *n; |
||
3511 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3512 | n = alloc_instruction(ctx, OPCODE_SCALE, 3); |
||
3513 | if (n) { |
||
3514 | n[1].f = x; |
||
3515 | n[2].f = y; |
||
3516 | n[3].f = z; |
||
3517 | } |
||
3518 | if (ctx->ExecuteFlag) { |
||
3519 | CALL_Scalef(ctx->Exec, (x, y, z)); |
||
3520 | } |
||
3521 | } |
||
3522 | |||
3523 | |||
3524 | static void GLAPIENTRY |
||
3525 | save_Scaled(GLdouble x, GLdouble y, GLdouble z) |
||
3526 | { |
||
3527 | save_Scalef((GLfloat) x, (GLfloat) y, (GLfloat) z); |
||
3528 | } |
||
3529 | |||
3530 | |||
3531 | static void GLAPIENTRY |
||
3532 | save_Scissor(GLint x, GLint y, GLsizei width, GLsizei height) |
||
3533 | { |
||
3534 | GET_CURRENT_CONTEXT(ctx); |
||
3535 | Node *n; |
||
3536 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3537 | n = alloc_instruction(ctx, OPCODE_SCISSOR, 4); |
||
3538 | if (n) { |
||
3539 | n[1].i = x; |
||
3540 | n[2].i = y; |
||
3541 | n[3].i = width; |
||
3542 | n[4].i = height; |
||
3543 | } |
||
3544 | if (ctx->ExecuteFlag) { |
||
3545 | CALL_Scissor(ctx->Exec, (x, y, width, height)); |
||
3546 | } |
||
3547 | } |
||
3548 | |||
3549 | |||
3550 | static void GLAPIENTRY |
||
3551 | save_ShadeModel(GLenum mode) |
||
3552 | { |
||
3553 | GET_CURRENT_CONTEXT(ctx); |
||
3554 | Node *n; |
||
3555 | ASSERT_OUTSIDE_SAVE_BEGIN_END(ctx); |
||
3556 | |||
3557 | if (ctx->ExecuteFlag) { |
||
3558 | CALL_ShadeModel(ctx->Exec, (mode)); |
||
3559 | } |
||
3560 | |||
3561 | if (ctx->ListState.Current.ShadeModel == mode) |
||
3562 | return; |
||
3563 | |||
3564 | SAVE_FLUSH_VERTICES(ctx); |
||
3565 | |||
3566 | /* Only save the value if we know the statechange will take effect: |
||
3567 | */ |
||
3568 | if (ctx->Driver.CurrentSavePrimitive == PRIM_OUTSIDE_BEGIN_END) |
||
3569 | ctx->ListState.Current.ShadeModel = mode; |
||
3570 | |||
3571 | n = alloc_instruction(ctx, OPCODE_SHADE_MODEL, 1); |
||
3572 | if (n) { |
||
3573 | n[1].e = mode; |
||
3574 | } |
||
3575 | } |
||
3576 | |||
3577 | |||
3578 | static void GLAPIENTRY |
||
3579 | save_StencilFunc(GLenum func, GLint ref, GLuint mask) |
||
3580 | { |
||
3581 | GET_CURRENT_CONTEXT(ctx); |
||
3582 | Node *n; |
||
3583 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3584 | n = alloc_instruction(ctx, OPCODE_STENCIL_FUNC, 3); |
||
3585 | if (n) { |
||
3586 | n[1].e = func; |
||
3587 | n[2].i = ref; |
||
3588 | n[3].ui = mask; |
||
3589 | } |
||
3590 | if (ctx->ExecuteFlag) { |
||
3591 | CALL_StencilFunc(ctx->Exec, (func, ref, mask)); |
||
3592 | } |
||
3593 | } |
||
3594 | |||
3595 | |||
3596 | static void GLAPIENTRY |
||
3597 | save_StencilMask(GLuint mask) |
||
3598 | { |
||
3599 | GET_CURRENT_CONTEXT(ctx); |
||
3600 | Node *n; |
||
3601 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3602 | n = alloc_instruction(ctx, OPCODE_STENCIL_MASK, 1); |
||
3603 | if (n) { |
||
3604 | n[1].ui = mask; |
||
3605 | } |
||
3606 | if (ctx->ExecuteFlag) { |
||
3607 | CALL_StencilMask(ctx->Exec, (mask)); |
||
3608 | } |
||
3609 | } |
||
3610 | |||
3611 | |||
3612 | static void GLAPIENTRY |
||
3613 | save_StencilOp(GLenum fail, GLenum zfail, GLenum zpass) |
||
3614 | { |
||
3615 | GET_CURRENT_CONTEXT(ctx); |
||
3616 | Node *n; |
||
3617 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3618 | n = alloc_instruction(ctx, OPCODE_STENCIL_OP, 3); |
||
3619 | if (n) { |
||
3620 | n[1].e = fail; |
||
3621 | n[2].e = zfail; |
||
3622 | n[3].e = zpass; |
||
3623 | } |
||
3624 | if (ctx->ExecuteFlag) { |
||
3625 | CALL_StencilOp(ctx->Exec, (fail, zfail, zpass)); |
||
3626 | } |
||
3627 | } |
||
3628 | |||
3629 | |||
3630 | static void GLAPIENTRY |
||
3631 | save_StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) |
||
3632 | { |
||
3633 | GET_CURRENT_CONTEXT(ctx); |
||
3634 | Node *n; |
||
3635 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3636 | n = alloc_instruction(ctx, OPCODE_STENCIL_FUNC_SEPARATE, 4); |
||
3637 | if (n) { |
||
3638 | n[1].e = face; |
||
3639 | n[2].e = func; |
||
3640 | n[3].i = ref; |
||
3641 | n[4].ui = mask; |
||
3642 | } |
||
3643 | if (ctx->ExecuteFlag) { |
||
3644 | CALL_StencilFuncSeparate(ctx->Exec, (face, func, ref, mask)); |
||
3645 | } |
||
3646 | } |
||
3647 | |||
3648 | |||
3649 | static void GLAPIENTRY |
||
3650 | save_StencilFuncSeparateATI(GLenum frontfunc, GLenum backfunc, GLint ref, |
||
3651 | GLuint mask) |
||
3652 | { |
||
3653 | GET_CURRENT_CONTEXT(ctx); |
||
3654 | Node *n; |
||
3655 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3656 | /* GL_FRONT */ |
||
3657 | n = alloc_instruction(ctx, OPCODE_STENCIL_FUNC_SEPARATE, 4); |
||
3658 | if (n) { |
||
3659 | n[1].e = GL_FRONT; |
||
3660 | n[2].e = frontfunc; |
||
3661 | n[3].i = ref; |
||
3662 | n[4].ui = mask; |
||
3663 | } |
||
3664 | /* GL_BACK */ |
||
3665 | n = alloc_instruction(ctx, OPCODE_STENCIL_FUNC_SEPARATE, 4); |
||
3666 | if (n) { |
||
3667 | n[1].e = GL_BACK; |
||
3668 | n[2].e = backfunc; |
||
3669 | n[3].i = ref; |
||
3670 | n[4].ui = mask; |
||
3671 | } |
||
3672 | if (ctx->ExecuteFlag) { |
||
3673 | CALL_StencilFuncSeparate(ctx->Exec, (GL_FRONT, frontfunc, ref, mask)); |
||
3674 | CALL_StencilFuncSeparate(ctx->Exec, (GL_BACK, backfunc, ref, mask)); |
||
3675 | } |
||
3676 | } |
||
3677 | |||
3678 | |||
3679 | static void GLAPIENTRY |
||
3680 | save_StencilMaskSeparate(GLenum face, GLuint mask) |
||
3681 | { |
||
3682 | GET_CURRENT_CONTEXT(ctx); |
||
3683 | Node *n; |
||
3684 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3685 | n = alloc_instruction(ctx, OPCODE_STENCIL_MASK_SEPARATE, 2); |
||
3686 | if (n) { |
||
3687 | n[1].e = face; |
||
3688 | n[2].ui = mask; |
||
3689 | } |
||
3690 | if (ctx->ExecuteFlag) { |
||
3691 | CALL_StencilMaskSeparate(ctx->Exec, (face, mask)); |
||
3692 | } |
||
3693 | } |
||
3694 | |||
3695 | |||
3696 | static void GLAPIENTRY |
||
3697 | save_StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) |
||
3698 | { |
||
3699 | GET_CURRENT_CONTEXT(ctx); |
||
3700 | Node *n; |
||
3701 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3702 | n = alloc_instruction(ctx, OPCODE_STENCIL_OP_SEPARATE, 4); |
||
3703 | if (n) { |
||
3704 | n[1].e = face; |
||
3705 | n[2].e = fail; |
||
3706 | n[3].e = zfail; |
||
3707 | n[4].e = zpass; |
||
3708 | } |
||
3709 | if (ctx->ExecuteFlag) { |
||
3710 | CALL_StencilOpSeparate(ctx->Exec, (face, fail, zfail, zpass)); |
||
3711 | } |
||
3712 | } |
||
3713 | |||
3714 | |||
3715 | static void GLAPIENTRY |
||
3716 | save_TexEnvfv(GLenum target, GLenum pname, const GLfloat *params) |
||
3717 | { |
||
3718 | GET_CURRENT_CONTEXT(ctx); |
||
3719 | Node *n; |
||
3720 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3721 | n = alloc_instruction(ctx, OPCODE_TEXENV, 6); |
||
3722 | if (n) { |
||
3723 | n[1].e = target; |
||
3724 | n[2].e = pname; |
||
3725 | if (pname == GL_TEXTURE_ENV_COLOR) { |
||
3726 | n[3].f = params[0]; |
||
3727 | n[4].f = params[1]; |
||
3728 | n[5].f = params[2]; |
||
3729 | n[6].f = params[3]; |
||
3730 | } |
||
3731 | else { |
||
3732 | n[3].f = params[0]; |
||
3733 | n[4].f = n[5].f = n[6].f = 0.0F; |
||
3734 | } |
||
3735 | } |
||
3736 | if (ctx->ExecuteFlag) { |
||
3737 | CALL_TexEnvfv(ctx->Exec, (target, pname, params)); |
||
3738 | } |
||
3739 | } |
||
3740 | |||
3741 | |||
3742 | static void GLAPIENTRY |
||
3743 | save_TexEnvf(GLenum target, GLenum pname, GLfloat param) |
||
3744 | { |
||
3745 | GLfloat parray[4]; |
||
3746 | parray[0] = (GLfloat) param; |
||
3747 | parray[1] = parray[2] = parray[3] = 0.0F; |
||
3748 | save_TexEnvfv(target, pname, parray); |
||
3749 | } |
||
3750 | |||
3751 | |||
3752 | static void GLAPIENTRY |
||
3753 | save_TexEnvi(GLenum target, GLenum pname, GLint param) |
||
3754 | { |
||
3755 | GLfloat p[4]; |
||
3756 | p[0] = (GLfloat) param; |
||
3757 | p[1] = p[2] = p[3] = 0.0F; |
||
3758 | save_TexEnvfv(target, pname, p); |
||
3759 | } |
||
3760 | |||
3761 | |||
3762 | static void GLAPIENTRY |
||
3763 | save_TexEnviv(GLenum target, GLenum pname, const GLint * param) |
||
3764 | { |
||
3765 | GLfloat p[4]; |
||
3766 | if (pname == GL_TEXTURE_ENV_COLOR) { |
||
3767 | p[0] = INT_TO_FLOAT(param[0]); |
||
3768 | p[1] = INT_TO_FLOAT(param[1]); |
||
3769 | p[2] = INT_TO_FLOAT(param[2]); |
||
3770 | p[3] = INT_TO_FLOAT(param[3]); |
||
3771 | } |
||
3772 | else { |
||
3773 | p[0] = (GLfloat) param[0]; |
||
3774 | p[1] = p[2] = p[3] = 0.0F; |
||
3775 | } |
||
3776 | save_TexEnvfv(target, pname, p); |
||
3777 | } |
||
3778 | |||
3779 | |||
3780 | static void GLAPIENTRY |
||
3781 | save_TexGenfv(GLenum coord, GLenum pname, const GLfloat *params) |
||
3782 | { |
||
3783 | GET_CURRENT_CONTEXT(ctx); |
||
3784 | Node *n; |
||
3785 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3786 | n = alloc_instruction(ctx, OPCODE_TEXGEN, 6); |
||
3787 | if (n) { |
||
3788 | n[1].e = coord; |
||
3789 | n[2].e = pname; |
||
3790 | n[3].f = params[0]; |
||
3791 | n[4].f = params[1]; |
||
3792 | n[5].f = params[2]; |
||
3793 | n[6].f = params[3]; |
||
3794 | } |
||
3795 | if (ctx->ExecuteFlag) { |
||
3796 | CALL_TexGenfv(ctx->Exec, (coord, pname, params)); |
||
3797 | } |
||
3798 | } |
||
3799 | |||
3800 | |||
3801 | static void GLAPIENTRY |
||
3802 | save_TexGeniv(GLenum coord, GLenum pname, const GLint *params) |
||
3803 | { |
||
3804 | GLfloat p[4]; |
||
3805 | p[0] = (GLfloat) params[0]; |
||
3806 | p[1] = (GLfloat) params[1]; |
||
3807 | p[2] = (GLfloat) params[2]; |
||
3808 | p[3] = (GLfloat) params[3]; |
||
3809 | save_TexGenfv(coord, pname, p); |
||
3810 | } |
||
3811 | |||
3812 | |||
3813 | static void GLAPIENTRY |
||
3814 | save_TexGend(GLenum coord, GLenum pname, GLdouble param) |
||
3815 | { |
||
3816 | GLfloat parray[4]; |
||
3817 | parray[0] = (GLfloat) param; |
||
3818 | parray[1] = parray[2] = parray[3] = 0.0F; |
||
3819 | save_TexGenfv(coord, pname, parray); |
||
3820 | } |
||
3821 | |||
3822 | |||
3823 | static void GLAPIENTRY |
||
3824 | save_TexGendv(GLenum coord, GLenum pname, const GLdouble *params) |
||
3825 | { |
||
3826 | GLfloat p[4]; |
||
3827 | p[0] = (GLfloat) params[0]; |
||
3828 | p[1] = (GLfloat) params[1]; |
||
3829 | p[2] = (GLfloat) params[2]; |
||
3830 | p[3] = (GLfloat) params[3]; |
||
3831 | save_TexGenfv(coord, pname, p); |
||
3832 | } |
||
3833 | |||
3834 | |||
3835 | static void GLAPIENTRY |
||
3836 | save_TexGenf(GLenum coord, GLenum pname, GLfloat param) |
||
3837 | { |
||
3838 | GLfloat parray[4]; |
||
3839 | parray[0] = param; |
||
3840 | parray[1] = parray[2] = parray[3] = 0.0F; |
||
3841 | save_TexGenfv(coord, pname, parray); |
||
3842 | } |
||
3843 | |||
3844 | |||
3845 | static void GLAPIENTRY |
||
3846 | save_TexGeni(GLenum coord, GLenum pname, GLint param) |
||
3847 | { |
||
3848 | GLint parray[4]; |
||
3849 | parray[0] = param; |
||
3850 | parray[1] = parray[2] = parray[3] = 0; |
||
3851 | save_TexGeniv(coord, pname, parray); |
||
3852 | } |
||
3853 | |||
3854 | |||
3855 | static void GLAPIENTRY |
||
3856 | save_TexParameterfv(GLenum target, GLenum pname, const GLfloat *params) |
||
3857 | { |
||
3858 | GET_CURRENT_CONTEXT(ctx); |
||
3859 | Node *n; |
||
3860 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3861 | n = alloc_instruction(ctx, OPCODE_TEXPARAMETER, 6); |
||
3862 | if (n) { |
||
3863 | n[1].e = target; |
||
3864 | n[2].e = pname; |
||
3865 | n[3].f = params[0]; |
||
3866 | n[4].f = params[1]; |
||
3867 | n[5].f = params[2]; |
||
3868 | n[6].f = params[3]; |
||
3869 | } |
||
3870 | if (ctx->ExecuteFlag) { |
||
3871 | CALL_TexParameterfv(ctx->Exec, (target, pname, params)); |
||
3872 | } |
||
3873 | } |
||
3874 | |||
3875 | |||
3876 | static void GLAPIENTRY |
||
3877 | save_TexParameterf(GLenum target, GLenum pname, GLfloat param) |
||
3878 | { |
||
3879 | GLfloat parray[4]; |
||
3880 | parray[0] = param; |
||
3881 | parray[1] = parray[2] = parray[3] = 0.0F; |
||
3882 | save_TexParameterfv(target, pname, parray); |
||
3883 | } |
||
3884 | |||
3885 | |||
3886 | static void GLAPIENTRY |
||
3887 | save_TexParameteri(GLenum target, GLenum pname, GLint param) |
||
3888 | { |
||
3889 | GLfloat fparam[4]; |
||
3890 | fparam[0] = (GLfloat) param; |
||
3891 | fparam[1] = fparam[2] = fparam[3] = 0.0F; |
||
3892 | save_TexParameterfv(target, pname, fparam); |
||
3893 | } |
||
3894 | |||
3895 | |||
3896 | static void GLAPIENTRY |
||
3897 | save_TexParameteriv(GLenum target, GLenum pname, const GLint *params) |
||
3898 | { |
||
3899 | GLfloat fparam[4]; |
||
3900 | fparam[0] = (GLfloat) params[0]; |
||
3901 | fparam[1] = fparam[2] = fparam[3] = 0.0F; |
||
3902 | save_TexParameterfv(target, pname, fparam); |
||
3903 | } |
||
3904 | |||
3905 | |||
3906 | static void GLAPIENTRY |
||
3907 | save_TexImage1D(GLenum target, |
||
3908 | GLint level, GLint components, |
||
3909 | GLsizei width, GLint border, |
||
3910 | GLenum format, GLenum type, const GLvoid * pixels) |
||
3911 | { |
||
3912 | GET_CURRENT_CONTEXT(ctx); |
||
3913 | if (target == GL_PROXY_TEXTURE_1D) { |
||
3914 | /* don't compile, execute immediately */ |
||
3915 | CALL_TexImage1D(ctx->Exec, (target, level, components, width, |
||
3916 | border, format, type, pixels)); |
||
3917 | } |
||
3918 | else { |
||
3919 | Node *n; |
||
3920 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3921 | n = alloc_instruction(ctx, OPCODE_TEX_IMAGE1D, 8); |
||
3922 | if (n) { |
||
3923 | n[1].e = target; |
||
3924 | n[2].i = level; |
||
3925 | n[3].i = components; |
||
3926 | n[4].i = (GLint) width; |
||
3927 | n[5].i = border; |
||
3928 | n[6].e = format; |
||
3929 | n[7].e = type; |
||
3930 | n[8].data = unpack_image(ctx, 1, width, 1, 1, format, type, |
||
3931 | pixels, &ctx->Unpack); |
||
3932 | } |
||
3933 | if (ctx->ExecuteFlag) { |
||
3934 | CALL_TexImage1D(ctx->Exec, (target, level, components, width, |
||
3935 | border, format, type, pixels)); |
||
3936 | } |
||
3937 | } |
||
3938 | } |
||
3939 | |||
3940 | |||
3941 | static void GLAPIENTRY |
||
3942 | save_TexImage2D(GLenum target, |
||
3943 | GLint level, GLint components, |
||
3944 | GLsizei width, GLsizei height, GLint border, |
||
3945 | GLenum format, GLenum type, const GLvoid * pixels) |
||
3946 | { |
||
3947 | GET_CURRENT_CONTEXT(ctx); |
||
3948 | if (target == GL_PROXY_TEXTURE_2D) { |
||
3949 | /* don't compile, execute immediately */ |
||
3950 | CALL_TexImage2D(ctx->Exec, (target, level, components, width, |
||
3951 | height, border, format, type, pixels)); |
||
3952 | } |
||
3953 | else { |
||
3954 | Node *n; |
||
3955 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3956 | n = alloc_instruction(ctx, OPCODE_TEX_IMAGE2D, 9); |
||
3957 | if (n) { |
||
3958 | n[1].e = target; |
||
3959 | n[2].i = level; |
||
3960 | n[3].i = components; |
||
3961 | n[4].i = (GLint) width; |
||
3962 | n[5].i = (GLint) height; |
||
3963 | n[6].i = border; |
||
3964 | n[7].e = format; |
||
3965 | n[8].e = type; |
||
3966 | n[9].data = unpack_image(ctx, 2, width, height, 1, format, type, |
||
3967 | pixels, &ctx->Unpack); |
||
3968 | } |
||
3969 | if (ctx->ExecuteFlag) { |
||
3970 | CALL_TexImage2D(ctx->Exec, (target, level, components, width, |
||
3971 | height, border, format, type, pixels)); |
||
3972 | } |
||
3973 | } |
||
3974 | } |
||
3975 | |||
3976 | |||
3977 | static void GLAPIENTRY |
||
3978 | save_TexImage3D(GLenum target, |
||
3979 | GLint level, GLint internalFormat, |
||
3980 | GLsizei width, GLsizei height, GLsizei depth, |
||
3981 | GLint border, |
||
3982 | GLenum format, GLenum type, const GLvoid * pixels) |
||
3983 | { |
||
3984 | GET_CURRENT_CONTEXT(ctx); |
||
3985 | if (target == GL_PROXY_TEXTURE_3D) { |
||
3986 | /* don't compile, execute immediately */ |
||
3987 | CALL_TexImage3D(ctx->Exec, (target, level, internalFormat, width, |
||
3988 | height, depth, border, format, type, |
||
3989 | pixels)); |
||
3990 | } |
||
3991 | else { |
||
3992 | Node *n; |
||
3993 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
3994 | n = alloc_instruction(ctx, OPCODE_TEX_IMAGE3D, 10); |
||
3995 | if (n) { |
||
3996 | n[1].e = target; |
||
3997 | n[2].i = level; |
||
3998 | n[3].i = (GLint) internalFormat; |
||
3999 | n[4].i = (GLint) width; |
||
4000 | n[5].i = (GLint) height; |
||
4001 | n[6].i = (GLint) depth; |
||
4002 | n[7].i = border; |
||
4003 | n[8].e = format; |
||
4004 | n[9].e = type; |
||
4005 | n[10].data = unpack_image(ctx, 3, width, height, depth, format, type, |
||
4006 | pixels, &ctx->Unpack); |
||
4007 | } |
||
4008 | if (ctx->ExecuteFlag) { |
||
4009 | CALL_TexImage3D(ctx->Exec, (target, level, internalFormat, width, |
||
4010 | height, depth, border, format, type, |
||
4011 | pixels)); |
||
4012 | } |
||
4013 | } |
||
4014 | } |
||
4015 | |||
4016 | |||
4017 | static void GLAPIENTRY |
||
4018 | save_TexSubImage1D(GLenum target, GLint level, GLint xoffset, |
||
4019 | GLsizei width, GLenum format, GLenum type, |
||
4020 | const GLvoid * pixels) |
||
4021 | { |
||
4022 | GET_CURRENT_CONTEXT(ctx); |
||
4023 | Node *n; |
||
4024 | |||
4025 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4026 | |||
4027 | n = alloc_instruction(ctx, OPCODE_TEX_SUB_IMAGE1D, 7); |
||
4028 | if (n) { |
||
4029 | n[1].e = target; |
||
4030 | n[2].i = level; |
||
4031 | n[3].i = xoffset; |
||
4032 | n[4].i = (GLint) width; |
||
4033 | n[5].e = format; |
||
4034 | n[6].e = type; |
||
4035 | n[7].data = unpack_image(ctx, 1, width, 1, 1, format, type, |
||
4036 | pixels, &ctx->Unpack); |
||
4037 | } |
||
4038 | if (ctx->ExecuteFlag) { |
||
4039 | CALL_TexSubImage1D(ctx->Exec, (target, level, xoffset, width, |
||
4040 | format, type, pixels)); |
||
4041 | } |
||
4042 | } |
||
4043 | |||
4044 | |||
4045 | static void GLAPIENTRY |
||
4046 | save_TexSubImage2D(GLenum target, GLint level, |
||
4047 | GLint xoffset, GLint yoffset, |
||
4048 | GLsizei width, GLsizei height, |
||
4049 | GLenum format, GLenum type, const GLvoid * pixels) |
||
4050 | { |
||
4051 | GET_CURRENT_CONTEXT(ctx); |
||
4052 | Node *n; |
||
4053 | |||
4054 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4055 | |||
4056 | n = alloc_instruction(ctx, OPCODE_TEX_SUB_IMAGE2D, 9); |
||
4057 | if (n) { |
||
4058 | n[1].e = target; |
||
4059 | n[2].i = level; |
||
4060 | n[3].i = xoffset; |
||
4061 | n[4].i = yoffset; |
||
4062 | n[5].i = (GLint) width; |
||
4063 | n[6].i = (GLint) height; |
||
4064 | n[7].e = format; |
||
4065 | n[8].e = type; |
||
4066 | n[9].data = unpack_image(ctx, 2, width, height, 1, format, type, |
||
4067 | pixels, &ctx->Unpack); |
||
4068 | } |
||
4069 | if (ctx->ExecuteFlag) { |
||
4070 | CALL_TexSubImage2D(ctx->Exec, (target, level, xoffset, yoffset, |
||
4071 | width, height, format, type, pixels)); |
||
4072 | } |
||
4073 | } |
||
4074 | |||
4075 | |||
4076 | static void GLAPIENTRY |
||
4077 | save_TexSubImage3D(GLenum target, GLint level, |
||
4078 | GLint xoffset, GLint yoffset, GLint zoffset, |
||
4079 | GLsizei width, GLsizei height, GLsizei depth, |
||
4080 | GLenum format, GLenum type, const GLvoid * pixels) |
||
4081 | { |
||
4082 | GET_CURRENT_CONTEXT(ctx); |
||
4083 | Node *n; |
||
4084 | |||
4085 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4086 | |||
4087 | n = alloc_instruction(ctx, OPCODE_TEX_SUB_IMAGE3D, 11); |
||
4088 | if (n) { |
||
4089 | n[1].e = target; |
||
4090 | n[2].i = level; |
||
4091 | n[3].i = xoffset; |
||
4092 | n[4].i = yoffset; |
||
4093 | n[5].i = zoffset; |
||
4094 | n[6].i = (GLint) width; |
||
4095 | n[7].i = (GLint) height; |
||
4096 | n[8].i = (GLint) depth; |
||
4097 | n[9].e = format; |
||
4098 | n[10].e = type; |
||
4099 | n[11].data = unpack_image(ctx, 3, width, height, depth, format, type, |
||
4100 | pixels, &ctx->Unpack); |
||
4101 | } |
||
4102 | if (ctx->ExecuteFlag) { |
||
4103 | CALL_TexSubImage3D(ctx->Exec, (target, level, |
||
4104 | xoffset, yoffset, zoffset, |
||
4105 | width, height, depth, format, type, |
||
4106 | pixels)); |
||
4107 | } |
||
4108 | } |
||
4109 | |||
4110 | |||
4111 | static void GLAPIENTRY |
||
4112 | save_Translatef(GLfloat x, GLfloat y, GLfloat z) |
||
4113 | { |
||
4114 | GET_CURRENT_CONTEXT(ctx); |
||
4115 | Node *n; |
||
4116 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4117 | n = alloc_instruction(ctx, OPCODE_TRANSLATE, 3); |
||
4118 | if (n) { |
||
4119 | n[1].f = x; |
||
4120 | n[2].f = y; |
||
4121 | n[3].f = z; |
||
4122 | } |
||
4123 | if (ctx->ExecuteFlag) { |
||
4124 | CALL_Translatef(ctx->Exec, (x, y, z)); |
||
4125 | } |
||
4126 | } |
||
4127 | |||
4128 | |||
4129 | static void GLAPIENTRY |
||
4130 | save_Translated(GLdouble x, GLdouble y, GLdouble z) |
||
4131 | { |
||
4132 | save_Translatef((GLfloat) x, (GLfloat) y, (GLfloat) z); |
||
4133 | } |
||
4134 | |||
4135 | |||
4136 | |||
4137 | static void GLAPIENTRY |
||
4138 | save_Viewport(GLint x, GLint y, GLsizei width, GLsizei height) |
||
4139 | { |
||
4140 | GET_CURRENT_CONTEXT(ctx); |
||
4141 | Node *n; |
||
4142 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4143 | n = alloc_instruction(ctx, OPCODE_VIEWPORT, 4); |
||
4144 | if (n) { |
||
4145 | n[1].i = x; |
||
4146 | n[2].i = y; |
||
4147 | n[3].i = (GLint) width; |
||
4148 | n[4].i = (GLint) height; |
||
4149 | } |
||
4150 | if (ctx->ExecuteFlag) { |
||
4151 | CALL_Viewport(ctx->Exec, (x, y, width, height)); |
||
4152 | } |
||
4153 | } |
||
4154 | |||
4155 | |||
4156 | static void GLAPIENTRY |
||
4157 | save_WindowPos4fMESA(GLfloat x, GLfloat y, GLfloat z, GLfloat w) |
||
4158 | { |
||
4159 | GET_CURRENT_CONTEXT(ctx); |
||
4160 | Node *n; |
||
4161 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4162 | n = alloc_instruction(ctx, OPCODE_WINDOW_POS, 4); |
||
4163 | if (n) { |
||
4164 | n[1].f = x; |
||
4165 | n[2].f = y; |
||
4166 | n[3].f = z; |
||
4167 | n[4].f = w; |
||
4168 | } |
||
4169 | if (ctx->ExecuteFlag) { |
||
4170 | CALL_WindowPos4fMESA(ctx->Exec, (x, y, z, w)); |
||
4171 | } |
||
4172 | } |
||
4173 | |||
4174 | static void GLAPIENTRY |
||
4175 | save_WindowPos2dMESA(GLdouble x, GLdouble y) |
||
4176 | { |
||
4177 | save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); |
||
4178 | } |
||
4179 | |||
4180 | static void GLAPIENTRY |
||
4181 | save_WindowPos2fMESA(GLfloat x, GLfloat y) |
||
4182 | { |
||
4183 | save_WindowPos4fMESA(x, y, 0.0F, 1.0F); |
||
4184 | } |
||
4185 | |||
4186 | static void GLAPIENTRY |
||
4187 | save_WindowPos2iMESA(GLint x, GLint y) |
||
4188 | { |
||
4189 | save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, 0.0F, 1.0F); |
||
4190 | } |
||
4191 | |||
4192 | static void GLAPIENTRY |
||
4193 | save_WindowPos2sMESA(GLshort x, GLshort y) |
||
4194 | { |
||
4195 | save_WindowPos4fMESA(x, y, 0.0F, 1.0F); |
||
4196 | } |
||
4197 | |||
4198 | static void GLAPIENTRY |
||
4199 | save_WindowPos3dMESA(GLdouble x, GLdouble y, GLdouble z) |
||
4200 | { |
||
4201 | save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); |
||
4202 | } |
||
4203 | |||
4204 | static void GLAPIENTRY |
||
4205 | save_WindowPos3fMESA(GLfloat x, GLfloat y, GLfloat z) |
||
4206 | { |
||
4207 | save_WindowPos4fMESA(x, y, z, 1.0F); |
||
4208 | } |
||
4209 | |||
4210 | static void GLAPIENTRY |
||
4211 | save_WindowPos3iMESA(GLint x, GLint y, GLint z) |
||
4212 | { |
||
4213 | save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F); |
||
4214 | } |
||
4215 | |||
4216 | static void GLAPIENTRY |
||
4217 | save_WindowPos3sMESA(GLshort x, GLshort y, GLshort z) |
||
4218 | { |
||
4219 | save_WindowPos4fMESA(x, y, z, 1.0F); |
||
4220 | } |
||
4221 | |||
4222 | static void GLAPIENTRY |
||
4223 | save_WindowPos4dMESA(GLdouble x, GLdouble y, GLdouble z, GLdouble w) |
||
4224 | { |
||
4225 | save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); |
||
4226 | } |
||
4227 | |||
4228 | static void GLAPIENTRY |
||
4229 | save_WindowPos4iMESA(GLint x, GLint y, GLint z, GLint w) |
||
4230 | { |
||
4231 | save_WindowPos4fMESA((GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w); |
||
4232 | } |
||
4233 | |||
4234 | static void GLAPIENTRY |
||
4235 | save_WindowPos4sMESA(GLshort x, GLshort y, GLshort z, GLshort w) |
||
4236 | { |
||
4237 | save_WindowPos4fMESA(x, y, z, w); |
||
4238 | } |
||
4239 | |||
4240 | static void GLAPIENTRY |
||
4241 | save_WindowPos2dvMESA(const GLdouble * v) |
||
4242 | { |
||
4243 | save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); |
||
4244 | } |
||
4245 | |||
4246 | static void GLAPIENTRY |
||
4247 | save_WindowPos2fvMESA(const GLfloat * v) |
||
4248 | { |
||
4249 | save_WindowPos4fMESA(v[0], v[1], 0.0F, 1.0F); |
||
4250 | } |
||
4251 | |||
4252 | static void GLAPIENTRY |
||
4253 | save_WindowPos2ivMESA(const GLint * v) |
||
4254 | { |
||
4255 | save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], 0.0F, 1.0F); |
||
4256 | } |
||
4257 | |||
4258 | static void GLAPIENTRY |
||
4259 | save_WindowPos2svMESA(const GLshort * v) |
||
4260 | { |
||
4261 | save_WindowPos4fMESA(v[0], v[1], 0.0F, 1.0F); |
||
4262 | } |
||
4263 | |||
4264 | static void GLAPIENTRY |
||
4265 | save_WindowPos3dvMESA(const GLdouble * v) |
||
4266 | { |
||
4267 | save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); |
||
4268 | } |
||
4269 | |||
4270 | static void GLAPIENTRY |
||
4271 | save_WindowPos3fvMESA(const GLfloat * v) |
||
4272 | { |
||
4273 | save_WindowPos4fMESA(v[0], v[1], v[2], 1.0F); |
||
4274 | } |
||
4275 | |||
4276 | static void GLAPIENTRY |
||
4277 | save_WindowPos3ivMESA(const GLint * v) |
||
4278 | { |
||
4279 | save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0F); |
||
4280 | } |
||
4281 | |||
4282 | static void GLAPIENTRY |
||
4283 | save_WindowPos3svMESA(const GLshort * v) |
||
4284 | { |
||
4285 | save_WindowPos4fMESA(v[0], v[1], v[2], 1.0F); |
||
4286 | } |
||
4287 | |||
4288 | static void GLAPIENTRY |
||
4289 | save_WindowPos4dvMESA(const GLdouble * v) |
||
4290 | { |
||
4291 | save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], |
||
4292 | (GLfloat) v[2], (GLfloat) v[3]); |
||
4293 | } |
||
4294 | |||
4295 | static void GLAPIENTRY |
||
4296 | save_WindowPos4fvMESA(const GLfloat * v) |
||
4297 | { |
||
4298 | save_WindowPos4fMESA(v[0], v[1], v[2], v[3]); |
||
4299 | } |
||
4300 | |||
4301 | static void GLAPIENTRY |
||
4302 | save_WindowPos4ivMESA(const GLint * v) |
||
4303 | { |
||
4304 | save_WindowPos4fMESA((GLfloat) v[0], (GLfloat) v[1], |
||
4305 | (GLfloat) v[2], (GLfloat) v[3]); |
||
4306 | } |
||
4307 | |||
4308 | static void GLAPIENTRY |
||
4309 | save_WindowPos4svMESA(const GLshort * v) |
||
4310 | { |
||
4311 | save_WindowPos4fMESA(v[0], v[1], v[2], v[3]); |
||
4312 | } |
||
4313 | |||
4314 | |||
4315 | |||
4316 | /* GL_ARB_multitexture */ |
||
4317 | static void GLAPIENTRY |
||
4318 | save_ActiveTextureARB(GLenum target) |
||
4319 | { |
||
4320 | GET_CURRENT_CONTEXT(ctx); |
||
4321 | Node *n; |
||
4322 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4323 | n = alloc_instruction(ctx, OPCODE_ACTIVE_TEXTURE, 1); |
||
4324 | if (n) { |
||
4325 | n[1].e = target; |
||
4326 | } |
||
4327 | if (ctx->ExecuteFlag) { |
||
4328 | CALL_ActiveTextureARB(ctx->Exec, (target)); |
||
4329 | } |
||
4330 | } |
||
4331 | |||
4332 | |||
4333 | /* GL_ARB_transpose_matrix */ |
||
4334 | |||
4335 | static void GLAPIENTRY |
||
4336 | save_LoadTransposeMatrixdARB(const GLdouble m[16]) |
||
4337 | { |
||
4338 | GLfloat tm[16]; |
||
4339 | _math_transposefd(tm, m); |
||
4340 | save_LoadMatrixf(tm); |
||
4341 | } |
||
4342 | |||
4343 | |||
4344 | static void GLAPIENTRY |
||
4345 | save_LoadTransposeMatrixfARB(const GLfloat m[16]) |
||
4346 | { |
||
4347 | GLfloat tm[16]; |
||
4348 | _math_transposef(tm, m); |
||
4349 | save_LoadMatrixf(tm); |
||
4350 | } |
||
4351 | |||
4352 | |||
4353 | static void GLAPIENTRY |
||
4354 | save_MultTransposeMatrixdARB(const GLdouble m[16]) |
||
4355 | { |
||
4356 | GLfloat tm[16]; |
||
4357 | _math_transposefd(tm, m); |
||
4358 | save_MultMatrixf(tm); |
||
4359 | } |
||
4360 | |||
4361 | |||
4362 | static void GLAPIENTRY |
||
4363 | save_MultTransposeMatrixfARB(const GLfloat m[16]) |
||
4364 | { |
||
4365 | GLfloat tm[16]; |
||
4366 | _math_transposef(tm, m); |
||
4367 | save_MultMatrixf(tm); |
||
4368 | } |
||
4369 | |||
4370 | |||
4371 | /* GL_ARB_texture_compression */ |
||
4372 | static void GLAPIENTRY |
||
4373 | save_CompressedTexImage1DARB(GLenum target, GLint level, |
||
4374 | GLenum internalFormat, GLsizei width, |
||
4375 | GLint border, GLsizei imageSize, |
||
4376 | const GLvoid * data) |
||
4377 | { |
||
4378 | GET_CURRENT_CONTEXT(ctx); |
||
4379 | if (target == GL_PROXY_TEXTURE_1D) { |
||
4380 | /* don't compile, execute immediately */ |
||
4381 | CALL_CompressedTexImage1DARB(ctx->Exec, (target, level, internalFormat, |
||
4382 | width, border, imageSize, |
||
4383 | data)); |
||
4384 | } |
||
4385 | else { |
||
4386 | Node *n; |
||
4387 | GLvoid *image; |
||
4388 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4389 | /* make copy of image */ |
||
4390 | image = malloc(imageSize); |
||
4391 | if (!image) { |
||
4392 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage1DARB"); |
||
4393 | return; |
||
4394 | } |
||
4395 | memcpy(image, data, imageSize); |
||
4396 | n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_IMAGE_1D, 7); |
||
4397 | if (n) { |
||
4398 | n[1].e = target; |
||
4399 | n[2].i = level; |
||
4400 | n[3].e = internalFormat; |
||
4401 | n[4].i = (GLint) width; |
||
4402 | n[5].i = border; |
||
4403 | n[6].i = imageSize; |
||
4404 | n[7].data = image; |
||
4405 | } |
||
4406 | else if (image) { |
||
4407 | free(image); |
||
4408 | } |
||
4409 | if (ctx->ExecuteFlag) { |
||
4410 | CALL_CompressedTexImage1DARB(ctx->Exec, |
||
4411 | (target, level, internalFormat, width, |
||
4412 | border, imageSize, data)); |
||
4413 | } |
||
4414 | } |
||
4415 | } |
||
4416 | |||
4417 | |||
4418 | static void GLAPIENTRY |
||
4419 | save_CompressedTexImage2DARB(GLenum target, GLint level, |
||
4420 | GLenum internalFormat, GLsizei width, |
||
4421 | GLsizei height, GLint border, GLsizei imageSize, |
||
4422 | const GLvoid * data) |
||
4423 | { |
||
4424 | GET_CURRENT_CONTEXT(ctx); |
||
4425 | if (target == GL_PROXY_TEXTURE_2D) { |
||
4426 | /* don't compile, execute immediately */ |
||
4427 | CALL_CompressedTexImage2DARB(ctx->Exec, (target, level, internalFormat, |
||
4428 | width, height, border, |
||
4429 | imageSize, data)); |
||
4430 | } |
||
4431 | else { |
||
4432 | Node *n; |
||
4433 | GLvoid *image; |
||
4434 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4435 | /* make copy of image */ |
||
4436 | image = malloc(imageSize); |
||
4437 | if (!image) { |
||
4438 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2DARB"); |
||
4439 | return; |
||
4440 | } |
||
4441 | memcpy(image, data, imageSize); |
||
4442 | n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_IMAGE_2D, 8); |
||
4443 | if (n) { |
||
4444 | n[1].e = target; |
||
4445 | n[2].i = level; |
||
4446 | n[3].e = internalFormat; |
||
4447 | n[4].i = (GLint) width; |
||
4448 | n[5].i = (GLint) height; |
||
4449 | n[6].i = border; |
||
4450 | n[7].i = imageSize; |
||
4451 | n[8].data = image; |
||
4452 | } |
||
4453 | else if (image) { |
||
4454 | free(image); |
||
4455 | } |
||
4456 | if (ctx->ExecuteFlag) { |
||
4457 | CALL_CompressedTexImage2DARB(ctx->Exec, |
||
4458 | (target, level, internalFormat, width, |
||
4459 | height, border, imageSize, data)); |
||
4460 | } |
||
4461 | } |
||
4462 | } |
||
4463 | |||
4464 | |||
4465 | static void GLAPIENTRY |
||
4466 | save_CompressedTexImage3DARB(GLenum target, GLint level, |
||
4467 | GLenum internalFormat, GLsizei width, |
||
4468 | GLsizei height, GLsizei depth, GLint border, |
||
4469 | GLsizei imageSize, const GLvoid * data) |
||
4470 | { |
||
4471 | GET_CURRENT_CONTEXT(ctx); |
||
4472 | if (target == GL_PROXY_TEXTURE_3D) { |
||
4473 | /* don't compile, execute immediately */ |
||
4474 | CALL_CompressedTexImage3DARB(ctx->Exec, (target, level, internalFormat, |
||
4475 | width, height, depth, border, |
||
4476 | imageSize, data)); |
||
4477 | } |
||
4478 | else { |
||
4479 | Node *n; |
||
4480 | GLvoid *image; |
||
4481 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4482 | /* make copy of image */ |
||
4483 | image = malloc(imageSize); |
||
4484 | if (!image) { |
||
4485 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage3DARB"); |
||
4486 | return; |
||
4487 | } |
||
4488 | memcpy(image, data, imageSize); |
||
4489 | n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_IMAGE_3D, 9); |
||
4490 | if (n) { |
||
4491 | n[1].e = target; |
||
4492 | n[2].i = level; |
||
4493 | n[3].e = internalFormat; |
||
4494 | n[4].i = (GLint) width; |
||
4495 | n[5].i = (GLint) height; |
||
4496 | n[6].i = (GLint) depth; |
||
4497 | n[7].i = border; |
||
4498 | n[8].i = imageSize; |
||
4499 | n[9].data = image; |
||
4500 | } |
||
4501 | else if (image) { |
||
4502 | free(image); |
||
4503 | } |
||
4504 | if (ctx->ExecuteFlag) { |
||
4505 | CALL_CompressedTexImage3DARB(ctx->Exec, |
||
4506 | (target, level, internalFormat, width, |
||
4507 | height, depth, border, imageSize, |
||
4508 | data)); |
||
4509 | } |
||
4510 | } |
||
4511 | } |
||
4512 | |||
4513 | |||
4514 | static void GLAPIENTRY |
||
4515 | save_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, |
||
4516 | GLsizei width, GLenum format, |
||
4517 | GLsizei imageSize, const GLvoid * data) |
||
4518 | { |
||
4519 | Node *n; |
||
4520 | GLvoid *image; |
||
4521 | |||
4522 | GET_CURRENT_CONTEXT(ctx); |
||
4523 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4524 | |||
4525 | /* make copy of image */ |
||
4526 | image = malloc(imageSize); |
||
4527 | if (!image) { |
||
4528 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage1DARB"); |
||
4529 | return; |
||
4530 | } |
||
4531 | memcpy(image, data, imageSize); |
||
4532 | n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D, 7); |
||
4533 | if (n) { |
||
4534 | n[1].e = target; |
||
4535 | n[2].i = level; |
||
4536 | n[3].i = xoffset; |
||
4537 | n[4].i = (GLint) width; |
||
4538 | n[5].e = format; |
||
4539 | n[6].i = imageSize; |
||
4540 | n[7].data = image; |
||
4541 | } |
||
4542 | else if (image) { |
||
4543 | free(image); |
||
4544 | } |
||
4545 | if (ctx->ExecuteFlag) { |
||
4546 | CALL_CompressedTexSubImage1DARB(ctx->Exec, (target, level, xoffset, |
||
4547 | width, format, imageSize, |
||
4548 | data)); |
||
4549 | } |
||
4550 | } |
||
4551 | |||
4552 | |||
4553 | static void GLAPIENTRY |
||
4554 | save_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, |
||
4555 | GLint yoffset, GLsizei width, GLsizei height, |
||
4556 | GLenum format, GLsizei imageSize, |
||
4557 | const GLvoid * data) |
||
4558 | { |
||
4559 | Node *n; |
||
4560 | GLvoid *image; |
||
4561 | |||
4562 | GET_CURRENT_CONTEXT(ctx); |
||
4563 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4564 | |||
4565 | /* make copy of image */ |
||
4566 | image = malloc(imageSize); |
||
4567 | if (!image) { |
||
4568 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2DARB"); |
||
4569 | return; |
||
4570 | } |
||
4571 | memcpy(image, data, imageSize); |
||
4572 | n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D, 9); |
||
4573 | if (n) { |
||
4574 | n[1].e = target; |
||
4575 | n[2].i = level; |
||
4576 | n[3].i = xoffset; |
||
4577 | n[4].i = yoffset; |
||
4578 | n[5].i = (GLint) width; |
||
4579 | n[6].i = (GLint) height; |
||
4580 | n[7].e = format; |
||
4581 | n[8].i = imageSize; |
||
4582 | n[9].data = image; |
||
4583 | } |
||
4584 | else if (image) { |
||
4585 | free(image); |
||
4586 | } |
||
4587 | if (ctx->ExecuteFlag) { |
||
4588 | CALL_CompressedTexSubImage2DARB(ctx->Exec, |
||
4589 | (target, level, xoffset, yoffset, width, |
||
4590 | height, format, imageSize, data)); |
||
4591 | } |
||
4592 | } |
||
4593 | |||
4594 | |||
4595 | static void GLAPIENTRY |
||
4596 | save_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, |
||
4597 | GLint yoffset, GLint zoffset, GLsizei width, |
||
4598 | GLsizei height, GLsizei depth, GLenum format, |
||
4599 | GLsizei imageSize, const GLvoid * data) |
||
4600 | { |
||
4601 | Node *n; |
||
4602 | GLvoid *image; |
||
4603 | |||
4604 | GET_CURRENT_CONTEXT(ctx); |
||
4605 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4606 | |||
4607 | /* make copy of image */ |
||
4608 | image = malloc(imageSize); |
||
4609 | if (!image) { |
||
4610 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage3DARB"); |
||
4611 | return; |
||
4612 | } |
||
4613 | memcpy(image, data, imageSize); |
||
4614 | n = alloc_instruction(ctx, OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D, 11); |
||
4615 | if (n) { |
||
4616 | n[1].e = target; |
||
4617 | n[2].i = level; |
||
4618 | n[3].i = xoffset; |
||
4619 | n[4].i = yoffset; |
||
4620 | n[5].i = zoffset; |
||
4621 | n[6].i = (GLint) width; |
||
4622 | n[7].i = (GLint) height; |
||
4623 | n[8].i = (GLint) depth; |
||
4624 | n[9].e = format; |
||
4625 | n[10].i = imageSize; |
||
4626 | n[11].data = image; |
||
4627 | } |
||
4628 | else if (image) { |
||
4629 | free(image); |
||
4630 | } |
||
4631 | if (ctx->ExecuteFlag) { |
||
4632 | CALL_CompressedTexSubImage3DARB(ctx->Exec, |
||
4633 | (target, level, xoffset, yoffset, |
||
4634 | zoffset, width, height, depth, format, |
||
4635 | imageSize, data)); |
||
4636 | } |
||
4637 | } |
||
4638 | |||
4639 | |||
4640 | /* GL_ARB_multisample */ |
||
4641 | static void GLAPIENTRY |
||
4642 | save_SampleCoverageARB(GLclampf value, GLboolean invert) |
||
4643 | { |
||
4644 | GET_CURRENT_CONTEXT(ctx); |
||
4645 | Node *n; |
||
4646 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4647 | n = alloc_instruction(ctx, OPCODE_SAMPLE_COVERAGE, 2); |
||
4648 | if (n) { |
||
4649 | n[1].f = value; |
||
4650 | n[2].b = invert; |
||
4651 | } |
||
4652 | if (ctx->ExecuteFlag) { |
||
4653 | CALL_SampleCoverageARB(ctx->Exec, (value, invert)); |
||
4654 | } |
||
4655 | } |
||
4656 | |||
4657 | |||
4658 | /* |
||
4659 | * GL_NV_vertex_program |
||
4660 | */ |
||
4661 | #if FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program |
||
4662 | static void GLAPIENTRY |
||
4663 | save_BindProgramNV(GLenum target, GLuint id) |
||
4664 | { |
||
4665 | GET_CURRENT_CONTEXT(ctx); |
||
4666 | Node *n; |
||
4667 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4668 | n = alloc_instruction(ctx, OPCODE_BIND_PROGRAM_NV, 2); |
||
4669 | if (n) { |
||
4670 | n[1].e = target; |
||
4671 | n[2].ui = id; |
||
4672 | } |
||
4673 | if (ctx->ExecuteFlag) { |
||
4674 | CALL_BindProgramNV(ctx->Exec, (target, id)); |
||
4675 | } |
||
4676 | } |
||
4677 | |||
4678 | static void GLAPIENTRY |
||
4679 | save_ProgramEnvParameter4fARB(GLenum target, GLuint index, |
||
4680 | GLfloat x, GLfloat y, GLfloat z, GLfloat w) |
||
4681 | { |
||
4682 | GET_CURRENT_CONTEXT(ctx); |
||
4683 | Node *n; |
||
4684 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4685 | n = alloc_instruction(ctx, OPCODE_PROGRAM_ENV_PARAMETER_ARB, 6); |
||
4686 | if (n) { |
||
4687 | n[1].e = target; |
||
4688 | n[2].ui = index; |
||
4689 | n[3].f = x; |
||
4690 | n[4].f = y; |
||
4691 | n[5].f = z; |
||
4692 | n[6].f = w; |
||
4693 | } |
||
4694 | if (ctx->ExecuteFlag) { |
||
4695 | CALL_ProgramEnvParameter4fARB(ctx->Exec, (target, index, x, y, z, w)); |
||
4696 | } |
||
4697 | } |
||
4698 | |||
4699 | |||
4700 | static void GLAPIENTRY |
||
4701 | save_ProgramEnvParameter4fvARB(GLenum target, GLuint index, |
||
4702 | const GLfloat *params) |
||
4703 | { |
||
4704 | save_ProgramEnvParameter4fARB(target, index, params[0], params[1], |
||
4705 | params[2], params[3]); |
||
4706 | } |
||
4707 | |||
4708 | |||
4709 | static void GLAPIENTRY |
||
4710 | save_ProgramEnvParameters4fvEXT(GLenum target, GLuint index, GLsizei count, |
||
4711 | const GLfloat * params) |
||
4712 | { |
||
4713 | GET_CURRENT_CONTEXT(ctx); |
||
4714 | Node *n; |
||
4715 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4716 | |||
4717 | if (count > 0) { |
||
4718 | GLint i; |
||
4719 | const GLfloat * p = params; |
||
4720 | |||
4721 | for (i = 0 ; i < count ; i++) { |
||
4722 | n = alloc_instruction(ctx, OPCODE_PROGRAM_ENV_PARAMETER_ARB, 6); |
||
4723 | if (n) { |
||
4724 | n[1].e = target; |
||
4725 | n[2].ui = index; |
||
4726 | n[3].f = p[0]; |
||
4727 | n[4].f = p[1]; |
||
4728 | n[5].f = p[2]; |
||
4729 | n[6].f = p[3]; |
||
4730 | p += 4; |
||
4731 | } |
||
4732 | } |
||
4733 | } |
||
4734 | |||
4735 | if (ctx->ExecuteFlag) { |
||
4736 | CALL_ProgramEnvParameters4fvEXT(ctx->Exec, (target, index, count, params)); |
||
4737 | } |
||
4738 | } |
||
4739 | |||
4740 | |||
4741 | static void GLAPIENTRY |
||
4742 | save_ProgramEnvParameter4dARB(GLenum target, GLuint index, |
||
4743 | GLdouble x, GLdouble y, GLdouble z, GLdouble w) |
||
4744 | { |
||
4745 | save_ProgramEnvParameter4fARB(target, index, |
||
4746 | (GLfloat) x, |
||
4747 | (GLfloat) y, (GLfloat) z, (GLfloat) w); |
||
4748 | } |
||
4749 | |||
4750 | |||
4751 | static void GLAPIENTRY |
||
4752 | save_ProgramEnvParameter4dvARB(GLenum target, GLuint index, |
||
4753 | const GLdouble *params) |
||
4754 | { |
||
4755 | save_ProgramEnvParameter4fARB(target, index, |
||
4756 | (GLfloat) params[0], |
||
4757 | (GLfloat) params[1], |
||
4758 | (GLfloat) params[2], (GLfloat) params[3]); |
||
4759 | } |
||
4760 | |||
4761 | #endif /* FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program || FEATURE_NV_vertex_program */ |
||
4762 | |||
4763 | #if FEATURE_NV_vertex_program |
||
4764 | static void GLAPIENTRY |
||
4765 | save_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params) |
||
4766 | { |
||
4767 | GET_CURRENT_CONTEXT(ctx); |
||
4768 | Node *n; |
||
4769 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4770 | n = alloc_instruction(ctx, OPCODE_EXECUTE_PROGRAM_NV, 6); |
||
4771 | if (n) { |
||
4772 | n[1].e = target; |
||
4773 | n[2].ui = id; |
||
4774 | n[3].f = params[0]; |
||
4775 | n[4].f = params[1]; |
||
4776 | n[5].f = params[2]; |
||
4777 | n[6].f = params[3]; |
||
4778 | } |
||
4779 | if (ctx->ExecuteFlag) { |
||
4780 | CALL_ExecuteProgramNV(ctx->Exec, (target, id, params)); |
||
4781 | } |
||
4782 | } |
||
4783 | |||
4784 | |||
4785 | static void GLAPIENTRY |
||
4786 | save_ProgramParameters4dvNV(GLenum target, GLuint index, |
||
4787 | GLsizei num, const GLdouble *params) |
||
4788 | { |
||
4789 | GLint i; |
||
4790 | for (i = 0; i < num; i++) { |
||
4791 | save_ProgramEnvParameter4dvARB(target, index + i, params + 4 * i); |
||
4792 | } |
||
4793 | } |
||
4794 | |||
4795 | |||
4796 | static void GLAPIENTRY |
||
4797 | save_ProgramParameters4fvNV(GLenum target, GLuint index, |
||
4798 | GLsizei num, const GLfloat *params) |
||
4799 | { |
||
4800 | GLint i; |
||
4801 | for (i = 0; i < num; i++) { |
||
4802 | save_ProgramEnvParameter4fvARB(target, index + i, params + 4 * i); |
||
4803 | } |
||
4804 | } |
||
4805 | |||
4806 | |||
4807 | static void GLAPIENTRY |
||
4808 | save_LoadProgramNV(GLenum target, GLuint id, GLsizei len, |
||
4809 | const GLubyte * program) |
||
4810 | { |
||
4811 | GET_CURRENT_CONTEXT(ctx); |
||
4812 | Node *n; |
||
4813 | |||
4814 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4815 | |||
4816 | n = alloc_instruction(ctx, OPCODE_LOAD_PROGRAM_NV, 4); |
||
4817 | if (n) { |
||
4818 | GLubyte *programCopy = (GLubyte *) malloc(len); |
||
4819 | if (!programCopy) { |
||
4820 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV"); |
||
4821 | return; |
||
4822 | } |
||
4823 | memcpy(programCopy, program, len); |
||
4824 | n[1].e = target; |
||
4825 | n[2].ui = id; |
||
4826 | n[3].i = len; |
||
4827 | n[4].data = programCopy; |
||
4828 | } |
||
4829 | if (ctx->ExecuteFlag) { |
||
4830 | CALL_LoadProgramNV(ctx->Exec, (target, id, len, program)); |
||
4831 | } |
||
4832 | } |
||
4833 | |||
4834 | |||
4835 | static void GLAPIENTRY |
||
4836 | save_RequestResidentProgramsNV(GLsizei num, const GLuint * ids) |
||
4837 | { |
||
4838 | GET_CURRENT_CONTEXT(ctx); |
||
4839 | Node *n; |
||
4840 | |||
4841 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4842 | |||
4843 | n = alloc_instruction(ctx, OPCODE_TRACK_MATRIX_NV, 2); |
||
4844 | if (n) { |
||
4845 | GLuint *idCopy = (GLuint *) malloc(num * sizeof(GLuint)); |
||
4846 | if (!idCopy) { |
||
4847 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "glRequestResidentProgramsNV"); |
||
4848 | return; |
||
4849 | } |
||
4850 | memcpy(idCopy, ids, num * sizeof(GLuint)); |
||
4851 | n[1].i = num; |
||
4852 | n[2].data = idCopy; |
||
4853 | } |
||
4854 | if (ctx->ExecuteFlag) { |
||
4855 | CALL_RequestResidentProgramsNV(ctx->Exec, (num, ids)); |
||
4856 | } |
||
4857 | } |
||
4858 | |||
4859 | |||
4860 | static void GLAPIENTRY |
||
4861 | save_TrackMatrixNV(GLenum target, GLuint address, |
||
4862 | GLenum matrix, GLenum transform) |
||
4863 | { |
||
4864 | GET_CURRENT_CONTEXT(ctx); |
||
4865 | Node *n; |
||
4866 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4867 | n = alloc_instruction(ctx, OPCODE_TRACK_MATRIX_NV, 4); |
||
4868 | if (n) { |
||
4869 | n[1].e = target; |
||
4870 | n[2].ui = address; |
||
4871 | n[3].e = matrix; |
||
4872 | n[4].e = transform; |
||
4873 | } |
||
4874 | if (ctx->ExecuteFlag) { |
||
4875 | CALL_TrackMatrixNV(ctx->Exec, (target, address, matrix, transform)); |
||
4876 | } |
||
4877 | } |
||
4878 | #endif /* FEATURE_NV_vertex_program */ |
||
4879 | |||
4880 | |||
4881 | /* |
||
4882 | * GL_NV_fragment_program |
||
4883 | */ |
||
4884 | #if FEATURE_NV_fragment_program |
||
4885 | static void GLAPIENTRY |
||
4886 | save_ProgramLocalParameter4fARB(GLenum target, GLuint index, |
||
4887 | GLfloat x, GLfloat y, GLfloat z, GLfloat w) |
||
4888 | { |
||
4889 | GET_CURRENT_CONTEXT(ctx); |
||
4890 | Node *n; |
||
4891 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4892 | n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6); |
||
4893 | if (n) { |
||
4894 | n[1].e = target; |
||
4895 | n[2].ui = index; |
||
4896 | n[3].f = x; |
||
4897 | n[4].f = y; |
||
4898 | n[5].f = z; |
||
4899 | n[6].f = w; |
||
4900 | } |
||
4901 | if (ctx->ExecuteFlag) { |
||
4902 | CALL_ProgramLocalParameter4fARB(ctx->Exec, (target, index, x, y, z, w)); |
||
4903 | } |
||
4904 | } |
||
4905 | |||
4906 | |||
4907 | static void GLAPIENTRY |
||
4908 | save_ProgramLocalParameter4fvARB(GLenum target, GLuint index, |
||
4909 | const GLfloat *params) |
||
4910 | { |
||
4911 | GET_CURRENT_CONTEXT(ctx); |
||
4912 | Node *n; |
||
4913 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4914 | n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6); |
||
4915 | if (n) { |
||
4916 | n[1].e = target; |
||
4917 | n[2].ui = index; |
||
4918 | n[3].f = params[0]; |
||
4919 | n[4].f = params[1]; |
||
4920 | n[5].f = params[2]; |
||
4921 | n[6].f = params[3]; |
||
4922 | } |
||
4923 | if (ctx->ExecuteFlag) { |
||
4924 | CALL_ProgramLocalParameter4fvARB(ctx->Exec, (target, index, params)); |
||
4925 | } |
||
4926 | } |
||
4927 | |||
4928 | |||
4929 | static void GLAPIENTRY |
||
4930 | save_ProgramLocalParameters4fvEXT(GLenum target, GLuint index, GLsizei count, |
||
4931 | const GLfloat *params) |
||
4932 | { |
||
4933 | GET_CURRENT_CONTEXT(ctx); |
||
4934 | Node *n; |
||
4935 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4936 | |||
4937 | if (count > 0) { |
||
4938 | GLint i; |
||
4939 | const GLfloat * p = params; |
||
4940 | |||
4941 | for (i = 0 ; i < count ; i++) { |
||
4942 | n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6); |
||
4943 | if (n) { |
||
4944 | n[1].e = target; |
||
4945 | n[2].ui = index; |
||
4946 | n[3].f = p[0]; |
||
4947 | n[4].f = p[1]; |
||
4948 | n[5].f = p[2]; |
||
4949 | n[6].f = p[3]; |
||
4950 | p += 4; |
||
4951 | } |
||
4952 | } |
||
4953 | } |
||
4954 | |||
4955 | if (ctx->ExecuteFlag) { |
||
4956 | CALL_ProgramLocalParameters4fvEXT(ctx->Exec, (target, index, count, params)); |
||
4957 | } |
||
4958 | } |
||
4959 | |||
4960 | |||
4961 | static void GLAPIENTRY |
||
4962 | save_ProgramLocalParameter4dARB(GLenum target, GLuint index, |
||
4963 | GLdouble x, GLdouble y, |
||
4964 | GLdouble z, GLdouble w) |
||
4965 | { |
||
4966 | GET_CURRENT_CONTEXT(ctx); |
||
4967 | Node *n; |
||
4968 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4969 | n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6); |
||
4970 | if (n) { |
||
4971 | n[1].e = target; |
||
4972 | n[2].ui = index; |
||
4973 | n[3].f = (GLfloat) x; |
||
4974 | n[4].f = (GLfloat) y; |
||
4975 | n[5].f = (GLfloat) z; |
||
4976 | n[6].f = (GLfloat) w; |
||
4977 | } |
||
4978 | if (ctx->ExecuteFlag) { |
||
4979 | CALL_ProgramLocalParameter4dARB(ctx->Exec, (target, index, x, y, z, w)); |
||
4980 | } |
||
4981 | } |
||
4982 | |||
4983 | |||
4984 | static void GLAPIENTRY |
||
4985 | save_ProgramLocalParameter4dvARB(GLenum target, GLuint index, |
||
4986 | const GLdouble *params) |
||
4987 | { |
||
4988 | GET_CURRENT_CONTEXT(ctx); |
||
4989 | Node *n; |
||
4990 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
4991 | n = alloc_instruction(ctx, OPCODE_PROGRAM_LOCAL_PARAMETER_ARB, 6); |
||
4992 | if (n) { |
||
4993 | n[1].e = target; |
||
4994 | n[2].ui = index; |
||
4995 | n[3].f = (GLfloat) params[0]; |
||
4996 | n[4].f = (GLfloat) params[1]; |
||
4997 | n[5].f = (GLfloat) params[2]; |
||
4998 | n[6].f = (GLfloat) params[3]; |
||
4999 | } |
||
5000 | if (ctx->ExecuteFlag) { |
||
5001 | CALL_ProgramLocalParameter4dvARB(ctx->Exec, (target, index, params)); |
||
5002 | } |
||
5003 | } |
||
5004 | |||
5005 | static void GLAPIENTRY |
||
5006 | save_ProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte * name, |
||
5007 | GLfloat x, GLfloat y, GLfloat z, GLfloat w) |
||
5008 | { |
||
5009 | GET_CURRENT_CONTEXT(ctx); |
||
5010 | Node *n; |
||
5011 | |||
5012 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
5013 | |||
5014 | n = alloc_instruction(ctx, OPCODE_PROGRAM_NAMED_PARAMETER_NV, 6); |
||
5015 | if (n) { |
||
5016 | GLubyte *nameCopy = (GLubyte *) malloc(len); |
||
5017 | if (!nameCopy) { |
||
5018 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramNamedParameter4fNV"); |
||
5019 | return; |
||
5020 | } |
||
5021 | memcpy(nameCopy, name, len); |
||
5022 | n[1].ui = id; |
||
5023 | n[2].i = len; |
||
5024 | n[3].data = nameCopy; |
||
5025 | n[4].f = x; |
||
5026 | n[5].f = y; |
||
5027 | n[6].f = z; |
||
5028 | n[7].f = w; |
||
5029 | } |
||
5030 | if (ctx->ExecuteFlag) { |
||
5031 | CALL_ProgramNamedParameter4fNV(ctx->Exec, (id, len, name, x, y, z, w)); |
||
5032 | } |
||
5033 | } |
||
5034 | |||
5035 | |||
5036 | static void GLAPIENTRY |
||
5037 | save_ProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte * name, |
||
5038 | const float v[]) |
||
5039 | { |
||
5040 | save_ProgramNamedParameter4fNV(id, len, name, v[0], v[1], v[2], v[3]); |
||
5041 | } |
||
5042 | |||
5043 | |||
5044 | static void GLAPIENTRY |
||
5045 | save_ProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte * name, |
||
5046 | GLdouble x, GLdouble y, GLdouble z, GLdouble w) |
||
5047 | { |
||
5048 | save_ProgramNamedParameter4fNV(id, len, name, (GLfloat) x, (GLfloat) y, |
||
5049 | (GLfloat) z, (GLfloat) w); |
||
5050 | } |
||
5051 | |||
5052 | |||
5053 | static void GLAPIENTRY |
||
5054 | save_ProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte * name, |
||
5055 | const double v[]) |
||
5056 | { |
||
5057 | save_ProgramNamedParameter4fNV(id, len, name, (GLfloat) v[0], |
||
5058 | (GLfloat) v[1], (GLfloat) v[2], |
||
5059 | (GLfloat) v[3]); |
||
5060 | } |
||
5061 | |||
5062 | #endif /* FEATURE_NV_fragment_program */ |
||
5063 | |||
5064 | |||
5065 | |||
5066 | /* GL_EXT_stencil_two_side */ |
||
5067 | static void GLAPIENTRY |
||
5068 | save_ActiveStencilFaceEXT(GLenum face) |
||
5069 | { |
||
5070 | GET_CURRENT_CONTEXT(ctx); |
||
5071 | Node *n; |
||
5072 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
5073 | n = alloc_instruction(ctx, OPCODE_ACTIVE_STENCIL_FACE_EXT, 1); |
||
5074 | if (n) { |
||
5075 | n[1].e = face; |
||
5076 | } |
||
5077 | if (ctx->ExecuteFlag) { |
||
5078 | CALL_ActiveStencilFaceEXT(ctx->Exec, (face)); |
||
5079 | } |
||
5080 | } |
||
5081 | |||
5082 | |||
5083 | /* GL_EXT_depth_bounds_test */ |
||
5084 | static void GLAPIENTRY |
||
5085 | save_DepthBoundsEXT(GLclampd zmin, GLclampd zmax) |
||
5086 | { |
||
5087 | GET_CURRENT_CONTEXT(ctx); |
||
5088 | Node *n; |
||
5089 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
5090 | n = alloc_instruction(ctx, OPCODE_DEPTH_BOUNDS_EXT, 2); |
||
5091 | if (n) { |
||
5092 | n[1].f = (GLfloat) zmin; |
||
5093 | n[2].f = (GLfloat) zmax; |
||
5094 | } |
||
5095 | if (ctx->ExecuteFlag) { |
||
5096 | CALL_DepthBoundsEXT(ctx->Exec, (zmin, zmax)); |
||
5097 | } |
||
5098 | } |
||
5099 | |||
5100 | |||
5101 | |||
5102 | #if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program |
||
5103 | |||
5104 | static void GLAPIENTRY |
||
5105 | save_ProgramStringARB(GLenum target, GLenum format, GLsizei len, |
||
5106 | const GLvoid * string) |
||
5107 | { |
||
5108 | GET_CURRENT_CONTEXT(ctx); |
||
5109 | Node *n; |
||
5110 | |||
5111 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
5112 | |||
5113 | n = alloc_instruction(ctx, OPCODE_PROGRAM_STRING_ARB, 4); |
||
5114 | if (n) { |
||
5115 | GLubyte *programCopy = (GLubyte *) malloc(len); |
||
5116 | if (!programCopy) { |
||
5117 | _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB"); |
||
5118 | return; |
||
5119 | } |
||
5120 | memcpy(programCopy, string, len); |
||
5121 | n[1].e = target; |
||
5122 | n[2].e = format; |
||
5123 | n[3].i = len; |
||
5124 | n[4].data = programCopy; |
||
5125 | } |
||
5126 | if (ctx->ExecuteFlag) { |
||
5127 | CALL_ProgramStringARB(ctx->Exec, (target, format, len, string)); |
||
5128 | } |
||
5129 | } |
||
5130 | |||
5131 | #endif /* FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program */ |
||
5132 | |||
5133 | |||
5134 | #if FEATURE_queryobj |
||
5135 | |||
5136 | static void GLAPIENTRY |
||
5137 | save_BeginQueryARB(GLenum target, GLuint id) |
||
5138 | { |
||
5139 | GET_CURRENT_CONTEXT(ctx); |
||
5140 | Node *n; |
||
5141 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
5142 | n = alloc_instruction(ctx, OPCODE_BEGIN_QUERY_ARB, 2); |
||
5143 | if (n) { |
||
5144 | n[1].e = target; |
||
5145 | n[2].ui = id; |
||
5146 | } |
||
5147 | if (ctx->ExecuteFlag) { |
||
5148 | CALL_BeginQueryARB(ctx->Exec, (target, id)); |
||
5149 | } |
||
5150 | } |
||
5151 | |||
5152 | |||
5153 | static void GLAPIENTRY |
||
5154 | save_EndQueryARB(GLenum target) |
||
5155 | { |
||
5156 | GET_CURRENT_CONTEXT(ctx); |
||
5157 | Node *n; |
||
5158 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
5159 | n = alloc_instruction(ctx, OPCODE_END_QUERY_ARB, 1); |
||
5160 | if (n) { |
||
5161 | n[1].e = target; |
||
5162 | } |
||
5163 | if (ctx->ExecuteFlag) { |
||
5164 | CALL_EndQueryARB(ctx->Exec, (target)); |
||
5165 | } |
||
5166 | } |
||
5167 | |||
5168 | #endif /* FEATURE_queryobj */ |
||
5169 | |||
5170 | |||
5171 | static void GLAPIENTRY |
||
5172 | save_DrawBuffersARB(GLsizei count, const GLenum * buffers) |
||
5173 | { |
||
5174 | GET_CURRENT_CONTEXT(ctx); |
||
5175 | Node *n; |
||
5176 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
5177 | n = alloc_instruction(ctx, OPCODE_DRAW_BUFFERS_ARB, 1 + MAX_DRAW_BUFFERS); |
||
5178 | if (n) { |
||
5179 | GLint i; |
||
5180 | n[1].i = count; |
||
5181 | if (count > MAX_DRAW_BUFFERS) |
||
5182 | count = MAX_DRAW_BUFFERS; |
||
5183 | for (i = 0; i < count; i++) { |
||
5184 | n[2 + i].e = buffers[i]; |
||
5185 | } |
||
5186 | } |
||
5187 | if (ctx->ExecuteFlag) { |
||
5188 | CALL_DrawBuffersARB(ctx->Exec, (count, buffers)); |
||
5189 | } |
||
5190 | } |
||
5191 | |||
5192 | static void GLAPIENTRY |
||
5193 | save_TexBumpParameterfvATI(GLenum pname, const GLfloat *param) |
||
5194 | { |
||
5195 | GET_CURRENT_CONTEXT(ctx); |
||
5196 | Node *n; |
||
5197 | |||
5198 | n = alloc_instruction(ctx, OPCODE_TEX_BUMP_PARAMETER_ATI, 5); |
||
5199 | if (n) { |
||
5200 | n[1].ui = pname; |
||
5201 | n[2].f = param[0]; |
||
5202 | n[3].f = param[1]; |
||
5203 | n[4].f = param[2]; |
||
5204 | n[5].f = param[3]; |
||
5205 | } |
||
5206 | if (ctx->ExecuteFlag) { |
||
5207 | CALL_TexBumpParameterfvATI(ctx->Exec, (pname, param)); |
||
5208 | } |
||
5209 | } |
||
5210 | |||
5211 | static void GLAPIENTRY |
||
5212 | save_TexBumpParameterivATI(GLenum pname, const GLint *param) |
||
5213 | { |
||
5214 | GLfloat p[4]; |
||
5215 | p[0] = INT_TO_FLOAT(param[0]); |
||
5216 | p[1] = INT_TO_FLOAT(param[1]); |
||
5217 | p[2] = INT_TO_FLOAT(param[2]); |
||
5218 | p[3] = INT_TO_FLOAT(param[3]); |
||
5219 | save_TexBumpParameterfvATI(pname, p); |
||
5220 | } |
||
5221 | |||
5222 | #if FEATURE_ATI_fragment_shader |
||
5223 | static void GLAPIENTRY |
||
5224 | save_BindFragmentShaderATI(GLuint id) |
||
5225 | { |
||
5226 | GET_CURRENT_CONTEXT(ctx); |
||
5227 | Node *n; |
||
5228 | |||
5229 | n = alloc_instruction(ctx, OPCODE_BIND_FRAGMENT_SHADER_ATI, 1); |
||
5230 | if (n) { |
||
5231 | n[1].ui = id; |
||
5232 | } |
||
5233 | if (ctx->ExecuteFlag) { |
||
5234 | CALL_BindFragmentShaderATI(ctx->Exec, (id)); |
||
5235 | } |
||
5236 | } |
||
5237 | |||
5238 | static void GLAPIENTRY |
||
5239 | save_SetFragmentShaderConstantATI(GLuint dst, const GLfloat *value) |
||
5240 | { |
||
5241 | GET_CURRENT_CONTEXT(ctx); |
||
5242 | Node *n; |
||
5243 | |||
5244 | n = alloc_instruction(ctx, OPCODE_SET_FRAGMENT_SHADER_CONSTANTS_ATI, 5); |
||
5245 | if (n) { |
||
5246 | n[1].ui = dst; |
||
5247 | n[2].f = value[0]; |
||
5248 | n[3].f = value[1]; |
||
5249 | n[4].f = value[2]; |
||
5250 | n[5].f = value[3]; |
||
5251 | } |
||
5252 | if (ctx->ExecuteFlag) { |
||
5253 | CALL_SetFragmentShaderConstantATI(ctx->Exec, (dst, value)); |
||
5254 | } |
||
5255 | } |
||
5256 | #endif |
||
5257 | |||
5258 | static void |
||
5259 | save_Attr1fNV(GLenum attr, GLfloat x) |
||
5260 | { |
||
5261 | GET_CURRENT_CONTEXT(ctx); |
||
5262 | Node *n; |
||
5263 | SAVE_FLUSH_VERTICES(ctx); |
||
5264 | n = alloc_instruction(ctx, OPCODE_ATTR_1F_NV, 2); |
||
5265 | if (n) { |
||
5266 | n[1].e = attr; |
||
5267 | n[2].f = x; |
||
5268 | } |
||
5269 | |||
5270 | ASSERT(attr < MAX_VERTEX_GENERIC_ATTRIBS); |
||
5271 | ctx->ListState.ActiveAttribSize[attr] = 1; |
||
5272 | ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, 0, 0, 1); |
||
5273 | |||
5274 | if (ctx->ExecuteFlag) { |
||
5275 | CALL_VertexAttrib1fNV(ctx->Exec, (attr, x)); |
||
5276 | } |
||
5277 | } |
||
5278 | |||
5279 | static void |
||
5280 | save_Attr2fNV(GLenum attr, GLfloat x, GLfloat y) |
||
5281 | { |
||
5282 | GET_CURRENT_CONTEXT(ctx); |
||
5283 | Node *n; |
||
5284 | SAVE_FLUSH_VERTICES(ctx); |
||
5285 | n = alloc_instruction(ctx, OPCODE_ATTR_2F_NV, 3); |
||
5286 | if (n) { |
||
5287 | n[1].e = attr; |
||
5288 | n[2].f = x; |
||
5289 | n[3].f = y; |
||
5290 | } |
||
5291 | |||
5292 | ASSERT(attr < MAX_VERTEX_GENERIC_ATTRIBS); |
||
5293 | ctx->ListState.ActiveAttribSize[attr] = 2; |
||
5294 | ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, 0, 1); |
||
5295 | |||
5296 | if (ctx->ExecuteFlag) { |
||
5297 | CALL_VertexAttrib2fNV(ctx->Exec, (attr, x, y)); |
||
5298 | } |
||
5299 | } |
||
5300 | |||
5301 | static void |
||
5302 | save_Attr3fNV(GLenum attr, GLfloat x, GLfloat y, GLfloat z) |
||
5303 | { |
||
5304 | GET_CURRENT_CONTEXT(ctx); |
||
5305 | Node *n; |
||
5306 | SAVE_FLUSH_VERTICES(ctx); |
||
5307 | n = alloc_instruction(ctx, OPCODE_ATTR_3F_NV, 4); |
||
5308 | if (n) { |
||
5309 | n[1].e = attr; |
||
5310 | n[2].f = x; |
||
5311 | n[3].f = y; |
||
5312 | n[4].f = z; |
||
5313 | } |
||
5314 | |||
5315 | ASSERT(attr < MAX_VERTEX_GENERIC_ATTRIBS); |
||
5316 | ctx->ListState.ActiveAttribSize[attr] = 3; |
||
5317 | ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, 1); |
||
5318 | |||
5319 | if (ctx->ExecuteFlag) { |
||
5320 | CALL_VertexAttrib3fNV(ctx->Exec, (attr, x, y, z)); |
||
5321 | } |
||
5322 | } |
||
5323 | |||
5324 | static void |
||
5325 | save_Attr4fNV(GLenum attr, GLfloat x, GLfloat y, GLfloat z, GLfloat w) |
||
5326 | { |
||
5327 | GET_CURRENT_CONTEXT(ctx); |
||
5328 | Node *n; |
||
5329 | SAVE_FLUSH_VERTICES(ctx); |
||
5330 | n = alloc_instruction(ctx, OPCODE_ATTR_4F_NV, 5); |
||
5331 | if (n) { |
||
5332 | n[1].e = attr; |
||
5333 | n[2].f = x; |
||
5334 | n[3].f = y; |
||
5335 | n[4].f = z; |
||
5336 | n[5].f = w; |
||
5337 | } |
||
5338 | |||
5339 | ASSERT(attr < MAX_VERTEX_GENERIC_ATTRIBS); |
||
5340 | ctx->ListState.ActiveAttribSize[attr] = 4; |
||
5341 | ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, w); |
||
5342 | |||
5343 | if (ctx->ExecuteFlag) { |
||
5344 | CALL_VertexAttrib4fNV(ctx->Exec, (attr, x, y, z, w)); |
||
5345 | } |
||
5346 | } |
||
5347 | |||
5348 | |||
5349 | static void |
||
5350 | save_Attr1fARB(GLenum attr, GLfloat x) |
||
5351 | { |
||
5352 | GET_CURRENT_CONTEXT(ctx); |
||
5353 | Node *n; |
||
5354 | SAVE_FLUSH_VERTICES(ctx); |
||
5355 | n = alloc_instruction(ctx, OPCODE_ATTR_1F_ARB, 2); |
||
5356 | if (n) { |
||
5357 | n[1].e = attr; |
||
5358 | n[2].f = x; |
||
5359 | } |
||
5360 | |||
5361 | ASSERT(attr < MAX_VERTEX_GENERIC_ATTRIBS); |
||
5362 | ctx->ListState.ActiveAttribSize[attr] = 1; |
||
5363 | ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, 0, 0, 1); |
||
5364 | |||
5365 | if (ctx->ExecuteFlag) { |
||
5366 | CALL_VertexAttrib1fARB(ctx->Exec, (attr, x)); |
||
5367 | } |
||
5368 | } |
||
5369 | |||
5370 | static void |
||
5371 | save_Attr2fARB(GLenum attr, GLfloat x, GLfloat y) |
||
5372 | { |
||
5373 | GET_CURRENT_CONTEXT(ctx); |
||
5374 | Node *n; |
||
5375 | SAVE_FLUSH_VERTICES(ctx); |
||
5376 | n = alloc_instruction(ctx, OPCODE_ATTR_2F_ARB, 3); |
||
5377 | if (n) { |
||
5378 | n[1].e = attr; |
||
5379 | n[2].f = x; |
||
5380 | n[3].f = y; |
||
5381 | } |
||
5382 | |||
5383 | ASSERT(attr < MAX_VERTEX_GENERIC_ATTRIBS); |
||
5384 | ctx->ListState.ActiveAttribSize[attr] = 2; |
||
5385 | ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, 0, 1); |
||
5386 | |||
5387 | if (ctx->ExecuteFlag) { |
||
5388 | CALL_VertexAttrib2fARB(ctx->Exec, (attr, x, y)); |
||
5389 | } |
||
5390 | } |
||
5391 | |||
5392 | static void |
||
5393 | save_Attr3fARB(GLenum attr, GLfloat x, GLfloat y, GLfloat z) |
||
5394 | { |
||
5395 | GET_CURRENT_CONTEXT(ctx); |
||
5396 | Node *n; |
||
5397 | SAVE_FLUSH_VERTICES(ctx); |
||
5398 | n = alloc_instruction(ctx, OPCODE_ATTR_3F_ARB, 4); |
||
5399 | if (n) { |
||
5400 | n[1].e = attr; |
||
5401 | n[2].f = x; |
||
5402 | n[3].f = y; |
||
5403 | n[4].f = z; |
||
5404 | } |
||
5405 | |||
5406 | ASSERT(attr < MAX_VERTEX_GENERIC_ATTRIBS); |
||
5407 | ctx->ListState.ActiveAttribSize[attr] = 3; |
||
5408 | ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, 1); |
||
5409 | |||
5410 | if (ctx->ExecuteFlag) { |
||
5411 | CALL_VertexAttrib3fARB(ctx->Exec, (attr, x, y, z)); |
||
5412 | } |
||
5413 | } |
||
5414 | |||
5415 | static void |
||
5416 | save_Attr4fARB(GLenum attr, GLfloat x, GLfloat y, GLfloat z, GLfloat w) |
||
5417 | { |
||
5418 | GET_CURRENT_CONTEXT(ctx); |
||
5419 | Node *n; |
||
5420 | SAVE_FLUSH_VERTICES(ctx); |
||
5421 | n = alloc_instruction(ctx, OPCODE_ATTR_4F_ARB, 5); |
||
5422 | if (n) { |
||
5423 | n[1].e = attr; |
||
5424 | n[2].f = x; |
||
5425 | n[3].f = y; |
||
5426 | n[4].f = z; |
||
5427 | n[5].f = w; |
||
5428 | } |
||
5429 | |||
5430 | ASSERT(attr < MAX_VERTEX_GENERIC_ATTRIBS); |
||
5431 | ctx->ListState.ActiveAttribSize[attr] = 4; |
||
5432 | ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, w); |
||
5433 | |||
5434 | if (ctx->ExecuteFlag) { |
||
5435 | CALL_VertexAttrib4fARB(ctx->Exec, (attr, x, y, z, w)); |
||
5436 | } |
||
5437 | } |
||
5438 | |||
5439 | |||
5440 | static void GLAPIENTRY |
||
5441 | save_EvalCoord1f(GLfloat x) |
||
5442 | { |
||
5443 | GET_CURRENT_CONTEXT(ctx); |
||
5444 | Node *n; |
||
5445 | SAVE_FLUSH_VERTICES(ctx); |
||
5446 | n = alloc_instruction(ctx, OPCODE_EVAL_C1, 1); |
||
5447 | if (n) { |
||
5448 | n[1].f = x; |
||
5449 | } |
||
5450 | if (ctx->ExecuteFlag) { |
||
5451 | CALL_EvalCoord1f(ctx->Exec, (x)); |
||
5452 | } |
||
5453 | } |
||
5454 | |||
5455 | static void GLAPIENTRY |
||
5456 | save_EvalCoord1fv(const GLfloat * v) |
||
5457 | { |
||
5458 | save_EvalCoord1f(v[0]); |
||
5459 | } |
||
5460 | |||
5461 | static void GLAPIENTRY |
||
5462 | save_EvalCoord2f(GLfloat x, GLfloat y) |
||
5463 | { |
||
5464 | GET_CURRENT_CONTEXT(ctx); |
||
5465 | Node *n; |
||
5466 | SAVE_FLUSH_VERTICES(ctx); |
||
5467 | n = alloc_instruction(ctx, OPCODE_EVAL_C2, 2); |
||
5468 | if (n) { |
||
5469 | n[1].f = x; |
||
5470 | n[2].f = y; |
||
5471 | } |
||
5472 | if (ctx->ExecuteFlag) { |
||
5473 | CALL_EvalCoord2f(ctx->Exec, (x, y)); |
||
5474 | } |
||
5475 | } |
||
5476 | |||
5477 | static void GLAPIENTRY |
||
5478 | save_EvalCoord2fv(const GLfloat * v) |
||
5479 | { |
||
5480 | save_EvalCoord2f(v[0], v[1]); |
||
5481 | } |
||
5482 | |||
5483 | |||
5484 | static void GLAPIENTRY |
||
5485 | save_EvalPoint1(GLint x) |
||
5486 | { |
||
5487 | GET_CURRENT_CONTEXT(ctx); |
||
5488 | Node *n; |
||
5489 | SAVE_FLUSH_VERTICES(ctx); |
||
5490 | n = alloc_instruction(ctx, OPCODE_EVAL_P1, 1); |
||
5491 | if (n) { |
||
5492 | n[1].i = x; |
||
5493 | } |
||
5494 | if (ctx->ExecuteFlag) { |
||
5495 | CALL_EvalPoint1(ctx->Exec, (x)); |
||
5496 | } |
||
5497 | } |
||
5498 | |||
5499 | static void GLAPIENTRY |
||
5500 | save_EvalPoint2(GLint x, GLint y) |
||
5501 | { |
||
5502 | GET_CURRENT_CONTEXT(ctx); |
||
5503 | Node *n; |
||
5504 | SAVE_FLUSH_VERTICES(ctx); |
||
5505 | n = alloc_instruction(ctx, OPCODE_EVAL_P2, 2); |
||
5506 | if (n) { |
||
5507 | n[1].i = x; |
||
5508 | n[2].i = y; |
||
5509 | } |
||
5510 | if (ctx->ExecuteFlag) { |
||
5511 | CALL_EvalPoint2(ctx->Exec, (x, y)); |
||
5512 | } |
||
5513 | } |
||
5514 | |||
5515 | static void GLAPIENTRY |
||
5516 | save_Indexf(GLfloat x) |
||
5517 | { |
||
5518 | save_Attr1fNV(VERT_ATTRIB_COLOR_INDEX, x); |
||
5519 | } |
||
5520 | |||
5521 | static void GLAPIENTRY |
||
5522 | save_Indexfv(const GLfloat * v) |
||
5523 | { |
||
5524 | save_Attr1fNV(VERT_ATTRIB_COLOR_INDEX, v[0]); |
||
5525 | } |
||
5526 | |||
5527 | static void GLAPIENTRY |
||
5528 | save_EdgeFlag(GLboolean x) |
||
5529 | { |
||
5530 | save_Attr1fNV(VERT_ATTRIB_EDGEFLAG, x ? (GLfloat)1.0 : (GLfloat)0.0); |
||
5531 | } |
||
5532 | |||
5533 | static INLINE GLboolean compare4fv( const GLfloat *a, |
||
5534 | const GLfloat *b, |
||
5535 | GLuint count ) |
||
5536 | { |
||
5537 | return memcmp( a, b, count * sizeof(GLfloat) ) == 0; |
||
5538 | } |
||
5539 | |||
5540 | |||
5541 | static void GLAPIENTRY |
||
5542 | save_Materialfv(GLenum face, GLenum pname, const GLfloat * param) |
||
5543 | { |
||
5544 | GET_CURRENT_CONTEXT(ctx); |
||
5545 | Node *n; |
||
5546 | int args, i; |
||
5547 | GLuint bitmask; |
||
5548 | |||
5549 | switch (face) { |
||
5550 | case GL_BACK: |
||
5551 | case GL_FRONT: |
||
5552 | case GL_FRONT_AND_BACK: |
||
5553 | break; |
||
5554 | default: |
||
5555 | _mesa_compile_error(ctx, GL_INVALID_ENUM, "material(face)"); |
||
5556 | return; |
||
5557 | } |
||
5558 | |||
5559 | switch (pname) { |
||
5560 | case GL_EMISSION: |
||
5561 | case GL_AMBIENT: |
||
5562 | case GL_DIFFUSE: |
||
5563 | case GL_SPECULAR: |
||
5564 | case GL_AMBIENT_AND_DIFFUSE: |
||
5565 | args = 4; |
||
5566 | break; |
||
5567 | case GL_SHININESS: |
||
5568 | args = 1; |
||
5569 | break; |
||
5570 | case GL_COLOR_INDEXES: |
||
5571 | args = 3; |
||
5572 | break; |
||
5573 | default: |
||
5574 | _mesa_compile_error(ctx, GL_INVALID_ENUM, "material(pname)"); |
||
5575 | return; |
||
5576 | } |
||
5577 | |||
5578 | if (ctx->ExecuteFlag) { |
||
5579 | CALL_Materialfv(ctx->Exec, (face, pname, param)); |
||
5580 | } |
||
5581 | |||
5582 | bitmask = _mesa_material_bitmask(ctx, face, pname, ~0, NULL); |
||
5583 | |||
5584 | /* Try to eliminate redundant statechanges. Because it is legal to |
||
5585 | * call glMaterial even inside begin/end calls, don't need to worry |
||
5586 | * about ctx->Driver.CurrentSavePrimitive here. |
||
5587 | */ |
||
5588 | for (i = 0; i < MAT_ATTRIB_MAX; i++) { |
||
5589 | if (bitmask & (1 << i)) { |
||
5590 | if (ctx->ListState.ActiveMaterialSize[i] == args && |
||
5591 | compare4fv(ctx->ListState.CurrentMaterial[i], param, args)) { |
||
5592 | bitmask &= ~(1 << i); |
||
5593 | } |
||
5594 | else { |
||
5595 | ctx->ListState.ActiveMaterialSize[i] = args; |
||
5596 | COPY_SZ_4V(ctx->ListState.CurrentMaterial[i], args, param); |
||
5597 | } |
||
5598 | } |
||
5599 | } |
||
5600 | |||
5601 | /* If this call has effect, return early: |
||
5602 | */ |
||
5603 | if (bitmask == 0) |
||
5604 | return; |
||
5605 | |||
5606 | SAVE_FLUSH_VERTICES(ctx); |
||
5607 | |||
5608 | n = alloc_instruction(ctx, OPCODE_MATERIAL, 6); |
||
5609 | if (n) { |
||
5610 | n[1].e = face; |
||
5611 | n[2].e = pname; |
||
5612 | for (i = 0; i < args; i++) |
||
5613 | n[3 + i].f = param[i]; |
||
5614 | } |
||
5615 | } |
||
5616 | |||
5617 | static void GLAPIENTRY |
||
5618 | save_Begin(GLenum mode) |
||
5619 | { |
||
5620 | GET_CURRENT_CONTEXT(ctx); |
||
5621 | Node *n; |
||
5622 | GLboolean error = GL_FALSE; |
||
5623 | |||
5624 | if ( /*mode < GL_POINTS || */ mode > GL_POLYGON) { |
||
5625 | _mesa_compile_error(ctx, GL_INVALID_ENUM, "Begin (mode)"); |
||
5626 | error = GL_TRUE; |
||
5627 | } |
||
5628 | else if (ctx->Driver.CurrentSavePrimitive == PRIM_UNKNOWN) { |
||
5629 | /* Typically the first begin. This may raise an error on |
||
5630 | * playback, depending on whether CallList is issued from inside |
||
5631 | * a begin/end or not. |
||
5632 | */ |
||
5633 | ctx->Driver.CurrentSavePrimitive = PRIM_INSIDE_UNKNOWN_PRIM; |
||
5634 | } |
||
5635 | else if (ctx->Driver.CurrentSavePrimitive == PRIM_OUTSIDE_BEGIN_END) { |
||
5636 | ctx->Driver.CurrentSavePrimitive = mode; |
||
5637 | } |
||
5638 | else { |
||
5639 | _mesa_compile_error(ctx, GL_INVALID_OPERATION, "recursive begin"); |
||
5640 | error = GL_TRUE; |
||
5641 | } |
||
5642 | |||
5643 | if (!error) { |
||
5644 | /* Give the driver an opportunity to hook in an optimized |
||
5645 | * display list compiler. |
||
5646 | */ |
||
5647 | if (ctx->Driver.NotifySaveBegin(ctx, mode)) |
||
5648 | return; |
||
5649 | |||
5650 | SAVE_FLUSH_VERTICES(ctx); |
||
5651 | n = alloc_instruction(ctx, OPCODE_BEGIN, 1); |
||
5652 | if (n) { |
||
5653 | n[1].e = mode; |
||
5654 | } |
||
5655 | } |
||
5656 | |||
5657 | if (ctx->ExecuteFlag) { |
||
5658 | CALL_Begin(ctx->Exec, (mode)); |
||
5659 | } |
||
5660 | } |
||
5661 | |||
5662 | static void GLAPIENTRY |
||
5663 | save_End(void) |
||
5664 | { |
||
5665 | GET_CURRENT_CONTEXT(ctx); |
||
5666 | SAVE_FLUSH_VERTICES(ctx); |
||
5667 | (void) alloc_instruction(ctx, OPCODE_END, 0); |
||
5668 | ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END; |
||
5669 | if (ctx->ExecuteFlag) { |
||
5670 | CALL_End(ctx->Exec, ()); |
||
5671 | } |
||
5672 | } |
||
5673 | |||
5674 | static void GLAPIENTRY |
||
5675 | save_Rectf(GLfloat a, GLfloat b, GLfloat c, GLfloat d) |
||
5676 | { |
||
5677 | GET_CURRENT_CONTEXT(ctx); |
||
5678 | Node *n; |
||
5679 | SAVE_FLUSH_VERTICES(ctx); |
||
5680 | n = alloc_instruction(ctx, OPCODE_RECTF, 4); |
||
5681 | if (n) { |
||
5682 | n[1].f = a; |
||
5683 | n[2].f = b; |
||
5684 | n[3].f = c; |
||
5685 | n[4].f = d; |
||
5686 | } |
||
5687 | if (ctx->ExecuteFlag) { |
||
5688 | CALL_Rectf(ctx->Exec, (a, b, c, d)); |
||
5689 | } |
||
5690 | } |
||
5691 | |||
5692 | |||
5693 | static void GLAPIENTRY |
||
5694 | save_Vertex2f(GLfloat x, GLfloat y) |
||
5695 | { |
||
5696 | save_Attr2fNV(VERT_ATTRIB_POS, x, y); |
||
5697 | } |
||
5698 | |||
5699 | static void GLAPIENTRY |
||
5700 | save_Vertex2fv(const GLfloat * v) |
||
5701 | { |
||
5702 | save_Attr2fNV(VERT_ATTRIB_POS, v[0], v[1]); |
||
5703 | } |
||
5704 | |||
5705 | static void GLAPIENTRY |
||
5706 | save_Vertex3f(GLfloat x, GLfloat y, GLfloat z) |
||
5707 | { |
||
5708 | save_Attr3fNV(VERT_ATTRIB_POS, x, y, z); |
||
5709 | } |
||
5710 | |||
5711 | static void GLAPIENTRY |
||
5712 | save_Vertex3fv(const GLfloat * v) |
||
5713 | { |
||
5714 | save_Attr3fNV(VERT_ATTRIB_POS, v[0], v[1], v[2]); |
||
5715 | } |
||
5716 | |||
5717 | static void GLAPIENTRY |
||
5718 | save_Vertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) |
||
5719 | { |
||
5720 | save_Attr4fNV(VERT_ATTRIB_POS, x, y, z, w); |
||
5721 | } |
||
5722 | |||
5723 | static void GLAPIENTRY |
||
5724 | save_Vertex4fv(const GLfloat * v) |
||
5725 | { |
||
5726 | save_Attr4fNV(VERT_ATTRIB_POS, v[0], v[1], v[2], v[3]); |
||
5727 | } |
||
5728 | |||
5729 | static void GLAPIENTRY |
||
5730 | save_TexCoord1f(GLfloat x) |
||
5731 | { |
||
5732 | save_Attr1fNV(VERT_ATTRIB_TEX0, x); |
||
5733 | } |
||
5734 | |||
5735 | static void GLAPIENTRY |
||
5736 | save_TexCoord1fv(const GLfloat * v) |
||
5737 | { |
||
5738 | save_Attr1fNV(VERT_ATTRIB_TEX0, v[0]); |
||
5739 | } |
||
5740 | |||
5741 | static void GLAPIENTRY |
||
5742 | save_TexCoord2f(GLfloat x, GLfloat y) |
||
5743 | { |
||
5744 | save_Attr2fNV(VERT_ATTRIB_TEX0, x, y); |
||
5745 | } |
||
5746 | |||
5747 | static void GLAPIENTRY |
||
5748 | save_TexCoord2fv(const GLfloat * v) |
||
5749 | { |
||
5750 | save_Attr2fNV(VERT_ATTRIB_TEX0, v[0], v[1]); |
||
5751 | } |
||
5752 | |||
5753 | static void GLAPIENTRY |
||
5754 | save_TexCoord3f(GLfloat x, GLfloat y, GLfloat z) |
||
5755 | { |
||
5756 | save_Attr3fNV(VERT_ATTRIB_TEX0, x, y, z); |
||
5757 | } |
||
5758 | |||
5759 | static void GLAPIENTRY |
||
5760 | save_TexCoord3fv(const GLfloat * v) |
||
5761 | { |
||
5762 | save_Attr3fNV(VERT_ATTRIB_TEX0, v[0], v[1], v[2]); |
||
5763 | } |
||
5764 | |||
5765 | static void GLAPIENTRY |
||
5766 | save_TexCoord4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) |
||
5767 | { |
||
5768 | save_Attr4fNV(VERT_ATTRIB_TEX0, x, y, z, w); |
||
5769 | } |
||
5770 | |||
5771 | static void GLAPIENTRY |
||
5772 | save_TexCoord4fv(const GLfloat * v) |
||
5773 | { |
||
5774 | save_Attr4fNV(VERT_ATTRIB_TEX0, v[0], v[1], v[2], v[3]); |
||
5775 | } |
||
5776 | |||
5777 | static void GLAPIENTRY |
||
5778 | save_Normal3f(GLfloat x, GLfloat y, GLfloat z) |
||
5779 | { |
||
5780 | save_Attr3fNV(VERT_ATTRIB_NORMAL, x, y, z); |
||
5781 | } |
||
5782 | |||
5783 | static void GLAPIENTRY |
||
5784 | save_Normal3fv(const GLfloat * v) |
||
5785 | { |
||
5786 | save_Attr3fNV(VERT_ATTRIB_NORMAL, v[0], v[1], v[2]); |
||
5787 | } |
||
5788 | |||
5789 | static void GLAPIENTRY |
||
5790 | save_FogCoordfEXT(GLfloat x) |
||
5791 | { |
||
5792 | save_Attr1fNV(VERT_ATTRIB_FOG, x); |
||
5793 | } |
||
5794 | |||
5795 | static void GLAPIENTRY |
||
5796 | save_FogCoordfvEXT(const GLfloat * v) |
||
5797 | { |
||
5798 | save_Attr1fNV(VERT_ATTRIB_FOG, v[0]); |
||
5799 | } |
||
5800 | |||
5801 | static void GLAPIENTRY |
||
5802 | save_Color3f(GLfloat x, GLfloat y, GLfloat z) |
||
5803 | { |
||
5804 | save_Attr3fNV(VERT_ATTRIB_COLOR0, x, y, z); |
||
5805 | } |
||
5806 | |||
5807 | static void GLAPIENTRY |
||
5808 | save_Color3fv(const GLfloat * v) |
||
5809 | { |
||
5810 | save_Attr3fNV(VERT_ATTRIB_COLOR0, v[0], v[1], v[2]); |
||
5811 | } |
||
5812 | |||
5813 | static void GLAPIENTRY |
||
5814 | save_Color4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w) |
||
5815 | { |
||
5816 | save_Attr4fNV(VERT_ATTRIB_COLOR0, x, y, z, w); |
||
5817 | } |
||
5818 | |||
5819 | static void GLAPIENTRY |
||
5820 | save_Color4fv(const GLfloat * v) |
||
5821 | { |
||
5822 | save_Attr4fNV(VERT_ATTRIB_COLOR0, v[0], v[1], v[2], v[3]); |
||
5823 | } |
||
5824 | |||
5825 | static void GLAPIENTRY |
||
5826 | save_SecondaryColor3fEXT(GLfloat x, GLfloat y, GLfloat z) |
||
5827 | { |
||
5828 | save_Attr3fNV(VERT_ATTRIB_COLOR1, x, y, z); |
||
5829 | } |
||
5830 | |||
5831 | static void GLAPIENTRY |
||
5832 | save_SecondaryColor3fvEXT(const GLfloat * v) |
||
5833 | { |
||
5834 | save_Attr3fNV(VERT_ATTRIB_COLOR1, v[0], v[1], v[2]); |
||
5835 | } |
||
5836 | |||
5837 | |||
5838 | /* Just call the respective ATTR for texcoord |
||
5839 | */ |
||
5840 | static void GLAPIENTRY |
||
5841 | save_MultiTexCoord1f(GLenum target, GLfloat x) |
||
5842 | { |
||
5843 | GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; |
||
5844 | save_Attr1fNV(attr, x); |
||
5845 | } |
||
5846 | |||
5847 | static void GLAPIENTRY |
||
5848 | save_MultiTexCoord1fv(GLenum target, const GLfloat * v) |
||
5849 | { |
||
5850 | GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; |
||
5851 | save_Attr1fNV(attr, v[0]); |
||
5852 | } |
||
5853 | |||
5854 | static void GLAPIENTRY |
||
5855 | save_MultiTexCoord2f(GLenum target, GLfloat x, GLfloat y) |
||
5856 | { |
||
5857 | GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; |
||
5858 | save_Attr2fNV(attr, x, y); |
||
5859 | } |
||
5860 | |||
5861 | static void GLAPIENTRY |
||
5862 | save_MultiTexCoord2fv(GLenum target, const GLfloat * v) |
||
5863 | { |
||
5864 | GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; |
||
5865 | save_Attr2fNV(attr, v[0], v[1]); |
||
5866 | } |
||
5867 | |||
5868 | static void GLAPIENTRY |
||
5869 | save_MultiTexCoord3f(GLenum target, GLfloat x, GLfloat y, GLfloat z) |
||
5870 | { |
||
5871 | GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; |
||
5872 | save_Attr3fNV(attr, x, y, z); |
||
5873 | } |
||
5874 | |||
5875 | static void GLAPIENTRY |
||
5876 | save_MultiTexCoord3fv(GLenum target, const GLfloat * v) |
||
5877 | { |
||
5878 | GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; |
||
5879 | save_Attr3fNV(attr, v[0], v[1], v[2]); |
||
5880 | } |
||
5881 | |||
5882 | static void GLAPIENTRY |
||
5883 | save_MultiTexCoord4f(GLenum target, GLfloat x, GLfloat y, |
||
5884 | GLfloat z, GLfloat w) |
||
5885 | { |
||
5886 | GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; |
||
5887 | save_Attr4fNV(attr, x, y, z, w); |
||
5888 | } |
||
5889 | |||
5890 | static void GLAPIENTRY |
||
5891 | save_MultiTexCoord4fv(GLenum target, const GLfloat * v) |
||
5892 | { |
||
5893 | GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0; |
||
5894 | save_Attr4fNV(attr, v[0], v[1], v[2], v[3]); |
||
5895 | } |
||
5896 | |||
5897 | |||
5898 | /** |
||
5899 | * Record a GL_INVALID_VALUE error when a invalid vertex attribute |
||
5900 | * index is found. |
||
5901 | */ |
||
5902 | static void |
||
5903 | index_error(void) |
||
5904 | { |
||
5905 | GET_CURRENT_CONTEXT(ctx); |
||
5906 | _mesa_error(ctx, GL_INVALID_VALUE, "VertexAttribf(index)"); |
||
5907 | } |
||
5908 | |||
5909 | |||
5910 | /* First level for NV_vertex_program: |
||
5911 | * |
||
5912 | * Check for errors at compile time?. |
||
5913 | */ |
||
5914 | static void GLAPIENTRY |
||
5915 | save_VertexAttrib1fNV(GLuint index, GLfloat x) |
||
5916 | { |
||
5917 | if (index < MAX_NV_VERTEX_PROGRAM_INPUTS) |
||
5918 | save_Attr1fNV(index, x); |
||
5919 | else |
||
5920 | index_error(); |
||
5921 | } |
||
5922 | |||
5923 | static void GLAPIENTRY |
||
5924 | save_VertexAttrib1fvNV(GLuint index, const GLfloat * v) |
||
5925 | { |
||
5926 | if (index < MAX_NV_VERTEX_PROGRAM_INPUTS) |
||
5927 | save_Attr1fNV(index, v[0]); |
||
5928 | else |
||
5929 | index_error(); |
||
5930 | } |
||
5931 | |||
5932 | static void GLAPIENTRY |
||
5933 | save_VertexAttrib2fNV(GLuint index, GLfloat x, GLfloat y) |
||
5934 | { |
||
5935 | if (index < MAX_NV_VERTEX_PROGRAM_INPUTS) |
||
5936 | save_Attr2fNV(index, x, y); |
||
5937 | else |
||
5938 | index_error(); |
||
5939 | } |
||
5940 | |||
5941 | static void GLAPIENTRY |
||
5942 | save_VertexAttrib2fvNV(GLuint index, const GLfloat * v) |
||
5943 | { |
||
5944 | if (index < MAX_NV_VERTEX_PROGRAM_INPUTS) |
||
5945 | save_Attr2fNV(index, v[0], v[1]); |
||
5946 | else |
||
5947 | index_error(); |
||
5948 | } |
||
5949 | |||
5950 | static void GLAPIENTRY |
||
5951 | save_VertexAttrib3fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z) |
||
5952 | { |
||
5953 | if (index < MAX_NV_VERTEX_PROGRAM_INPUTS) |
||
5954 | save_Attr3fNV(index, x, y, z); |
||
5955 | else |
||
5956 | index_error(); |
||
5957 | } |
||
5958 | |||
5959 | static void GLAPIENTRY |
||
5960 | save_VertexAttrib3fvNV(GLuint index, const GLfloat * v) |
||
5961 | { |
||
5962 | if (index < MAX_NV_VERTEX_PROGRAM_INPUTS) |
||
5963 | save_Attr3fNV(index, v[0], v[1], v[2]); |
||
5964 | else |
||
5965 | index_error(); |
||
5966 | } |
||
5967 | |||
5968 | static void GLAPIENTRY |
||
5969 | save_VertexAttrib4fNV(GLuint index, GLfloat x, GLfloat y, |
||
5970 | GLfloat z, GLfloat w) |
||
5971 | { |
||
5972 | if (index < MAX_NV_VERTEX_PROGRAM_INPUTS) |
||
5973 | save_Attr4fNV(index, x, y, z, w); |
||
5974 | else |
||
5975 | index_error(); |
||
5976 | } |
||
5977 | |||
5978 | static void GLAPIENTRY |
||
5979 | save_VertexAttrib4fvNV(GLuint index, const GLfloat * v) |
||
5980 | { |
||
5981 | if (index < MAX_NV_VERTEX_PROGRAM_INPUTS) |
||
5982 | save_Attr4fNV(index, v[0], v[1], v[2], v[3]); |
||
5983 | else |
||
5984 | index_error(); |
||
5985 | } |
||
5986 | |||
5987 | |||
5988 | |||
5989 | |||
5990 | static void GLAPIENTRY |
||
5991 | save_VertexAttrib1fARB(GLuint index, GLfloat x) |
||
5992 | { |
||
5993 | if (index < MAX_VERTEX_GENERIC_ATTRIBS) |
||
5994 | save_Attr1fARB(index, x); |
||
5995 | else |
||
5996 | index_error(); |
||
5997 | } |
||
5998 | |||
5999 | static void GLAPIENTRY |
||
6000 | save_VertexAttrib1fvARB(GLuint index, const GLfloat * v) |
||
6001 | { |
||
6002 | if (index < MAX_VERTEX_GENERIC_ATTRIBS) |
||
6003 | save_Attr1fARB(index, v[0]); |
||
6004 | else |
||
6005 | index_error(); |
||
6006 | } |
||
6007 | |||
6008 | static void GLAPIENTRY |
||
6009 | save_VertexAttrib2fARB(GLuint index, GLfloat x, GLfloat y) |
||
6010 | { |
||
6011 | if (index < MAX_VERTEX_GENERIC_ATTRIBS) |
||
6012 | save_Attr2fARB(index, x, y); |
||
6013 | else |
||
6014 | index_error(); |
||
6015 | } |
||
6016 | |||
6017 | static void GLAPIENTRY |
||
6018 | save_VertexAttrib2fvARB(GLuint index, const GLfloat * v) |
||
6019 | { |
||
6020 | if (index < MAX_VERTEX_GENERIC_ATTRIBS) |
||
6021 | save_Attr2fARB(index, v[0], v[1]); |
||
6022 | else |
||
6023 | index_error(); |
||
6024 | } |
||
6025 | |||
6026 | static void GLAPIENTRY |
||
6027 | save_VertexAttrib3fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z) |
||
6028 | { |
||
6029 | if (index < MAX_VERTEX_GENERIC_ATTRIBS) |
||
6030 | save_Attr3fARB(index, x, y, z); |
||
6031 | else |
||
6032 | index_error(); |
||
6033 | } |
||
6034 | |||
6035 | static void GLAPIENTRY |
||
6036 | save_VertexAttrib3fvARB(GLuint index, const GLfloat * v) |
||
6037 | { |
||
6038 | if (index < MAX_VERTEX_GENERIC_ATTRIBS) |
||
6039 | save_Attr3fARB(index, v[0], v[1], v[2]); |
||
6040 | else |
||
6041 | index_error(); |
||
6042 | } |
||
6043 | |||
6044 | static void GLAPIENTRY |
||
6045 | save_VertexAttrib4fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z, |
||
6046 | GLfloat w) |
||
6047 | { |
||
6048 | if (index < MAX_VERTEX_GENERIC_ATTRIBS) |
||
6049 | save_Attr4fARB(index, x, y, z, w); |
||
6050 | else |
||
6051 | index_error(); |
||
6052 | } |
||
6053 | |||
6054 | static void GLAPIENTRY |
||
6055 | save_VertexAttrib4fvARB(GLuint index, const GLfloat * v) |
||
6056 | { |
||
6057 | if (index < MAX_VERTEX_GENERIC_ATTRIBS) |
||
6058 | save_Attr4fARB(index, v[0], v[1], v[2], v[3]); |
||
6059 | else |
||
6060 | index_error(); |
||
6061 | } |
||
6062 | |||
6063 | |||
6064 | /* GL_ARB_shader_objects, GL_ARB_vertex/fragment_shader */ |
||
6065 | |||
6066 | static void GLAPIENTRY |
||
6067 | exec_BindAttribLocationARB(GLuint program, GLuint index, const GLchar *name) |
||
6068 | { |
||
6069 | GET_CURRENT_CONTEXT(ctx); |
||
6070 | FLUSH_VERTICES(ctx, 0); |
||
6071 | CALL_BindAttribLocationARB(ctx->Exec, (program, index, name)); |
||
6072 | } |
||
6073 | |||
6074 | static GLint GLAPIENTRY |
||
6075 | exec_GetAttribLocationARB(GLuint program, const GLchar *name) |
||
6076 | { |
||
6077 | GET_CURRENT_CONTEXT(ctx); |
||
6078 | FLUSH_VERTICES(ctx, 0); |
||
6079 | return CALL_GetAttribLocationARB(ctx->Exec, (program, name)); |
||
6080 | } |
||
6081 | |||
6082 | static GLint GLAPIENTRY |
||
6083 | exec_GetUniformLocationARB(GLuint program, const GLchar *name) |
||
6084 | { |
||
6085 | GET_CURRENT_CONTEXT(ctx); |
||
6086 | FLUSH_VERTICES(ctx, 0); |
||
6087 | return CALL_GetUniformLocationARB(ctx->Exec, (program, name)); |
||
6088 | } |
||
6089 | /* XXX more shader functions needed here */ |
||
6090 | |||
6091 | |||
6092 | #if FEATURE_EXT_framebuffer_blit |
||
6093 | static void GLAPIENTRY |
||
6094 | save_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, |
||
6095 | GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, |
||
6096 | GLbitfield mask, GLenum filter) |
||
6097 | { |
||
6098 | GET_CURRENT_CONTEXT(ctx); |
||
6099 | Node *n; |
||
6100 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6101 | n = alloc_instruction(ctx, OPCODE_BLIT_FRAMEBUFFER, 10); |
||
6102 | if (n) { |
||
6103 | n[1].i = srcX0; |
||
6104 | n[2].i = srcY0; |
||
6105 | n[3].i = srcX1; |
||
6106 | n[4].i = srcY1; |
||
6107 | n[5].i = dstX0; |
||
6108 | n[6].i = dstY0; |
||
6109 | n[7].i = dstX1; |
||
6110 | n[8].i = dstY1; |
||
6111 | n[9].i = mask; |
||
6112 | n[10].e = filter; |
||
6113 | } |
||
6114 | if (ctx->ExecuteFlag) { |
||
6115 | CALL_BlitFramebufferEXT(ctx->Exec, (srcX0, srcY0, srcX1, srcY1, |
||
6116 | dstX0, dstY0, dstX1, dstY1, |
||
6117 | mask, filter)); |
||
6118 | } |
||
6119 | } |
||
6120 | #endif |
||
6121 | |||
6122 | |||
6123 | /** GL_EXT_provoking_vertex */ |
||
6124 | static void GLAPIENTRY |
||
6125 | save_ProvokingVertexEXT(GLenum mode) |
||
6126 | { |
||
6127 | GET_CURRENT_CONTEXT(ctx); |
||
6128 | Node *n; |
||
6129 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6130 | n = alloc_instruction(ctx, OPCODE_PROVOKING_VERTEX, 1); |
||
6131 | if (n) { |
||
6132 | n[1].e = mode; |
||
6133 | } |
||
6134 | if (ctx->ExecuteFlag) { |
||
6135 | /*CALL_ProvokingVertexEXT(ctx->Exec, (mode));*/ |
||
6136 | _mesa_ProvokingVertexEXT(mode); |
||
6137 | } |
||
6138 | } |
||
6139 | |||
6140 | |||
6141 | /** GL_EXT_transform_feedback */ |
||
6142 | static void GLAPIENTRY |
||
6143 | save_BeginTransformFeedback(GLenum mode) |
||
6144 | { |
||
6145 | GET_CURRENT_CONTEXT(ctx); |
||
6146 | Node *n; |
||
6147 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6148 | n = alloc_instruction(ctx, OPCODE_BEGIN_TRANSFORM_FEEDBACK, 1); |
||
6149 | if (n) { |
||
6150 | n[1].e = mode; |
||
6151 | } |
||
6152 | if (ctx->ExecuteFlag) { |
||
6153 | CALL_BeginTransformFeedbackEXT(ctx->Exec, (mode)); |
||
6154 | } |
||
6155 | } |
||
6156 | |||
6157 | |||
6158 | /** GL_EXT_transform_feedback */ |
||
6159 | static void GLAPIENTRY |
||
6160 | save_EndTransformFeedback(void) |
||
6161 | { |
||
6162 | GET_CURRENT_CONTEXT(ctx); |
||
6163 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6164 | (void) alloc_instruction(ctx, OPCODE_END_TRANSFORM_FEEDBACK, 0); |
||
6165 | if (ctx->ExecuteFlag) { |
||
6166 | CALL_EndTransformFeedbackEXT(ctx->Exec, ()); |
||
6167 | } |
||
6168 | } |
||
6169 | |||
6170 | |||
6171 | /* aka UseProgram() */ |
||
6172 | static void GLAPIENTRY |
||
6173 | save_UseProgramObjectARB(GLhandleARB program) |
||
6174 | { |
||
6175 | GET_CURRENT_CONTEXT(ctx); |
||
6176 | Node *n; |
||
6177 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6178 | n = alloc_instruction(ctx, OPCODE_USE_PROGRAM, 1); |
||
6179 | if (n) { |
||
6180 | n[1].ui = program; |
||
6181 | } |
||
6182 | if (ctx->ExecuteFlag) { |
||
6183 | CALL_UseProgramObjectARB(ctx->Exec, (program)); |
||
6184 | } |
||
6185 | } |
||
6186 | |||
6187 | |||
6188 | static void GLAPIENTRY |
||
6189 | save_Uniform1fARB(GLint location, GLfloat x) |
||
6190 | { |
||
6191 | GET_CURRENT_CONTEXT(ctx); |
||
6192 | Node *n; |
||
6193 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6194 | n = alloc_instruction(ctx, OPCODE_UNIFORM_1F, 2); |
||
6195 | if (n) { |
||
6196 | n[1].i = location; |
||
6197 | n[2].f = x; |
||
6198 | } |
||
6199 | if (ctx->ExecuteFlag) { |
||
6200 | CALL_Uniform1fARB(ctx->Exec, (location, x)); |
||
6201 | } |
||
6202 | } |
||
6203 | |||
6204 | |||
6205 | static void GLAPIENTRY |
||
6206 | save_Uniform2fARB(GLint location, GLfloat x, GLfloat y) |
||
6207 | { |
||
6208 | GET_CURRENT_CONTEXT(ctx); |
||
6209 | Node *n; |
||
6210 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6211 | n = alloc_instruction(ctx, OPCODE_UNIFORM_2F, 3); |
||
6212 | if (n) { |
||
6213 | n[1].i = location; |
||
6214 | n[2].f = x; |
||
6215 | n[3].f = y; |
||
6216 | } |
||
6217 | if (ctx->ExecuteFlag) { |
||
6218 | CALL_Uniform2fARB(ctx->Exec, (location, x, y)); |
||
6219 | } |
||
6220 | } |
||
6221 | |||
6222 | |||
6223 | static void GLAPIENTRY |
||
6224 | save_Uniform3fARB(GLint location, GLfloat x, GLfloat y, GLfloat z) |
||
6225 | { |
||
6226 | GET_CURRENT_CONTEXT(ctx); |
||
6227 | Node *n; |
||
6228 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6229 | n = alloc_instruction(ctx, OPCODE_UNIFORM_3F, 4); |
||
6230 | if (n) { |
||
6231 | n[1].i = location; |
||
6232 | n[2].f = x; |
||
6233 | n[3].f = y; |
||
6234 | n[4].f = z; |
||
6235 | } |
||
6236 | if (ctx->ExecuteFlag) { |
||
6237 | CALL_Uniform3fARB(ctx->Exec, (location, x, y, z)); |
||
6238 | } |
||
6239 | } |
||
6240 | |||
6241 | |||
6242 | static void GLAPIENTRY |
||
6243 | save_Uniform4fARB(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) |
||
6244 | { |
||
6245 | GET_CURRENT_CONTEXT(ctx); |
||
6246 | Node *n; |
||
6247 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6248 | n = alloc_instruction(ctx, OPCODE_UNIFORM_4F, 5); |
||
6249 | if (n) { |
||
6250 | n[1].i = location; |
||
6251 | n[2].f = x; |
||
6252 | n[3].f = y; |
||
6253 | n[4].f = z; |
||
6254 | n[5].f = w; |
||
6255 | } |
||
6256 | if (ctx->ExecuteFlag) { |
||
6257 | CALL_Uniform4fARB(ctx->Exec, (location, x, y, z, w)); |
||
6258 | } |
||
6259 | } |
||
6260 | |||
6261 | |||
6262 | /** Return copy of memory */ |
||
6263 | static void * |
||
6264 | memdup(const void *src, GLsizei bytes) |
||
6265 | { |
||
6266 | void *b = bytes >= 0 ? malloc(bytes) : NULL; |
||
6267 | if (b) |
||
6268 | memcpy(b, src, bytes); |
||
6269 | return b; |
||
6270 | } |
||
6271 | |||
6272 | |||
6273 | static void GLAPIENTRY |
||
6274 | save_Uniform1fvARB(GLint location, GLsizei count, const GLfloat *v) |
||
6275 | { |
||
6276 | GET_CURRENT_CONTEXT(ctx); |
||
6277 | Node *n; |
||
6278 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6279 | n = alloc_instruction(ctx, OPCODE_UNIFORM_1FV, 3); |
||
6280 | if (n) { |
||
6281 | n[1].i = location; |
||
6282 | n[2].i = count; |
||
6283 | n[3].data = memdup(v, count * 1 * sizeof(GLfloat)); |
||
6284 | } |
||
6285 | if (ctx->ExecuteFlag) { |
||
6286 | CALL_Uniform1fvARB(ctx->Exec, (location, count, v)); |
||
6287 | } |
||
6288 | } |
||
6289 | |||
6290 | static void GLAPIENTRY |
||
6291 | save_Uniform2fvARB(GLint location, GLsizei count, const GLfloat *v) |
||
6292 | { |
||
6293 | GET_CURRENT_CONTEXT(ctx); |
||
6294 | Node *n; |
||
6295 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6296 | n = alloc_instruction(ctx, OPCODE_UNIFORM_2FV, 3); |
||
6297 | if (n) { |
||
6298 | n[1].i = location; |
||
6299 | n[2].i = count; |
||
6300 | n[3].data = memdup(v, count * 2 * sizeof(GLfloat)); |
||
6301 | } |
||
6302 | if (ctx->ExecuteFlag) { |
||
6303 | CALL_Uniform2fvARB(ctx->Exec, (location, count, v)); |
||
6304 | } |
||
6305 | } |
||
6306 | |||
6307 | static void GLAPIENTRY |
||
6308 | save_Uniform3fvARB(GLint location, GLsizei count, const GLfloat *v) |
||
6309 | { |
||
6310 | GET_CURRENT_CONTEXT(ctx); |
||
6311 | Node *n; |
||
6312 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6313 | n = alloc_instruction(ctx, OPCODE_UNIFORM_3FV, 3); |
||
6314 | if (n) { |
||
6315 | n[1].i = location; |
||
6316 | n[2].i = count; |
||
6317 | n[3].data = memdup(v, count * 3 * sizeof(GLfloat)); |
||
6318 | } |
||
6319 | if (ctx->ExecuteFlag) { |
||
6320 | CALL_Uniform3fvARB(ctx->Exec, (location, count, v)); |
||
6321 | } |
||
6322 | } |
||
6323 | |||
6324 | static void GLAPIENTRY |
||
6325 | save_Uniform4fvARB(GLint location, GLsizei count, const GLfloat *v) |
||
6326 | { |
||
6327 | GET_CURRENT_CONTEXT(ctx); |
||
6328 | Node *n; |
||
6329 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6330 | n = alloc_instruction(ctx, OPCODE_UNIFORM_4FV, 3); |
||
6331 | if (n) { |
||
6332 | n[1].i = location; |
||
6333 | n[2].i = count; |
||
6334 | n[3].data = memdup(v, count * 4 * sizeof(GLfloat)); |
||
6335 | } |
||
6336 | if (ctx->ExecuteFlag) { |
||
6337 | CALL_Uniform4fvARB(ctx->Exec, (location, count, v)); |
||
6338 | } |
||
6339 | } |
||
6340 | |||
6341 | |||
6342 | static void GLAPIENTRY |
||
6343 | save_Uniform1iARB(GLint location, GLint x) |
||
6344 | { |
||
6345 | GET_CURRENT_CONTEXT(ctx); |
||
6346 | Node *n; |
||
6347 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6348 | n = alloc_instruction(ctx, OPCODE_UNIFORM_1I, 2); |
||
6349 | if (n) { |
||
6350 | n[1].i = location; |
||
6351 | n[2].i = x; |
||
6352 | } |
||
6353 | if (ctx->ExecuteFlag) { |
||
6354 | CALL_Uniform1iARB(ctx->Exec, (location, x)); |
||
6355 | } |
||
6356 | } |
||
6357 | |||
6358 | static void GLAPIENTRY |
||
6359 | save_Uniform2iARB(GLint location, GLint x, GLint y) |
||
6360 | { |
||
6361 | GET_CURRENT_CONTEXT(ctx); |
||
6362 | Node *n; |
||
6363 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6364 | n = alloc_instruction(ctx, OPCODE_UNIFORM_2I, 3); |
||
6365 | if (n) { |
||
6366 | n[1].i = location; |
||
6367 | n[2].i = x; |
||
6368 | n[3].i = y; |
||
6369 | } |
||
6370 | if (ctx->ExecuteFlag) { |
||
6371 | CALL_Uniform2iARB(ctx->Exec, (location, x, y)); |
||
6372 | } |
||
6373 | } |
||
6374 | |||
6375 | static void GLAPIENTRY |
||
6376 | save_Uniform3iARB(GLint location, GLint x, GLint y, GLint z) |
||
6377 | { |
||
6378 | GET_CURRENT_CONTEXT(ctx); |
||
6379 | Node *n; |
||
6380 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6381 | n = alloc_instruction(ctx, OPCODE_UNIFORM_3I, 4); |
||
6382 | if (n) { |
||
6383 | n[1].i = location; |
||
6384 | n[2].i = x; |
||
6385 | n[3].i = y; |
||
6386 | n[4].i = z; |
||
6387 | } |
||
6388 | if (ctx->ExecuteFlag) { |
||
6389 | CALL_Uniform3iARB(ctx->Exec, (location, x, y, z)); |
||
6390 | } |
||
6391 | } |
||
6392 | |||
6393 | static void GLAPIENTRY |
||
6394 | save_Uniform4iARB(GLint location, GLint x, GLint y, GLint z, GLint w) |
||
6395 | { |
||
6396 | GET_CURRENT_CONTEXT(ctx); |
||
6397 | Node *n; |
||
6398 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6399 | n = alloc_instruction(ctx, OPCODE_UNIFORM_4I, 5); |
||
6400 | if (n) { |
||
6401 | n[1].i = location; |
||
6402 | n[2].i = x; |
||
6403 | n[3].i = y; |
||
6404 | n[4].i = z; |
||
6405 | n[5].i = w; |
||
6406 | } |
||
6407 | if (ctx->ExecuteFlag) { |
||
6408 | CALL_Uniform4iARB(ctx->Exec, (location, x, y, z, w)); |
||
6409 | } |
||
6410 | } |
||
6411 | |||
6412 | |||
6413 | |||
6414 | static void GLAPIENTRY |
||
6415 | save_Uniform1ivARB(GLint location, GLsizei count, const GLint *v) |
||
6416 | { |
||
6417 | GET_CURRENT_CONTEXT(ctx); |
||
6418 | Node *n; |
||
6419 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6420 | n = alloc_instruction(ctx, OPCODE_UNIFORM_1IV, 3); |
||
6421 | if (n) { |
||
6422 | n[1].i = location; |
||
6423 | n[2].i = count; |
||
6424 | n[3].data = memdup(v, count * 1 * sizeof(GLint)); |
||
6425 | } |
||
6426 | if (ctx->ExecuteFlag) { |
||
6427 | CALL_Uniform1ivARB(ctx->Exec, (location, count, v)); |
||
6428 | } |
||
6429 | } |
||
6430 | |||
6431 | static void GLAPIENTRY |
||
6432 | save_Uniform2ivARB(GLint location, GLsizei count, const GLint *v) |
||
6433 | { |
||
6434 | GET_CURRENT_CONTEXT(ctx); |
||
6435 | Node *n; |
||
6436 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6437 | n = alloc_instruction(ctx, OPCODE_UNIFORM_2IV, 3); |
||
6438 | if (n) { |
||
6439 | n[1].i = location; |
||
6440 | n[2].i = count; |
||
6441 | n[3].data = memdup(v, count * 2 * sizeof(GLint)); |
||
6442 | } |
||
6443 | if (ctx->ExecuteFlag) { |
||
6444 | CALL_Uniform2ivARB(ctx->Exec, (location, count, v)); |
||
6445 | } |
||
6446 | } |
||
6447 | |||
6448 | static void GLAPIENTRY |
||
6449 | save_Uniform3ivARB(GLint location, GLsizei count, const GLint *v) |
||
6450 | { |
||
6451 | GET_CURRENT_CONTEXT(ctx); |
||
6452 | Node *n; |
||
6453 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6454 | n = alloc_instruction(ctx, OPCODE_UNIFORM_3IV, 3); |
||
6455 | if (n) { |
||
6456 | n[1].i = location; |
||
6457 | n[2].i = count; |
||
6458 | n[3].data = memdup(v, count * 3 * sizeof(GLint)); |
||
6459 | } |
||
6460 | if (ctx->ExecuteFlag) { |
||
6461 | CALL_Uniform3ivARB(ctx->Exec, (location, count, v)); |
||
6462 | } |
||
6463 | } |
||
6464 | |||
6465 | static void GLAPIENTRY |
||
6466 | save_Uniform4ivARB(GLint location, GLsizei count, const GLint *v) |
||
6467 | { |
||
6468 | GET_CURRENT_CONTEXT(ctx); |
||
6469 | Node *n; |
||
6470 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6471 | n = alloc_instruction(ctx, OPCODE_UNIFORM_4IV, 3); |
||
6472 | if (n) { |
||
6473 | n[1].i = location; |
||
6474 | n[2].i = count; |
||
6475 | n[3].data = memdup(v, count * 4 * sizeof(GLfloat)); |
||
6476 | } |
||
6477 | if (ctx->ExecuteFlag) { |
||
6478 | CALL_Uniform4ivARB(ctx->Exec, (location, count, v)); |
||
6479 | } |
||
6480 | } |
||
6481 | |||
6482 | |||
6483 | |||
6484 | static void GLAPIENTRY |
||
6485 | save_Uniform1ui(GLint location, GLuint x) |
||
6486 | { |
||
6487 | GET_CURRENT_CONTEXT(ctx); |
||
6488 | Node *n; |
||
6489 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6490 | n = alloc_instruction(ctx, OPCODE_UNIFORM_1UI, 2); |
||
6491 | if (n) { |
||
6492 | n[1].i = location; |
||
6493 | n[2].i = x; |
||
6494 | } |
||
6495 | if (ctx->ExecuteFlag) { |
||
6496 | /*CALL_Uniform1ui(ctx->Exec, (location, x));*/ |
||
6497 | } |
||
6498 | } |
||
6499 | |||
6500 | static void GLAPIENTRY |
||
6501 | save_Uniform2ui(GLint location, GLuint x, GLuint y) |
||
6502 | { |
||
6503 | GET_CURRENT_CONTEXT(ctx); |
||
6504 | Node *n; |
||
6505 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6506 | n = alloc_instruction(ctx, OPCODE_UNIFORM_2UI, 3); |
||
6507 | if (n) { |
||
6508 | n[1].i = location; |
||
6509 | n[2].i = x; |
||
6510 | n[3].i = y; |
||
6511 | } |
||
6512 | if (ctx->ExecuteFlag) { |
||
6513 | /*CALL_Uniform2ui(ctx->Exec, (location, x, y));*/ |
||
6514 | } |
||
6515 | } |
||
6516 | |||
6517 | static void GLAPIENTRY |
||
6518 | save_Uniform3ui(GLint location, GLuint x, GLuint y, GLuint z) |
||
6519 | { |
||
6520 | GET_CURRENT_CONTEXT(ctx); |
||
6521 | Node *n; |
||
6522 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6523 | n = alloc_instruction(ctx, OPCODE_UNIFORM_3UI, 4); |
||
6524 | if (n) { |
||
6525 | n[1].i = location; |
||
6526 | n[2].i = x; |
||
6527 | n[3].i = y; |
||
6528 | n[4].i = z; |
||
6529 | } |
||
6530 | if (ctx->ExecuteFlag) { |
||
6531 | /*CALL_Uniform3ui(ctx->Exec, (location, x, y, z));*/ |
||
6532 | } |
||
6533 | } |
||
6534 | |||
6535 | static void GLAPIENTRY |
||
6536 | save_Uniform4ui(GLint location, GLuint x, GLuint y, GLuint z, GLuint w) |
||
6537 | { |
||
6538 | GET_CURRENT_CONTEXT(ctx); |
||
6539 | Node *n; |
||
6540 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6541 | n = alloc_instruction(ctx, OPCODE_UNIFORM_4UI, 5); |
||
6542 | if (n) { |
||
6543 | n[1].i = location; |
||
6544 | n[2].i = x; |
||
6545 | n[3].i = y; |
||
6546 | n[4].i = z; |
||
6547 | n[5].i = w; |
||
6548 | } |
||
6549 | if (ctx->ExecuteFlag) { |
||
6550 | /*CALL_Uniform4ui(ctx->Exec, (location, x, y, z, w));*/ |
||
6551 | } |
||
6552 | } |
||
6553 | |||
6554 | |||
6555 | |||
6556 | static void GLAPIENTRY |
||
6557 | save_Uniform1uiv(GLint location, GLsizei count, const GLuint *v) |
||
6558 | { |
||
6559 | GET_CURRENT_CONTEXT(ctx); |
||
6560 | Node *n; |
||
6561 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6562 | n = alloc_instruction(ctx, OPCODE_UNIFORM_1UIV, 3); |
||
6563 | if (n) { |
||
6564 | n[1].i = location; |
||
6565 | n[2].i = count; |
||
6566 | n[3].data = memdup(v, count * 1 * sizeof(*v)); |
||
6567 | } |
||
6568 | if (ctx->ExecuteFlag) { |
||
6569 | /*CALL_Uniform1uiv(ctx->Exec, (location, count, v));*/ |
||
6570 | } |
||
6571 | } |
||
6572 | |||
6573 | static void GLAPIENTRY |
||
6574 | save_Uniform2uiv(GLint location, GLsizei count, const GLuint *v) |
||
6575 | { |
||
6576 | GET_CURRENT_CONTEXT(ctx); |
||
6577 | Node *n; |
||
6578 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6579 | n = alloc_instruction(ctx, OPCODE_UNIFORM_2UIV, 3); |
||
6580 | if (n) { |
||
6581 | n[1].i = location; |
||
6582 | n[2].i = count; |
||
6583 | n[3].data = memdup(v, count * 2 * sizeof(*v)); |
||
6584 | } |
||
6585 | if (ctx->ExecuteFlag) { |
||
6586 | /*CALL_Uniform2uiv(ctx->Exec, (location, count, v));*/ |
||
6587 | } |
||
6588 | } |
||
6589 | |||
6590 | static void GLAPIENTRY |
||
6591 | save_Uniform3uiv(GLint location, GLsizei count, const GLuint *v) |
||
6592 | { |
||
6593 | GET_CURRENT_CONTEXT(ctx); |
||
6594 | Node *n; |
||
6595 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6596 | n = alloc_instruction(ctx, OPCODE_UNIFORM_3UIV, 3); |
||
6597 | if (n) { |
||
6598 | n[1].i = location; |
||
6599 | n[2].i = count; |
||
6600 | n[3].data = memdup(v, count * 3 * sizeof(*v)); |
||
6601 | } |
||
6602 | if (ctx->ExecuteFlag) { |
||
6603 | /*CALL_Uniform3uiv(ctx->Exec, (location, count, v));*/ |
||
6604 | } |
||
6605 | } |
||
6606 | |||
6607 | static void GLAPIENTRY |
||
6608 | save_Uniform4uiv(GLint location, GLsizei count, const GLuint *v) |
||
6609 | { |
||
6610 | GET_CURRENT_CONTEXT(ctx); |
||
6611 | Node *n; |
||
6612 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6613 | n = alloc_instruction(ctx, OPCODE_UNIFORM_4UIV, 3); |
||
6614 | if (n) { |
||
6615 | n[1].i = location; |
||
6616 | n[2].i = count; |
||
6617 | n[3].data = memdup(v, count * 4 * sizeof(*v)); |
||
6618 | } |
||
6619 | if (ctx->ExecuteFlag) { |
||
6620 | /*CALL_Uniform4uiv(ctx->Exec, (location, count, v));*/ |
||
6621 | } |
||
6622 | } |
||
6623 | |||
6624 | |||
6625 | |||
6626 | static void GLAPIENTRY |
||
6627 | save_UniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose, |
||
6628 | const GLfloat *m) |
||
6629 | { |
||
6630 | GET_CURRENT_CONTEXT(ctx); |
||
6631 | Node *n; |
||
6632 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6633 | n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX22, 4); |
||
6634 | if (n) { |
||
6635 | n[1].i = location; |
||
6636 | n[2].i = count; |
||
6637 | n[3].b = transpose; |
||
6638 | n[4].data = memdup(m, count * 2 * 2 * sizeof(GLfloat)); |
||
6639 | } |
||
6640 | if (ctx->ExecuteFlag) { |
||
6641 | CALL_UniformMatrix2fvARB(ctx->Exec, (location, count, transpose, m)); |
||
6642 | } |
||
6643 | } |
||
6644 | |||
6645 | static void GLAPIENTRY |
||
6646 | save_UniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose, |
||
6647 | const GLfloat *m) |
||
6648 | { |
||
6649 | GET_CURRENT_CONTEXT(ctx); |
||
6650 | Node *n; |
||
6651 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6652 | n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX33, 4); |
||
6653 | if (n) { |
||
6654 | n[1].i = location; |
||
6655 | n[2].i = count; |
||
6656 | n[3].b = transpose; |
||
6657 | n[4].data = memdup(m, count * 3 * 3 * sizeof(GLfloat)); |
||
6658 | } |
||
6659 | if (ctx->ExecuteFlag) { |
||
6660 | CALL_UniformMatrix3fvARB(ctx->Exec, (location, count, transpose, m)); |
||
6661 | } |
||
6662 | } |
||
6663 | |||
6664 | static void GLAPIENTRY |
||
6665 | save_UniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose, |
||
6666 | const GLfloat *m) |
||
6667 | { |
||
6668 | GET_CURRENT_CONTEXT(ctx); |
||
6669 | Node *n; |
||
6670 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6671 | n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX44, 4); |
||
6672 | if (n) { |
||
6673 | n[1].i = location; |
||
6674 | n[2].i = count; |
||
6675 | n[3].b = transpose; |
||
6676 | n[4].data = memdup(m, count * 4 * 4 * sizeof(GLfloat)); |
||
6677 | } |
||
6678 | if (ctx->ExecuteFlag) { |
||
6679 | CALL_UniformMatrix4fvARB(ctx->Exec, (location, count, transpose, m)); |
||
6680 | } |
||
6681 | } |
||
6682 | |||
6683 | |||
6684 | static void GLAPIENTRY |
||
6685 | save_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose, |
||
6686 | const GLfloat *m) |
||
6687 | { |
||
6688 | GET_CURRENT_CONTEXT(ctx); |
||
6689 | Node *n; |
||
6690 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6691 | n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX23, 4); |
||
6692 | if (n) { |
||
6693 | n[1].i = location; |
||
6694 | n[2].i = count; |
||
6695 | n[3].b = transpose; |
||
6696 | n[4].data = memdup(m, count * 2 * 3 * sizeof(GLfloat)); |
||
6697 | } |
||
6698 | if (ctx->ExecuteFlag) { |
||
6699 | CALL_UniformMatrix2x3fv(ctx->Exec, (location, count, transpose, m)); |
||
6700 | } |
||
6701 | } |
||
6702 | |||
6703 | static void GLAPIENTRY |
||
6704 | save_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, |
||
6705 | const GLfloat *m) |
||
6706 | { |
||
6707 | GET_CURRENT_CONTEXT(ctx); |
||
6708 | Node *n; |
||
6709 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6710 | n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX32, 4); |
||
6711 | if (n) { |
||
6712 | n[1].i = location; |
||
6713 | n[2].i = count; |
||
6714 | n[3].b = transpose; |
||
6715 | n[4].data = memdup(m, count * 3 * 2 * sizeof(GLfloat)); |
||
6716 | } |
||
6717 | if (ctx->ExecuteFlag) { |
||
6718 | CALL_UniformMatrix3x2fv(ctx->Exec, (location, count, transpose, m)); |
||
6719 | } |
||
6720 | } |
||
6721 | |||
6722 | |||
6723 | static void GLAPIENTRY |
||
6724 | save_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose, |
||
6725 | const GLfloat *m) |
||
6726 | { |
||
6727 | GET_CURRENT_CONTEXT(ctx); |
||
6728 | Node *n; |
||
6729 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6730 | n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX24, 4); |
||
6731 | if (n) { |
||
6732 | n[1].i = location; |
||
6733 | n[2].i = count; |
||
6734 | n[3].b = transpose; |
||
6735 | n[4].data = memdup(m, count * 2 * 4 * sizeof(GLfloat)); |
||
6736 | } |
||
6737 | if (ctx->ExecuteFlag) { |
||
6738 | CALL_UniformMatrix2x4fv(ctx->Exec, (location, count, transpose, m)); |
||
6739 | } |
||
6740 | } |
||
6741 | |||
6742 | static void GLAPIENTRY |
||
6743 | save_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose, |
||
6744 | const GLfloat *m) |
||
6745 | { |
||
6746 | GET_CURRENT_CONTEXT(ctx); |
||
6747 | Node *n; |
||
6748 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6749 | n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX42, 4); |
||
6750 | if (n) { |
||
6751 | n[1].i = location; |
||
6752 | n[2].i = count; |
||
6753 | n[3].b = transpose; |
||
6754 | n[4].data = memdup(m, count * 4 * 2 * sizeof(GLfloat)); |
||
6755 | } |
||
6756 | if (ctx->ExecuteFlag) { |
||
6757 | CALL_UniformMatrix4x2fv(ctx->Exec, (location, count, transpose, m)); |
||
6758 | } |
||
6759 | } |
||
6760 | |||
6761 | |||
6762 | static void GLAPIENTRY |
||
6763 | save_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, |
||
6764 | const GLfloat *m) |
||
6765 | { |
||
6766 | GET_CURRENT_CONTEXT(ctx); |
||
6767 | Node *n; |
||
6768 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6769 | n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX34, 4); |
||
6770 | if (n) { |
||
6771 | n[1].i = location; |
||
6772 | n[2].i = count; |
||
6773 | n[3].b = transpose; |
||
6774 | n[4].data = memdup(m, count * 3 * 4 * sizeof(GLfloat)); |
||
6775 | } |
||
6776 | if (ctx->ExecuteFlag) { |
||
6777 | CALL_UniformMatrix3x4fv(ctx->Exec, (location, count, transpose, m)); |
||
6778 | } |
||
6779 | } |
||
6780 | |||
6781 | static void GLAPIENTRY |
||
6782 | save_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose, |
||
6783 | const GLfloat *m) |
||
6784 | { |
||
6785 | GET_CURRENT_CONTEXT(ctx); |
||
6786 | Node *n; |
||
6787 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6788 | n = alloc_instruction(ctx, OPCODE_UNIFORM_MATRIX43, 4); |
||
6789 | if (n) { |
||
6790 | n[1].i = location; |
||
6791 | n[2].i = count; |
||
6792 | n[3].b = transpose; |
||
6793 | n[4].data = memdup(m, count * 4 * 3 * sizeof(GLfloat)); |
||
6794 | } |
||
6795 | if (ctx->ExecuteFlag) { |
||
6796 | CALL_UniformMatrix4x3fv(ctx->Exec, (location, count, transpose, m)); |
||
6797 | } |
||
6798 | } |
||
6799 | |||
6800 | static void GLAPIENTRY |
||
6801 | save_UseShaderProgramEXT(GLenum type, GLuint program) |
||
6802 | { |
||
6803 | GET_CURRENT_CONTEXT(ctx); |
||
6804 | Node *n; |
||
6805 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6806 | n = alloc_instruction(ctx, OPCODE_USE_SHADER_PROGRAM_EXT, 2); |
||
6807 | if (n) { |
||
6808 | n[1].ui = type; |
||
6809 | n[2].ui = program; |
||
6810 | } |
||
6811 | if (ctx->ExecuteFlag) { |
||
6812 | CALL_UseShaderProgramEXT(ctx->Exec, (type, program)); |
||
6813 | } |
||
6814 | } |
||
6815 | |||
6816 | static void GLAPIENTRY |
||
6817 | save_ActiveProgramEXT(GLuint program) |
||
6818 | { |
||
6819 | GET_CURRENT_CONTEXT(ctx); |
||
6820 | Node *n; |
||
6821 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6822 | n = alloc_instruction(ctx, OPCODE_ACTIVE_PROGRAM_EXT, 1); |
||
6823 | if (n) { |
||
6824 | n[1].ui = program; |
||
6825 | } |
||
6826 | if (ctx->ExecuteFlag) { |
||
6827 | CALL_ActiveProgramEXT(ctx->Exec, (program)); |
||
6828 | } |
||
6829 | } |
||
6830 | |||
6831 | /** GL_EXT_texture_integer */ |
||
6832 | static void GLAPIENTRY |
||
6833 | save_ClearColorIi(GLint red, GLint green, GLint blue, GLint alpha) |
||
6834 | { |
||
6835 | GET_CURRENT_CONTEXT(ctx); |
||
6836 | Node *n; |
||
6837 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6838 | n = alloc_instruction(ctx, OPCODE_CLEARCOLOR_I, 4); |
||
6839 | if (n) { |
||
6840 | n[1].i = red; |
||
6841 | n[2].i = green; |
||
6842 | n[3].i = blue; |
||
6843 | n[4].i = alpha; |
||
6844 | } |
||
6845 | if (ctx->ExecuteFlag) { |
||
6846 | CALL_ClearColorIiEXT(ctx->Exec, (red, green, blue, alpha)); |
||
6847 | } |
||
6848 | } |
||
6849 | |||
6850 | /** GL_EXT_texture_integer */ |
||
6851 | static void GLAPIENTRY |
||
6852 | save_ClearColorIui(GLuint red, GLuint green, GLuint blue, GLuint alpha) |
||
6853 | { |
||
6854 | GET_CURRENT_CONTEXT(ctx); |
||
6855 | Node *n; |
||
6856 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6857 | n = alloc_instruction(ctx, OPCODE_CLEARCOLOR_UI, 4); |
||
6858 | if (n) { |
||
6859 | n[1].ui = red; |
||
6860 | n[2].ui = green; |
||
6861 | n[3].ui = blue; |
||
6862 | n[4].ui = alpha; |
||
6863 | } |
||
6864 | if (ctx->ExecuteFlag) { |
||
6865 | CALL_ClearColorIuiEXT(ctx->Exec, (red, green, blue, alpha)); |
||
6866 | } |
||
6867 | } |
||
6868 | |||
6869 | /** GL_EXT_texture_integer */ |
||
6870 | static void GLAPIENTRY |
||
6871 | save_TexParameterIiv(GLenum target, GLenum pname, const GLint *params) |
||
6872 | { |
||
6873 | GET_CURRENT_CONTEXT(ctx); |
||
6874 | Node *n; |
||
6875 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6876 | n = alloc_instruction(ctx, OPCODE_TEXPARAMETER_I, 6); |
||
6877 | if (n) { |
||
6878 | n[1].e = target; |
||
6879 | n[2].e = pname; |
||
6880 | n[3].i = params[0]; |
||
6881 | n[4].i = params[1]; |
||
6882 | n[5].i = params[2]; |
||
6883 | n[6].i = params[3]; |
||
6884 | } |
||
6885 | if (ctx->ExecuteFlag) { |
||
6886 | CALL_TexParameterIivEXT(ctx->Exec, (target, pname, params)); |
||
6887 | } |
||
6888 | } |
||
6889 | |||
6890 | /** GL_EXT_texture_integer */ |
||
6891 | static void GLAPIENTRY |
||
6892 | save_TexParameterIuiv(GLenum target, GLenum pname, const GLuint *params) |
||
6893 | { |
||
6894 | GET_CURRENT_CONTEXT(ctx); |
||
6895 | Node *n; |
||
6896 | ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx); |
||
6897 | n = alloc_instruction(ctx, OPCODE_TEXPARAMETER_UI, 6); |
||
6898 | if (n) { |
||
6899 | n[1].e = target; |
||
6900 | n[2].e = pname; |
||
6901 | n[3].ui = params[0]; |
||
6902 | n[4].ui = params[1]; |
||
6903 | n[5].ui = params[2]; |
||
6904 | n[6].ui = params[3]; |
||
6905 | } |
||
6906 | if (ctx->ExecuteFlag) { |
||
6907 | CALL_TexParameterIuivEXT(ctx->Exec, (target, pname, params)); |
||
6908 | } |
||
6909 | } |
||
6910 | |||
6911 | /** GL_EXT_texture_integer */ |
||
6912 | static void GLAPIENTRY |
||
6913 | exec_GetTexParameterIiv(GLenum target, GLenum pname, GLint *params) |
||
6914 | { |
||
6915 | GET_CURRENT_CONTEXT(ctx); |
||
6916 | FLUSH_VERTICES(ctx, 0); |
||
6917 | CALL_GetTexParameterIivEXT(ctx->Exec, (target, pname, params)); |
||
6918 | } |
||
6919 | |||
6920 | /** GL_EXT_texture_integer */ |
||
6921 | static void GLAPIENTRY |
||
6922 | exec_GetTexParameterIuiv(GLenum target, GLenum pname, GLuint *params) |
||
6923 | { |
||
6924 | GET_CURRENT_CONTEXT(ctx); |
||
6925 | FLUSH_VERTICES(ctx, 0); |
||
6926 | CALL_GetTexParameterIuivEXT(ctx->Exec, (target, pname, params)); |
||
6927 | } |
||
6928 | |||
6929 | |||
6930 | |||
6931 | |||
6932 | |||
6933 | /** |
||
6934 | * Save an error-generating command into display list. |
||
6935 | * |
||
6936 | * KW: Will appear in the list before the vertex buffer containing the |
||
6937 | * command that provoked the error. I don't see this as a problem. |
||
6938 | */ |
||
6939 | static void |
||
6940 | save_error(struct gl_context *ctx, GLenum error, const char *s) |
||
6941 | { |
||
6942 | Node *n; |
||
6943 | n = alloc_instruction(ctx, OPCODE_ERROR, 2); |
||
6944 | if (n) { |
||
6945 | n[1].e = error; |
||
6946 | n[2].data = (void *) s; |
||
6947 | } |
||
6948 | } |
||
6949 | |||
6950 | |||
6951 | /** |
||
6952 | * Compile an error into current display list. |
||
6953 | */ |
||
6954 | void |
||
6955 | _mesa_compile_error(struct gl_context *ctx, GLenum error, const char *s) |
||
6956 | { |
||
6957 | if (ctx->CompileFlag) |
||
6958 | save_error(ctx, error, s); |
||
6959 | if (ctx->ExecuteFlag) |
||
6960 | _mesa_error(ctx, error, "%s", s); |
||
6961 | } |
||
6962 | |||
6963 | |||
6964 | /** |
||
6965 | * Test if ID names a display list. |
||
6966 | */ |
||
6967 | static GLboolean |
||
6968 | islist(struct gl_context *ctx, GLuint list) |
||
6969 | { |
||
6970 | if (list > 0 && lookup_list(ctx, list)) { |
||
6971 | return GL_TRUE; |
||
6972 | } |
||
6973 | else { |
||
6974 | return GL_FALSE; |
||
6975 | } |
||
6976 | } |
||
6977 | |||
6978 | |||
6979 | |||
6980 | /**********************************************************************/ |
||
6981 | /* Display list execution */ |
||
6982 | /**********************************************************************/ |
||
6983 | |||
6984 | |||
6985 | /* |
||
6986 | * Execute a display list. Note that the ListBase offset must have already |
||
6987 | * been added before calling this function. I.e. the list argument is |
||
6988 | * the absolute list number, not relative to ListBase. |
||
6989 | * \param list - display list number |
||
6990 | */ |
||
6991 | static void |
||
6992 | execute_list(struct gl_context *ctx, GLuint list) |
||
6993 | { |
||
6994 | struct gl_display_list *dlist; |
||
6995 | Node *n; |
||
6996 | GLboolean done; |
||
6997 | |||
6998 | if (list == 0 || !islist(ctx, list)) |
||
6999 | return; |
||
7000 | |||
7001 | if (ctx->ListState.CallDepth == MAX_LIST_NESTING) { |
||
7002 | /* raise an error? */ |
||
7003 | return; |
||
7004 | } |
||
7005 | |||
7006 | dlist = lookup_list(ctx, list); |
||
7007 | if (!dlist) |
||
7008 | return; |
||
7009 | |||
7010 | ctx->ListState.CallDepth++; |
||
7011 | |||
7012 | if (ctx->Driver.BeginCallList) |
||
7013 | ctx->Driver.BeginCallList(ctx, dlist); |
||
7014 | |||
7015 | n = dlist->Head; |
||
7016 | |||
7017 | done = GL_FALSE; |
||
7018 | while (!done) { |
||
7019 | const OpCode opcode = n[0].opcode; |
||
7020 | |||
7021 | if (is_ext_opcode(opcode)) { |
||
7022 | n += ext_opcode_execute(ctx, n); |
||
7023 | } |
||
7024 | else { |
||
7025 | switch (opcode) { |
||
7026 | case OPCODE_ERROR: |
||
7027 | _mesa_error(ctx, n[1].e, "%s", (const char *) n[2].data); |
||
7028 | break; |
||
7029 | case OPCODE_ACCUM: |
||
7030 | CALL_Accum(ctx->Exec, (n[1].e, n[2].f)); |
||
7031 | break; |
||
7032 | case OPCODE_ALPHA_FUNC: |
||
7033 | CALL_AlphaFunc(ctx->Exec, (n[1].e, n[2].f)); |
||
7034 | break; |
||
7035 | case OPCODE_BIND_TEXTURE: |
||
7036 | CALL_BindTexture(ctx->Exec, (n[1].e, n[2].ui)); |
||
7037 | break; |
||
7038 | case OPCODE_BITMAP: |
||
7039 | { |
||
7040 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7041 | ctx->Unpack = ctx->DefaultPacking; |
||
7042 | CALL_Bitmap(ctx->Exec, ((GLsizei) n[1].i, (GLsizei) n[2].i, |
||
7043 | n[3].f, n[4].f, n[5].f, n[6].f, |
||
7044 | (const GLubyte *) n[7].data)); |
||
7045 | ctx->Unpack = save; /* restore */ |
||
7046 | } |
||
7047 | break; |
||
7048 | case OPCODE_BLEND_COLOR: |
||
7049 | CALL_BlendColor(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f)); |
||
7050 | break; |
||
7051 | case OPCODE_BLEND_EQUATION: |
||
7052 | CALL_BlendEquation(ctx->Exec, (n[1].e)); |
||
7053 | break; |
||
7054 | case OPCODE_BLEND_EQUATION_SEPARATE: |
||
7055 | CALL_BlendEquationSeparateEXT(ctx->Exec, (n[1].e, n[2].e)); |
||
7056 | break; |
||
7057 | case OPCODE_BLEND_FUNC_SEPARATE: |
||
7058 | CALL_BlendFuncSeparateEXT(ctx->Exec, |
||
7059 | (n[1].e, n[2].e, n[3].e, n[4].e)); |
||
7060 | break; |
||
7061 | case OPCODE_CALL_LIST: |
||
7062 | /* Generated by glCallList(), don't add ListBase */ |
||
7063 | if (ctx->ListState.CallDepth < MAX_LIST_NESTING) { |
||
7064 | execute_list(ctx, n[1].ui); |
||
7065 | } |
||
7066 | break; |
||
7067 | case OPCODE_CALL_LIST_OFFSET: |
||
7068 | /* Generated by glCallLists() so we must add ListBase */ |
||
7069 | if (n[2].b) { |
||
7070 | /* user specified a bad data type at compile time */ |
||
7071 | _mesa_error(ctx, GL_INVALID_ENUM, "glCallLists(type)"); |
||
7072 | } |
||
7073 | else if (ctx->ListState.CallDepth < MAX_LIST_NESTING) { |
||
7074 | GLuint list = (GLuint) (ctx->List.ListBase + n[1].i); |
||
7075 | execute_list(ctx, list); |
||
7076 | } |
||
7077 | break; |
||
7078 | case OPCODE_CLEAR: |
||
7079 | CALL_Clear(ctx->Exec, (n[1].bf)); |
||
7080 | break; |
||
7081 | case OPCODE_CLEAR_BUFFER_IV: |
||
7082 | { |
||
7083 | GLint value[4]; |
||
7084 | value[0] = n[3].i; |
||
7085 | value[1] = n[4].i; |
||
7086 | value[2] = n[5].i; |
||
7087 | value[3] = n[6].i; |
||
7088 | /*CALL_ClearBufferiv(ctx->Exec, (n[1].e, n[2].i, value));*/ |
||
7089 | } |
||
7090 | break; |
||
7091 | case OPCODE_CLEAR_BUFFER_UIV: |
||
7092 | { |
||
7093 | GLuint value[4]; |
||
7094 | value[0] = n[3].ui; |
||
7095 | value[1] = n[4].ui; |
||
7096 | value[2] = n[5].ui; |
||
7097 | value[3] = n[6].ui; |
||
7098 | /*CALL_ClearBufferiv(ctx->Exec, (n[1].e, n[2].i, value));*/ |
||
7099 | } |
||
7100 | break; |
||
7101 | case OPCODE_CLEAR_BUFFER_FV: |
||
7102 | { |
||
7103 | GLfloat value[4]; |
||
7104 | value[0] = n[3].f; |
||
7105 | value[1] = n[4].f; |
||
7106 | value[2] = n[5].f; |
||
7107 | value[3] = n[6].f; |
||
7108 | /*CALL_ClearBufferfv(ctx->Exec, (n[1].e, n[2].i, value));*/ |
||
7109 | } |
||
7110 | break; |
||
7111 | case OPCODE_CLEAR_BUFFER_FI: |
||
7112 | /*CALL_ClearBufferfi(ctx->Exec, (n[1].e, n[2].i, n[3].f, n[4].i));*/ |
||
7113 | break; |
||
7114 | case OPCODE_CLEAR_COLOR: |
||
7115 | CALL_ClearColor(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f)); |
||
7116 | break; |
||
7117 | case OPCODE_CLEAR_ACCUM: |
||
7118 | CALL_ClearAccum(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f)); |
||
7119 | break; |
||
7120 | case OPCODE_CLEAR_DEPTH: |
||
7121 | CALL_ClearDepth(ctx->Exec, ((GLclampd) n[1].f)); |
||
7122 | break; |
||
7123 | case OPCODE_CLEAR_INDEX: |
||
7124 | CALL_ClearIndex(ctx->Exec, ((GLfloat) n[1].ui)); |
||
7125 | break; |
||
7126 | case OPCODE_CLEAR_STENCIL: |
||
7127 | CALL_ClearStencil(ctx->Exec, (n[1].i)); |
||
7128 | break; |
||
7129 | case OPCODE_CLIP_PLANE: |
||
7130 | { |
||
7131 | GLdouble eq[4]; |
||
7132 | eq[0] = n[2].f; |
||
7133 | eq[1] = n[3].f; |
||
7134 | eq[2] = n[4].f; |
||
7135 | eq[3] = n[5].f; |
||
7136 | CALL_ClipPlane(ctx->Exec, (n[1].e, eq)); |
||
7137 | } |
||
7138 | break; |
||
7139 | case OPCODE_COLOR_MASK: |
||
7140 | CALL_ColorMask(ctx->Exec, (n[1].b, n[2].b, n[3].b, n[4].b)); |
||
7141 | break; |
||
7142 | case OPCODE_COLOR_MASK_INDEXED: |
||
7143 | CALL_ColorMaskIndexedEXT(ctx->Exec, (n[1].ui, n[2].b, n[3].b, |
||
7144 | n[4].b, n[5].b)); |
||
7145 | break; |
||
7146 | case OPCODE_COLOR_MATERIAL: |
||
7147 | CALL_ColorMaterial(ctx->Exec, (n[1].e, n[2].e)); |
||
7148 | break; |
||
7149 | case OPCODE_COLOR_TABLE: |
||
7150 | { |
||
7151 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7152 | ctx->Unpack = ctx->DefaultPacking; |
||
7153 | CALL_ColorTable(ctx->Exec, (n[1].e, n[2].e, n[3].i, n[4].e, |
||
7154 | n[5].e, n[6].data)); |
||
7155 | ctx->Unpack = save; /* restore */ |
||
7156 | } |
||
7157 | break; |
||
7158 | case OPCODE_COLOR_TABLE_PARAMETER_FV: |
||
7159 | { |
||
7160 | GLfloat params[4]; |
||
7161 | params[0] = n[3].f; |
||
7162 | params[1] = n[4].f; |
||
7163 | params[2] = n[5].f; |
||
7164 | params[3] = n[6].f; |
||
7165 | CALL_ColorTableParameterfv(ctx->Exec, |
||
7166 | (n[1].e, n[2].e, params)); |
||
7167 | } |
||
7168 | break; |
||
7169 | case OPCODE_COLOR_TABLE_PARAMETER_IV: |
||
7170 | { |
||
7171 | GLint params[4]; |
||
7172 | params[0] = n[3].i; |
||
7173 | params[1] = n[4].i; |
||
7174 | params[2] = n[5].i; |
||
7175 | params[3] = n[6].i; |
||
7176 | CALL_ColorTableParameteriv(ctx->Exec, |
||
7177 | (n[1].e, n[2].e, params)); |
||
7178 | } |
||
7179 | break; |
||
7180 | case OPCODE_COLOR_SUB_TABLE: |
||
7181 | { |
||
7182 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7183 | ctx->Unpack = ctx->DefaultPacking; |
||
7184 | CALL_ColorSubTable(ctx->Exec, (n[1].e, n[2].i, n[3].i, |
||
7185 | n[4].e, n[5].e, n[6].data)); |
||
7186 | ctx->Unpack = save; /* restore */ |
||
7187 | } |
||
7188 | break; |
||
7189 | case OPCODE_CONVOLUTION_FILTER_1D: |
||
7190 | { |
||
7191 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7192 | ctx->Unpack = ctx->DefaultPacking; |
||
7193 | CALL_ConvolutionFilter1D(ctx->Exec, (n[1].e, n[2].i, n[3].i, |
||
7194 | n[4].e, n[5].e, |
||
7195 | n[6].data)); |
||
7196 | ctx->Unpack = save; /* restore */ |
||
7197 | } |
||
7198 | break; |
||
7199 | case OPCODE_CONVOLUTION_FILTER_2D: |
||
7200 | { |
||
7201 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7202 | ctx->Unpack = ctx->DefaultPacking; |
||
7203 | CALL_ConvolutionFilter2D(ctx->Exec, (n[1].e, n[2].i, n[3].i, |
||
7204 | n[4].i, n[5].e, n[6].e, |
||
7205 | n[7].data)); |
||
7206 | ctx->Unpack = save; /* restore */ |
||
7207 | } |
||
7208 | break; |
||
7209 | case OPCODE_CONVOLUTION_PARAMETER_I: |
||
7210 | CALL_ConvolutionParameteri(ctx->Exec, (n[1].e, n[2].e, n[3].i)); |
||
7211 | break; |
||
7212 | case OPCODE_CONVOLUTION_PARAMETER_IV: |
||
7213 | { |
||
7214 | GLint params[4]; |
||
7215 | params[0] = n[3].i; |
||
7216 | params[1] = n[4].i; |
||
7217 | params[2] = n[5].i; |
||
7218 | params[3] = n[6].i; |
||
7219 | CALL_ConvolutionParameteriv(ctx->Exec, |
||
7220 | (n[1].e, n[2].e, params)); |
||
7221 | } |
||
7222 | break; |
||
7223 | case OPCODE_CONVOLUTION_PARAMETER_F: |
||
7224 | CALL_ConvolutionParameterf(ctx->Exec, (n[1].e, n[2].e, n[3].f)); |
||
7225 | break; |
||
7226 | case OPCODE_CONVOLUTION_PARAMETER_FV: |
||
7227 | { |
||
7228 | GLfloat params[4]; |
||
7229 | params[0] = n[3].f; |
||
7230 | params[1] = n[4].f; |
||
7231 | params[2] = n[5].f; |
||
7232 | params[3] = n[6].f; |
||
7233 | CALL_ConvolutionParameterfv(ctx->Exec, |
||
7234 | (n[1].e, n[2].e, params)); |
||
7235 | } |
||
7236 | break; |
||
7237 | case OPCODE_COPY_COLOR_SUB_TABLE: |
||
7238 | CALL_CopyColorSubTable(ctx->Exec, (n[1].e, n[2].i, |
||
7239 | n[3].i, n[4].i, n[5].i)); |
||
7240 | break; |
||
7241 | case OPCODE_COPY_COLOR_TABLE: |
||
7242 | CALL_CopyColorSubTable(ctx->Exec, (n[1].e, n[2].i, |
||
7243 | n[3].i, n[4].i, n[5].i)); |
||
7244 | break; |
||
7245 | case OPCODE_COPY_PIXELS: |
||
7246 | CALL_CopyPixels(ctx->Exec, (n[1].i, n[2].i, |
||
7247 | (GLsizei) n[3].i, (GLsizei) n[4].i, |
||
7248 | n[5].e)); |
||
7249 | break; |
||
7250 | case OPCODE_COPY_TEX_IMAGE1D: |
||
7251 | CALL_CopyTexImage1D(ctx->Exec, (n[1].e, n[2].i, n[3].e, n[4].i, |
||
7252 | n[5].i, n[6].i, n[7].i)); |
||
7253 | break; |
||
7254 | case OPCODE_COPY_TEX_IMAGE2D: |
||
7255 | CALL_CopyTexImage2D(ctx->Exec, (n[1].e, n[2].i, n[3].e, n[4].i, |
||
7256 | n[5].i, n[6].i, n[7].i, n[8].i)); |
||
7257 | break; |
||
7258 | case OPCODE_COPY_TEX_SUB_IMAGE1D: |
||
7259 | CALL_CopyTexSubImage1D(ctx->Exec, (n[1].e, n[2].i, n[3].i, |
||
7260 | n[4].i, n[5].i, n[6].i)); |
||
7261 | break; |
||
7262 | case OPCODE_COPY_TEX_SUB_IMAGE2D: |
||
7263 | CALL_CopyTexSubImage2D(ctx->Exec, (n[1].e, n[2].i, n[3].i, |
||
7264 | n[4].i, n[5].i, n[6].i, n[7].i, |
||
7265 | n[8].i)); |
||
7266 | break; |
||
7267 | case OPCODE_COPY_TEX_SUB_IMAGE3D: |
||
7268 | CALL_CopyTexSubImage3D(ctx->Exec, (n[1].e, n[2].i, n[3].i, |
||
7269 | n[4].i, n[5].i, n[6].i, n[7].i, |
||
7270 | n[8].i, n[9].i)); |
||
7271 | break; |
||
7272 | case OPCODE_CULL_FACE: |
||
7273 | CALL_CullFace(ctx->Exec, (n[1].e)); |
||
7274 | break; |
||
7275 | case OPCODE_DEPTH_FUNC: |
||
7276 | CALL_DepthFunc(ctx->Exec, (n[1].e)); |
||
7277 | break; |
||
7278 | case OPCODE_DEPTH_MASK: |
||
7279 | CALL_DepthMask(ctx->Exec, (n[1].b)); |
||
7280 | break; |
||
7281 | case OPCODE_DEPTH_RANGE: |
||
7282 | CALL_DepthRange(ctx->Exec, |
||
7283 | ((GLclampd) n[1].f, (GLclampd) n[2].f)); |
||
7284 | break; |
||
7285 | case OPCODE_DISABLE: |
||
7286 | CALL_Disable(ctx->Exec, (n[1].e)); |
||
7287 | break; |
||
7288 | case OPCODE_DISABLE_INDEXED: |
||
7289 | CALL_DisableIndexedEXT(ctx->Exec, (n[1].ui, n[2].e)); |
||
7290 | break; |
||
7291 | case OPCODE_DRAW_BUFFER: |
||
7292 | CALL_DrawBuffer(ctx->Exec, (n[1].e)); |
||
7293 | break; |
||
7294 | case OPCODE_DRAW_PIXELS: |
||
7295 | { |
||
7296 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7297 | ctx->Unpack = ctx->DefaultPacking; |
||
7298 | CALL_DrawPixels(ctx->Exec, (n[1].i, n[2].i, n[3].e, n[4].e, |
||
7299 | n[5].data)); |
||
7300 | ctx->Unpack = save; /* restore */ |
||
7301 | } |
||
7302 | break; |
||
7303 | case OPCODE_ENABLE: |
||
7304 | CALL_Enable(ctx->Exec, (n[1].e)); |
||
7305 | break; |
||
7306 | case OPCODE_ENABLE_INDEXED: |
||
7307 | CALL_EnableIndexedEXT(ctx->Exec, (n[1].ui, n[2].e)); |
||
7308 | break; |
||
7309 | case OPCODE_EVALMESH1: |
||
7310 | CALL_EvalMesh1(ctx->Exec, (n[1].e, n[2].i, n[3].i)); |
||
7311 | break; |
||
7312 | case OPCODE_EVALMESH2: |
||
7313 | CALL_EvalMesh2(ctx->Exec, |
||
7314 | (n[1].e, n[2].i, n[3].i, n[4].i, n[5].i)); |
||
7315 | break; |
||
7316 | case OPCODE_FOG: |
||
7317 | { |
||
7318 | GLfloat p[4]; |
||
7319 | p[0] = n[2].f; |
||
7320 | p[1] = n[3].f; |
||
7321 | p[2] = n[4].f; |
||
7322 | p[3] = n[5].f; |
||
7323 | CALL_Fogfv(ctx->Exec, (n[1].e, p)); |
||
7324 | } |
||
7325 | break; |
||
7326 | case OPCODE_FRONT_FACE: |
||
7327 | CALL_FrontFace(ctx->Exec, (n[1].e)); |
||
7328 | break; |
||
7329 | case OPCODE_FRUSTUM: |
||
7330 | CALL_Frustum(ctx->Exec, |
||
7331 | (n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f)); |
||
7332 | break; |
||
7333 | case OPCODE_HINT: |
||
7334 | CALL_Hint(ctx->Exec, (n[1].e, n[2].e)); |
||
7335 | break; |
||
7336 | case OPCODE_HISTOGRAM: |
||
7337 | CALL_Histogram(ctx->Exec, (n[1].e, n[2].i, n[3].e, n[4].b)); |
||
7338 | break; |
||
7339 | case OPCODE_INDEX_MASK: |
||
7340 | CALL_IndexMask(ctx->Exec, (n[1].ui)); |
||
7341 | break; |
||
7342 | case OPCODE_INIT_NAMES: |
||
7343 | CALL_InitNames(ctx->Exec, ()); |
||
7344 | break; |
||
7345 | case OPCODE_LIGHT: |
||
7346 | { |
||
7347 | GLfloat p[4]; |
||
7348 | p[0] = n[3].f; |
||
7349 | p[1] = n[4].f; |
||
7350 | p[2] = n[5].f; |
||
7351 | p[3] = n[6].f; |
||
7352 | CALL_Lightfv(ctx->Exec, (n[1].e, n[2].e, p)); |
||
7353 | } |
||
7354 | break; |
||
7355 | case OPCODE_LIGHT_MODEL: |
||
7356 | { |
||
7357 | GLfloat p[4]; |
||
7358 | p[0] = n[2].f; |
||
7359 | p[1] = n[3].f; |
||
7360 | p[2] = n[4].f; |
||
7361 | p[3] = n[5].f; |
||
7362 | CALL_LightModelfv(ctx->Exec, (n[1].e, p)); |
||
7363 | } |
||
7364 | break; |
||
7365 | case OPCODE_LINE_STIPPLE: |
||
7366 | CALL_LineStipple(ctx->Exec, (n[1].i, n[2].us)); |
||
7367 | break; |
||
7368 | case OPCODE_LINE_WIDTH: |
||
7369 | CALL_LineWidth(ctx->Exec, (n[1].f)); |
||
7370 | break; |
||
7371 | case OPCODE_LIST_BASE: |
||
7372 | CALL_ListBase(ctx->Exec, (n[1].ui)); |
||
7373 | break; |
||
7374 | case OPCODE_LOAD_IDENTITY: |
||
7375 | CALL_LoadIdentity(ctx->Exec, ()); |
||
7376 | break; |
||
7377 | case OPCODE_LOAD_MATRIX: |
||
7378 | if (sizeof(Node) == sizeof(GLfloat)) { |
||
7379 | CALL_LoadMatrixf(ctx->Exec, (&n[1].f)); |
||
7380 | } |
||
7381 | else { |
||
7382 | GLfloat m[16]; |
||
7383 | GLuint i; |
||
7384 | for (i = 0; i < 16; i++) { |
||
7385 | m[i] = n[1 + i].f; |
||
7386 | } |
||
7387 | CALL_LoadMatrixf(ctx->Exec, (m)); |
||
7388 | } |
||
7389 | break; |
||
7390 | case OPCODE_LOAD_NAME: |
||
7391 | CALL_LoadName(ctx->Exec, (n[1].ui)); |
||
7392 | break; |
||
7393 | case OPCODE_LOGIC_OP: |
||
7394 | CALL_LogicOp(ctx->Exec, (n[1].e)); |
||
7395 | break; |
||
7396 | case OPCODE_MAP1: |
||
7397 | { |
||
7398 | GLenum target = n[1].e; |
||
7399 | GLint ustride = _mesa_evaluator_components(target); |
||
7400 | GLint uorder = n[5].i; |
||
7401 | GLfloat u1 = n[2].f; |
||
7402 | GLfloat u2 = n[3].f; |
||
7403 | CALL_Map1f(ctx->Exec, (target, u1, u2, ustride, uorder, |
||
7404 | (GLfloat *) n[6].data)); |
||
7405 | } |
||
7406 | break; |
||
7407 | case OPCODE_MAP2: |
||
7408 | { |
||
7409 | GLenum target = n[1].e; |
||
7410 | GLfloat u1 = n[2].f; |
||
7411 | GLfloat u2 = n[3].f; |
||
7412 | GLfloat v1 = n[4].f; |
||
7413 | GLfloat v2 = n[5].f; |
||
7414 | GLint ustride = n[6].i; |
||
7415 | GLint vstride = n[7].i; |
||
7416 | GLint uorder = n[8].i; |
||
7417 | GLint vorder = n[9].i; |
||
7418 | CALL_Map2f(ctx->Exec, (target, u1, u2, ustride, uorder, |
||
7419 | v1, v2, vstride, vorder, |
||
7420 | (GLfloat *) n[10].data)); |
||
7421 | } |
||
7422 | break; |
||
7423 | case OPCODE_MAPGRID1: |
||
7424 | CALL_MapGrid1f(ctx->Exec, (n[1].i, n[2].f, n[3].f)); |
||
7425 | break; |
||
7426 | case OPCODE_MAPGRID2: |
||
7427 | CALL_MapGrid2f(ctx->Exec, |
||
7428 | (n[1].i, n[2].f, n[3].f, n[4].i, n[5].f, n[6].f)); |
||
7429 | break; |
||
7430 | case OPCODE_MATRIX_MODE: |
||
7431 | CALL_MatrixMode(ctx->Exec, (n[1].e)); |
||
7432 | break; |
||
7433 | case OPCODE_MIN_MAX: |
||
7434 | CALL_Minmax(ctx->Exec, (n[1].e, n[2].e, n[3].b)); |
||
7435 | break; |
||
7436 | case OPCODE_MULT_MATRIX: |
||
7437 | if (sizeof(Node) == sizeof(GLfloat)) { |
||
7438 | CALL_MultMatrixf(ctx->Exec, (&n[1].f)); |
||
7439 | } |
||
7440 | else { |
||
7441 | GLfloat m[16]; |
||
7442 | GLuint i; |
||
7443 | for (i = 0; i < 16; i++) { |
||
7444 | m[i] = n[1 + i].f; |
||
7445 | } |
||
7446 | CALL_MultMatrixf(ctx->Exec, (m)); |
||
7447 | } |
||
7448 | break; |
||
7449 | case OPCODE_ORTHO: |
||
7450 | CALL_Ortho(ctx->Exec, |
||
7451 | (n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f)); |
||
7452 | break; |
||
7453 | case OPCODE_PASSTHROUGH: |
||
7454 | CALL_PassThrough(ctx->Exec, (n[1].f)); |
||
7455 | break; |
||
7456 | case OPCODE_PIXEL_MAP: |
||
7457 | CALL_PixelMapfv(ctx->Exec, |
||
7458 | (n[1].e, n[2].i, (GLfloat *) n[3].data)); |
||
7459 | break; |
||
7460 | case OPCODE_PIXEL_TRANSFER: |
||
7461 | CALL_PixelTransferf(ctx->Exec, (n[1].e, n[2].f)); |
||
7462 | break; |
||
7463 | case OPCODE_PIXEL_ZOOM: |
||
7464 | CALL_PixelZoom(ctx->Exec, (n[1].f, n[2].f)); |
||
7465 | break; |
||
7466 | case OPCODE_POINT_SIZE: |
||
7467 | CALL_PointSize(ctx->Exec, (n[1].f)); |
||
7468 | break; |
||
7469 | case OPCODE_POINT_PARAMETERS: |
||
7470 | { |
||
7471 | GLfloat params[3]; |
||
7472 | params[0] = n[2].f; |
||
7473 | params[1] = n[3].f; |
||
7474 | params[2] = n[4].f; |
||
7475 | CALL_PointParameterfvEXT(ctx->Exec, (n[1].e, params)); |
||
7476 | } |
||
7477 | break; |
||
7478 | case OPCODE_POLYGON_MODE: |
||
7479 | CALL_PolygonMode(ctx->Exec, (n[1].e, n[2].e)); |
||
7480 | break; |
||
7481 | case OPCODE_POLYGON_STIPPLE: |
||
7482 | { |
||
7483 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7484 | ctx->Unpack = ctx->DefaultPacking; |
||
7485 | CALL_PolygonStipple(ctx->Exec, ((GLubyte *) n[1].data)); |
||
7486 | ctx->Unpack = save; /* restore */ |
||
7487 | } |
||
7488 | break; |
||
7489 | case OPCODE_POLYGON_OFFSET: |
||
7490 | CALL_PolygonOffset(ctx->Exec, (n[1].f, n[2].f)); |
||
7491 | break; |
||
7492 | case OPCODE_POP_ATTRIB: |
||
7493 | CALL_PopAttrib(ctx->Exec, ()); |
||
7494 | break; |
||
7495 | case OPCODE_POP_MATRIX: |
||
7496 | CALL_PopMatrix(ctx->Exec, ()); |
||
7497 | break; |
||
7498 | case OPCODE_POP_NAME: |
||
7499 | CALL_PopName(ctx->Exec, ()); |
||
7500 | break; |
||
7501 | case OPCODE_PRIORITIZE_TEXTURE: |
||
7502 | CALL_PrioritizeTextures(ctx->Exec, (1, &n[1].ui, &n[2].f)); |
||
7503 | break; |
||
7504 | case OPCODE_PUSH_ATTRIB: |
||
7505 | CALL_PushAttrib(ctx->Exec, (n[1].bf)); |
||
7506 | break; |
||
7507 | case OPCODE_PUSH_MATRIX: |
||
7508 | CALL_PushMatrix(ctx->Exec, ()); |
||
7509 | break; |
||
7510 | case OPCODE_PUSH_NAME: |
||
7511 | CALL_PushName(ctx->Exec, (n[1].ui)); |
||
7512 | break; |
||
7513 | case OPCODE_RASTER_POS: |
||
7514 | CALL_RasterPos4f(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f)); |
||
7515 | break; |
||
7516 | case OPCODE_READ_BUFFER: |
||
7517 | CALL_ReadBuffer(ctx->Exec, (n[1].e)); |
||
7518 | break; |
||
7519 | case OPCODE_RESET_HISTOGRAM: |
||
7520 | CALL_ResetHistogram(ctx->Exec, (n[1].e)); |
||
7521 | break; |
||
7522 | case OPCODE_RESET_MIN_MAX: |
||
7523 | CALL_ResetMinmax(ctx->Exec, (n[1].e)); |
||
7524 | break; |
||
7525 | case OPCODE_ROTATE: |
||
7526 | CALL_Rotatef(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f)); |
||
7527 | break; |
||
7528 | case OPCODE_SCALE: |
||
7529 | CALL_Scalef(ctx->Exec, (n[1].f, n[2].f, n[3].f)); |
||
7530 | break; |
||
7531 | case OPCODE_SCISSOR: |
||
7532 | CALL_Scissor(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i)); |
||
7533 | break; |
||
7534 | case OPCODE_SHADE_MODEL: |
||
7535 | CALL_ShadeModel(ctx->Exec, (n[1].e)); |
||
7536 | break; |
||
7537 | case OPCODE_PROVOKING_VERTEX: |
||
7538 | CALL_ProvokingVertexEXT(ctx->Exec, (n[1].e)); |
||
7539 | break; |
||
7540 | case OPCODE_BEGIN_TRANSFORM_FEEDBACK: |
||
7541 | CALL_BeginTransformFeedbackEXT(ctx->Exec, (n[1].e)); |
||
7542 | break; |
||
7543 | case OPCODE_END_TRANSFORM_FEEDBACK: |
||
7544 | CALL_EndTransformFeedbackEXT(ctx->Exec, ()); |
||
7545 | break; |
||
7546 | case OPCODE_STENCIL_FUNC: |
||
7547 | CALL_StencilFunc(ctx->Exec, (n[1].e, n[2].i, n[3].ui)); |
||
7548 | break; |
||
7549 | case OPCODE_STENCIL_MASK: |
||
7550 | CALL_StencilMask(ctx->Exec, (n[1].ui)); |
||
7551 | break; |
||
7552 | case OPCODE_STENCIL_OP: |
||
7553 | CALL_StencilOp(ctx->Exec, (n[1].e, n[2].e, n[3].e)); |
||
7554 | break; |
||
7555 | case OPCODE_STENCIL_FUNC_SEPARATE: |
||
7556 | CALL_StencilFuncSeparate(ctx->Exec, |
||
7557 | (n[1].e, n[2].e, n[3].i, n[4].ui)); |
||
7558 | break; |
||
7559 | case OPCODE_STENCIL_MASK_SEPARATE: |
||
7560 | CALL_StencilMaskSeparate(ctx->Exec, (n[1].e, n[2].ui)); |
||
7561 | break; |
||
7562 | case OPCODE_STENCIL_OP_SEPARATE: |
||
7563 | CALL_StencilOpSeparate(ctx->Exec, |
||
7564 | (n[1].e, n[2].e, n[3].e, n[4].e)); |
||
7565 | break; |
||
7566 | case OPCODE_TEXENV: |
||
7567 | { |
||
7568 | GLfloat params[4]; |
||
7569 | params[0] = n[3].f; |
||
7570 | params[1] = n[4].f; |
||
7571 | params[2] = n[5].f; |
||
7572 | params[3] = n[6].f; |
||
7573 | CALL_TexEnvfv(ctx->Exec, (n[1].e, n[2].e, params)); |
||
7574 | } |
||
7575 | break; |
||
7576 | case OPCODE_TEXGEN: |
||
7577 | { |
||
7578 | GLfloat params[4]; |
||
7579 | params[0] = n[3].f; |
||
7580 | params[1] = n[4].f; |
||
7581 | params[2] = n[5].f; |
||
7582 | params[3] = n[6].f; |
||
7583 | CALL_TexGenfv(ctx->Exec, (n[1].e, n[2].e, params)); |
||
7584 | } |
||
7585 | break; |
||
7586 | case OPCODE_TEXPARAMETER: |
||
7587 | { |
||
7588 | GLfloat params[4]; |
||
7589 | params[0] = n[3].f; |
||
7590 | params[1] = n[4].f; |
||
7591 | params[2] = n[5].f; |
||
7592 | params[3] = n[6].f; |
||
7593 | CALL_TexParameterfv(ctx->Exec, (n[1].e, n[2].e, params)); |
||
7594 | } |
||
7595 | break; |
||
7596 | case OPCODE_TEX_IMAGE1D: |
||
7597 | { |
||
7598 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7599 | ctx->Unpack = ctx->DefaultPacking; |
||
7600 | CALL_TexImage1D(ctx->Exec, (n[1].e, /* target */ |
||
7601 | n[2].i, /* level */ |
||
7602 | n[3].i, /* components */ |
||
7603 | n[4].i, /* width */ |
||
7604 | n[5].e, /* border */ |
||
7605 | n[6].e, /* format */ |
||
7606 | n[7].e, /* type */ |
||
7607 | n[8].data)); |
||
7608 | ctx->Unpack = save; /* restore */ |
||
7609 | } |
||
7610 | break; |
||
7611 | case OPCODE_TEX_IMAGE2D: |
||
7612 | { |
||
7613 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7614 | ctx->Unpack = ctx->DefaultPacking; |
||
7615 | CALL_TexImage2D(ctx->Exec, (n[1].e, /* target */ |
||
7616 | n[2].i, /* level */ |
||
7617 | n[3].i, /* components */ |
||
7618 | n[4].i, /* width */ |
||
7619 | n[5].i, /* height */ |
||
7620 | n[6].e, /* border */ |
||
7621 | n[7].e, /* format */ |
||
7622 | n[8].e, /* type */ |
||
7623 | n[9].data)); |
||
7624 | ctx->Unpack = save; /* restore */ |
||
7625 | } |
||
7626 | break; |
||
7627 | case OPCODE_TEX_IMAGE3D: |
||
7628 | { |
||
7629 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7630 | ctx->Unpack = ctx->DefaultPacking; |
||
7631 | CALL_TexImage3D(ctx->Exec, (n[1].e, /* target */ |
||
7632 | n[2].i, /* level */ |
||
7633 | n[3].i, /* components */ |
||
7634 | n[4].i, /* width */ |
||
7635 | n[5].i, /* height */ |
||
7636 | n[6].i, /* depth */ |
||
7637 | n[7].e, /* border */ |
||
7638 | n[8].e, /* format */ |
||
7639 | n[9].e, /* type */ |
||
7640 | n[10].data)); |
||
7641 | ctx->Unpack = save; /* restore */ |
||
7642 | } |
||
7643 | break; |
||
7644 | case OPCODE_TEX_SUB_IMAGE1D: |
||
7645 | { |
||
7646 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7647 | ctx->Unpack = ctx->DefaultPacking; |
||
7648 | CALL_TexSubImage1D(ctx->Exec, (n[1].e, n[2].i, n[3].i, |
||
7649 | n[4].i, n[5].e, |
||
7650 | n[6].e, n[7].data)); |
||
7651 | ctx->Unpack = save; /* restore */ |
||
7652 | } |
||
7653 | break; |
||
7654 | case OPCODE_TEX_SUB_IMAGE2D: |
||
7655 | { |
||
7656 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7657 | ctx->Unpack = ctx->DefaultPacking; |
||
7658 | CALL_TexSubImage2D(ctx->Exec, (n[1].e, n[2].i, n[3].i, |
||
7659 | n[4].i, n[5].e, |
||
7660 | n[6].i, n[7].e, n[8].e, |
||
7661 | n[9].data)); |
||
7662 | ctx->Unpack = save; /* restore */ |
||
7663 | } |
||
7664 | break; |
||
7665 | case OPCODE_TEX_SUB_IMAGE3D: |
||
7666 | { |
||
7667 | const struct gl_pixelstore_attrib save = ctx->Unpack; |
||
7668 | ctx->Unpack = ctx->DefaultPacking; |
||
7669 | CALL_TexSubImage3D(ctx->Exec, (n[1].e, n[2].i, n[3].i, |
||
7670 | n[4].i, n[5].i, n[6].i, n[7].i, |
||
7671 | n[8].i, n[9].e, n[10].e, |
||
7672 | n[11].data)); |
||
7673 | ctx->Unpack = save; /* restore */ |
||
7674 | } |
||
7675 | break; |
||
7676 | case OPCODE_TRANSLATE: |
||
7677 | CALL_Translatef(ctx->Exec, (n[1].f, n[2].f, n[3].f)); |
||
7678 | break; |
||
7679 | case OPCODE_VIEWPORT: |
||
7680 | CALL_Viewport(ctx->Exec, (n[1].i, n[2].i, |
||
7681 | (GLsizei) n[3].i, (GLsizei) n[4].i)); |
||
7682 | break; |
||
7683 | case OPCODE_WINDOW_POS: |
||
7684 | CALL_WindowPos4fMESA(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f)); |
||
7685 | break; |
||
7686 | case OPCODE_ACTIVE_TEXTURE: /* GL_ARB_multitexture */ |
||
7687 | CALL_ActiveTextureARB(ctx->Exec, (n[1].e)); |
||
7688 | break; |
||
7689 | case OPCODE_COMPRESSED_TEX_IMAGE_1D: /* GL_ARB_texture_compression */ |
||
7690 | CALL_CompressedTexImage1DARB(ctx->Exec, (n[1].e, n[2].i, n[3].e, |
||
7691 | n[4].i, n[5].i, n[6].i, |
||
7692 | n[7].data)); |
||
7693 | break; |
||
7694 | case OPCODE_COMPRESSED_TEX_IMAGE_2D: /* GL_ARB_texture_compression */ |
||
7695 | CALL_CompressedTexImage2DARB(ctx->Exec, (n[1].e, n[2].i, n[3].e, |
||
7696 | n[4].i, n[5].i, n[6].i, |
||
7697 | n[7].i, n[8].data)); |
||
7698 | break; |
||
7699 | case OPCODE_COMPRESSED_TEX_IMAGE_3D: /* GL_ARB_texture_compression */ |
||
7700 | CALL_CompressedTexImage3DARB(ctx->Exec, (n[1].e, n[2].i, n[3].e, |
||
7701 | n[4].i, n[5].i, n[6].i, |
||
7702 | n[7].i, n[8].i, |
||
7703 | n[9].data)); |
||
7704 | break; |
||
7705 | case OPCODE_COMPRESSED_TEX_SUB_IMAGE_1D: /* GL_ARB_texture_compress */ |
||
7706 | CALL_CompressedTexSubImage1DARB(ctx->Exec, |
||
7707 | (n[1].e, n[2].i, n[3].i, n[4].i, |
||
7708 | n[5].e, n[6].i, n[7].data)); |
||
7709 | break; |
||
7710 | case OPCODE_COMPRESSED_TEX_SUB_IMAGE_2D: /* GL_ARB_texture_compress */ |
||
7711 | CALL_CompressedTexSubImage2DARB(ctx->Exec, |
||
7712 | (n[1].e, n[2].i, n[3].i, n[4].i, |
||
7713 | n[5].i, n[6].i, n[7].e, n[8].i, |
||
7714 | n[9].data)); |
||
7715 | break; |
||
7716 | case OPCODE_COMPRESSED_TEX_SUB_IMAGE_3D: /* GL_ARB_texture_compress */ |
||
7717 | CALL_CompressedTexSubImage3DARB(ctx->Exec, |
||
7718 | (n[1].e, n[2].i, n[3].i, n[4].i, |
||
7719 | n[5].i, n[6].i, n[7].i, n[8].i, |
||
7720 | n[9].e, n[10].i, n[11].data)); |
||
7721 | break; |
||
7722 | case OPCODE_SAMPLE_COVERAGE: /* GL_ARB_multisample */ |
||
7723 | CALL_SampleCoverageARB(ctx->Exec, (n[1].f, n[2].b)); |
||
7724 | break; |
||
7725 | case OPCODE_WINDOW_POS_ARB: /* GL_ARB_window_pos */ |
||
7726 | CALL_WindowPos3fMESA(ctx->Exec, (n[1].f, n[2].f, n[3].f)); |
||
7727 | break; |
||
7728 | #if FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program |
||
7729 | case OPCODE_BIND_PROGRAM_NV: /* GL_NV_vertex_program */ |
||
7730 | CALL_BindProgramNV(ctx->Exec, (n[1].e, n[2].ui)); |
||
7731 | break; |
||
7732 | #endif |
||
7733 | #if FEATURE_NV_vertex_program |
||
7734 | case OPCODE_EXECUTE_PROGRAM_NV: |
||
7735 | { |
||
7736 | GLfloat v[4]; |
||
7737 | v[0] = n[3].f; |
||
7738 | v[1] = n[4].f; |
||
7739 | v[2] = n[5].f; |
||
7740 | v[3] = n[6].f; |
||
7741 | CALL_ExecuteProgramNV(ctx->Exec, (n[1].e, n[2].ui, v)); |
||
7742 | } |
||
7743 | break; |
||
7744 | case OPCODE_REQUEST_RESIDENT_PROGRAMS_NV: |
||
7745 | CALL_RequestResidentProgramsNV(ctx->Exec, (n[1].ui, |
||
7746 | (GLuint *) n[2].data)); |
||
7747 | break; |
||
7748 | case OPCODE_LOAD_PROGRAM_NV: |
||
7749 | CALL_LoadProgramNV(ctx->Exec, (n[1].e, n[2].ui, n[3].i, |
||
7750 | (const GLubyte *) n[4].data)); |
||
7751 | break; |
||
7752 | case OPCODE_TRACK_MATRIX_NV: |
||
7753 | CALL_TrackMatrixNV(ctx->Exec, (n[1].e, n[2].ui, n[3].e, n[4].e)); |
||
7754 | break; |
||
7755 | #endif |
||
7756 | |||
7757 | #if FEATURE_NV_fragment_program |
||
7758 | case OPCODE_PROGRAM_LOCAL_PARAMETER_ARB: |
||
7759 | CALL_ProgramLocalParameter4fARB(ctx->Exec, |
||
7760 | (n[1].e, n[2].ui, n[3].f, n[4].f, |
||
7761 | n[5].f, n[6].f)); |
||
7762 | break; |
||
7763 | case OPCODE_PROGRAM_NAMED_PARAMETER_NV: |
||
7764 | CALL_ProgramNamedParameter4fNV(ctx->Exec, (n[1].ui, n[2].i, |
||
7765 | (const GLubyte *) n[3]. |
||
7766 | data, n[4].f, n[5].f, |
||
7767 | n[6].f, n[7].f)); |
||
7768 | break; |
||
7769 | #endif |
||
7770 | |||
7771 | case OPCODE_ACTIVE_STENCIL_FACE_EXT: |
||
7772 | CALL_ActiveStencilFaceEXT(ctx->Exec, (n[1].e)); |
||
7773 | break; |
||
7774 | case OPCODE_DEPTH_BOUNDS_EXT: |
||
7775 | CALL_DepthBoundsEXT(ctx->Exec, (n[1].f, n[2].f)); |
||
7776 | break; |
||
7777 | #if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program |
||
7778 | case OPCODE_PROGRAM_STRING_ARB: |
||
7779 | CALL_ProgramStringARB(ctx->Exec, |
||
7780 | (n[1].e, n[2].e, n[3].i, n[4].data)); |
||
7781 | break; |
||
7782 | #endif |
||
7783 | #if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program || FEATURE_NV_vertex_program |
||
7784 | case OPCODE_PROGRAM_ENV_PARAMETER_ARB: |
||
7785 | CALL_ProgramEnvParameter4fARB(ctx->Exec, (n[1].e, n[2].ui, n[3].f, |
||
7786 | n[4].f, n[5].f, |
||
7787 | n[6].f)); |
||
7788 | break; |
||
7789 | #endif |
||
7790 | #if FEATURE_queryobj |
||
7791 | case OPCODE_BEGIN_QUERY_ARB: |
||
7792 | CALL_BeginQueryARB(ctx->Exec, (n[1].e, n[2].ui)); |
||
7793 | break; |
||
7794 | case OPCODE_END_QUERY_ARB: |
||
7795 | CALL_EndQueryARB(ctx->Exec, (n[1].e)); |
||
7796 | break; |
||
7797 | #endif |
||
7798 | case OPCODE_DRAW_BUFFERS_ARB: |
||
7799 | { |
||
7800 | GLenum buffers[MAX_DRAW_BUFFERS]; |
||
7801 | GLint i, count = MIN2(n[1].i, MAX_DRAW_BUFFERS); |
||
7802 | for (i = 0; i < count; i++) |
||
7803 | buffers[i] = n[2 + i].e; |
||
7804 | CALL_DrawBuffersARB(ctx->Exec, (n[1].i, buffers)); |
||
7805 | } |
||
7806 | break; |
||
7807 | #if FEATURE_EXT_framebuffer_blit |
||
7808 | case OPCODE_BLIT_FRAMEBUFFER: |
||
7809 | CALL_BlitFramebufferEXT(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i, |
||
7810 | n[5].i, n[6].i, n[7].i, n[8].i, |
||
7811 | n[9].i, n[10].e)); |
||
7812 | break; |
||
7813 | #endif |
||
7814 | |||
7815 | case OPCODE_USE_PROGRAM: |
||
7816 | CALL_UseProgramObjectARB(ctx->Exec, (n[1].ui)); |
||
7817 | break; |
||
7818 | case OPCODE_USE_SHADER_PROGRAM_EXT: |
||
7819 | CALL_UseShaderProgramEXT(ctx->Exec, (n[1].ui, n[2].ui)); |
||
7820 | break; |
||
7821 | case OPCODE_ACTIVE_PROGRAM_EXT: |
||
7822 | CALL_ActiveProgramEXT(ctx->Exec, (n[1].ui)); |
||
7823 | break; |
||
7824 | case OPCODE_UNIFORM_1F: |
||
7825 | CALL_Uniform1fARB(ctx->Exec, (n[1].i, n[2].f)); |
||
7826 | break; |
||
7827 | case OPCODE_UNIFORM_2F: |
||
7828 | CALL_Uniform2fARB(ctx->Exec, (n[1].i, n[2].f, n[3].f)); |
||
7829 | break; |
||
7830 | case OPCODE_UNIFORM_3F: |
||
7831 | CALL_Uniform3fARB(ctx->Exec, (n[1].i, n[2].f, n[3].f, n[4].f)); |
||
7832 | break; |
||
7833 | case OPCODE_UNIFORM_4F: |
||
7834 | CALL_Uniform4fARB(ctx->Exec, |
||
7835 | (n[1].i, n[2].f, n[3].f, n[4].f, n[5].f)); |
||
7836 | break; |
||
7837 | case OPCODE_UNIFORM_1FV: |
||
7838 | CALL_Uniform1fvARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); |
||
7839 | break; |
||
7840 | case OPCODE_UNIFORM_2FV: |
||
7841 | CALL_Uniform2fvARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); |
||
7842 | break; |
||
7843 | case OPCODE_UNIFORM_3FV: |
||
7844 | CALL_Uniform3fvARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); |
||
7845 | break; |
||
7846 | case OPCODE_UNIFORM_4FV: |
||
7847 | CALL_Uniform4fvARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); |
||
7848 | break; |
||
7849 | case OPCODE_UNIFORM_1I: |
||
7850 | CALL_Uniform1iARB(ctx->Exec, (n[1].i, n[2].i)); |
||
7851 | break; |
||
7852 | case OPCODE_UNIFORM_2I: |
||
7853 | CALL_Uniform2iARB(ctx->Exec, (n[1].i, n[2].i, n[3].i)); |
||
7854 | break; |
||
7855 | case OPCODE_UNIFORM_3I: |
||
7856 | CALL_Uniform3iARB(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i)); |
||
7857 | break; |
||
7858 | case OPCODE_UNIFORM_4I: |
||
7859 | CALL_Uniform4iARB(ctx->Exec, |
||
7860 | (n[1].i, n[2].i, n[3].i, n[4].i, n[5].i)); |
||
7861 | break; |
||
7862 | case OPCODE_UNIFORM_1IV: |
||
7863 | CALL_Uniform1ivARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); |
||
7864 | break; |
||
7865 | case OPCODE_UNIFORM_2IV: |
||
7866 | CALL_Uniform2ivARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); |
||
7867 | break; |
||
7868 | case OPCODE_UNIFORM_3IV: |
||
7869 | CALL_Uniform3ivARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); |
||
7870 | break; |
||
7871 | case OPCODE_UNIFORM_4IV: |
||
7872 | CALL_Uniform4ivARB(ctx->Exec, (n[1].i, n[2].i, n[3].data)); |
||
7873 | break; |
||
7874 | case OPCODE_UNIFORM_1UI: |
||
7875 | /*CALL_Uniform1uiARB(ctx->Exec, (n[1].i, n[2].i));*/ |
||
7876 | break; |
||
7877 | case OPCODE_UNIFORM_2UI: |
||
7878 | /*CALL_Uniform2uiARB(ctx->Exec, (n[1].i, n[2].i, n[3].i));*/ |
||
7879 | break; |
||
7880 | case OPCODE_UNIFORM_3UI: |
||
7881 | /*CALL_Uniform3uiARB(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i));*/ |
||
7882 | break; |
||
7883 | case OPCODE_UNIFORM_4UI: |
||
7884 | /*CALL_Uniform4uiARB(ctx->Exec, |
||
7885 | (n[1].i, n[2].i, n[3].i, n[4].i, n[5].i)); |
||
7886 | */ |
||
7887 | break; |
||
7888 | case OPCODE_UNIFORM_1UIV: |
||
7889 | /*CALL_Uniform1uivARB(ctx->Exec, (n[1].i, n[2].i, n[3].data));*/ |
||
7890 | break; |
||
7891 | case OPCODE_UNIFORM_2UIV: |
||
7892 | /*CALL_Uniform2uivARB(ctx->Exec, (n[1].i, n[2].i, n[3].data));*/ |
||
7893 | break; |
||
7894 | case OPCODE_UNIFORM_3UIV: |
||
7895 | /*CALL_Uniform3uivARB(ctx->Exec, (n[1].i, n[2].i, n[3].data));*/ |
||
7896 | break; |
||
7897 | case OPCODE_UNIFORM_4UIV: |
||
7898 | /*CALL_Uniform4uivARB(ctx->Exec, (n[1].i, n[2].i, n[3].data));*/ |
||
7899 | break; |
||
7900 | case OPCODE_UNIFORM_MATRIX22: |
||
7901 | CALL_UniformMatrix2fvARB(ctx->Exec, |
||
7902 | (n[1].i, n[2].i, n[3].b, n[4].data)); |
||
7903 | break; |
||
7904 | case OPCODE_UNIFORM_MATRIX33: |
||
7905 | CALL_UniformMatrix3fvARB(ctx->Exec, |
||
7906 | (n[1].i, n[2].i, n[3].b, n[4].data)); |
||
7907 | break; |
||
7908 | case OPCODE_UNIFORM_MATRIX44: |
||
7909 | CALL_UniformMatrix4fvARB(ctx->Exec, |
||
7910 | (n[1].i, n[2].i, n[3].b, n[4].data)); |
||
7911 | break; |
||
7912 | case OPCODE_UNIFORM_MATRIX23: |
||
7913 | CALL_UniformMatrix2x3fv(ctx->Exec, |
||
7914 | (n[1].i, n[2].i, n[3].b, n[4].data)); |
||
7915 | break; |
||
7916 | case OPCODE_UNIFORM_MATRIX32: |
||
7917 | CALL_UniformMatrix3x2fv(ctx->Exec, |
||
7918 | (n[1].i, n[2].i, n[3].b, n[4].data)); |
||
7919 | break; |
||
7920 | case OPCODE_UNIFORM_MATRIX24: |
||
7921 | CALL_UniformMatrix2x4fv(ctx->Exec, |
||
7922 | (n[1].i, n[2].i, n[3].b, n[4].data)); |
||
7923 | break; |
||
7924 | case OPCODE_UNIFORM_MATRIX42: |
||
7925 | CALL_UniformMatrix4x2fv(ctx->Exec, |
||
7926 | (n[1].i, n[2].i, n[3].b, n[4].data)); |
||
7927 | break; |
||
7928 | case OPCODE_UNIFORM_MATRIX34: |
||
7929 | CALL_UniformMatrix3x4fv(ctx->Exec, |
||
7930 | (n[1].i, n[2].i, n[3].b, n[4].data)); |
||
7931 | break; |
||
7932 | case OPCODE_UNIFORM_MATRIX43: |
||
7933 | CALL_UniformMatrix4x3fv(ctx->Exec, |
||
7934 | (n[1].i, n[2].i, n[3].b, n[4].data)); |
||
7935 | break; |
||
7936 | |||
7937 | case OPCODE_TEX_BUMP_PARAMETER_ATI: |
||
7938 | { |
||
7939 | GLfloat values[4]; |
||
7940 | GLuint i, pname = n[1].ui; |
||
7941 | |||
7942 | for (i = 0; i < 4; i++) |
||
7943 | values[i] = n[1 + i].f; |
||
7944 | CALL_TexBumpParameterfvATI(ctx->Exec, (pname, values)); |
||
7945 | } |
||
7946 | break; |
||
7947 | #if FEATURE_ATI_fragment_shader |
||
7948 | case OPCODE_BIND_FRAGMENT_SHADER_ATI: |
||
7949 | CALL_BindFragmentShaderATI(ctx->Exec, (n[1].i)); |
||
7950 | break; |
||
7951 | case OPCODE_SET_FRAGMENT_SHADER_CONSTANTS_ATI: |
||
7952 | { |
||
7953 | GLfloat values[4]; |
||
7954 | GLuint i, dst = n[1].ui; |
||
7955 | |||
7956 | for (i = 0; i < 4; i++) |
||
7957 | values[i] = n[1 + i].f; |
||
7958 | CALL_SetFragmentShaderConstantATI(ctx->Exec, (dst, values)); |
||
7959 | } |
||
7960 | break; |
||
7961 | #endif |
||
7962 | case OPCODE_ATTR_1F_NV: |
||
7963 | CALL_VertexAttrib1fNV(ctx->Exec, (n[1].e, n[2].f)); |
||
7964 | break; |
||
7965 | case OPCODE_ATTR_2F_NV: |
||
7966 | /* Really shouldn't have to do this - the Node structure |
||
7967 | * is convenient, but it would be better to store the data |
||
7968 | * packed appropriately so that it can be sent directly |
||
7969 | * on. With x86_64 becoming common, this will start to |
||
7970 | * matter more. |
||
7971 | */ |
||
7972 | if (sizeof(Node) == sizeof(GLfloat)) |
||
7973 | CALL_VertexAttrib2fvNV(ctx->Exec, (n[1].e, &n[2].f)); |
||
7974 | else |
||
7975 | CALL_VertexAttrib2fNV(ctx->Exec, (n[1].e, n[2].f, n[3].f)); |
||
7976 | break; |
||
7977 | case OPCODE_ATTR_3F_NV: |
||
7978 | if (sizeof(Node) == sizeof(GLfloat)) |
||
7979 | CALL_VertexAttrib3fvNV(ctx->Exec, (n[1].e, &n[2].f)); |
||
7980 | else |
||
7981 | CALL_VertexAttrib3fNV(ctx->Exec, (n[1].e, n[2].f, n[3].f, |
||
7982 | n[4].f)); |
||
7983 | break; |
||
7984 | case OPCODE_ATTR_4F_NV: |
||
7985 | if (sizeof(Node) == sizeof(GLfloat)) |
||
7986 | CALL_VertexAttrib4fvNV(ctx->Exec, (n[1].e, &n[2].f)); |
||
7987 | else |
||
7988 | CALL_VertexAttrib4fNV(ctx->Exec, (n[1].e, n[2].f, n[3].f, |
||
7989 | n[4].f, n[5].f)); |
||
7990 | break; |
||
7991 | case OPCODE_ATTR_1F_ARB: |
||
7992 | CALL_VertexAttrib1fARB(ctx->Exec, (n[1].e, n[2].f)); |
||
7993 | break; |
||
7994 | case OPCODE_ATTR_2F_ARB: |
||
7995 | /* Really shouldn't have to do this - the Node structure |
||
7996 | * is convenient, but it would be better to store the data |
||
7997 | * packed appropriately so that it can be sent directly |
||
7998 | * on. With x86_64 becoming common, this will start to |
||
7999 | * matter more. |
||
8000 | */ |
||
8001 | if (sizeof(Node) == sizeof(GLfloat)) |
||
8002 | CALL_VertexAttrib2fvARB(ctx->Exec, (n[1].e, &n[2].f)); |
||
8003 | else |
||
8004 | CALL_VertexAttrib2fARB(ctx->Exec, (n[1].e, n[2].f, n[3].f)); |
||
8005 | break; |
||
8006 | case OPCODE_ATTR_3F_ARB: |
||
8007 | if (sizeof(Node) == sizeof(GLfloat)) |
||
8008 | CALL_VertexAttrib3fvARB(ctx->Exec, (n[1].e, &n[2].f)); |
||
8009 | else |
||
8010 | CALL_VertexAttrib3fARB(ctx->Exec, (n[1].e, n[2].f, n[3].f, |
||
8011 | n[4].f)); |
||
8012 | break; |
||
8013 | case OPCODE_ATTR_4F_ARB: |
||
8014 | if (sizeof(Node) == sizeof(GLfloat)) |
||
8015 | CALL_VertexAttrib4fvARB(ctx->Exec, (n[1].e, &n[2].f)); |
||
8016 | else |
||
8017 | CALL_VertexAttrib4fARB(ctx->Exec, (n[1].e, n[2].f, n[3].f, |
||
8018 | n[4].f, n[5].f)); |
||
8019 | break; |
||
8020 | case OPCODE_MATERIAL: |
||
8021 | if (sizeof(Node) == sizeof(GLfloat)) |
||
8022 | CALL_Materialfv(ctx->Exec, (n[1].e, n[2].e, &n[3].f)); |
||
8023 | else { |
||
8024 | GLfloat f[4]; |
||
8025 | f[0] = n[3].f; |
||
8026 | f[1] = n[4].f; |
||
8027 | f[2] = n[5].f; |
||
8028 | f[3] = n[6].f; |
||
8029 | CALL_Materialfv(ctx->Exec, (n[1].e, n[2].e, f)); |
||
8030 | } |
||
8031 | break; |
||
8032 | case OPCODE_BEGIN: |
||
8033 | CALL_Begin(ctx->Exec, (n[1].e)); |
||
8034 | break; |
||
8035 | case OPCODE_END: |
||
8036 | CALL_End(ctx->Exec, ()); |
||
8037 | break; |
||
8038 | case OPCODE_RECTF: |
||
8039 | CALL_Rectf(ctx->Exec, (n[1].f, n[2].f, n[3].f, n[4].f)); |
||
8040 | break; |
||
8041 | case OPCODE_EVAL_C1: |
||
8042 | CALL_EvalCoord1f(ctx->Exec, (n[1].f)); |
||
8043 | break; |
||
8044 | case OPCODE_EVAL_C2: |
||
8045 | CALL_EvalCoord2f(ctx->Exec, (n[1].f, n[2].f)); |
||
8046 | break; |
||
8047 | case OPCODE_EVAL_P1: |
||
8048 | CALL_EvalPoint1(ctx->Exec, (n[1].i)); |
||
8049 | break; |
||
8050 | case OPCODE_EVAL_P2: |
||
8051 | CALL_EvalPoint2(ctx->Exec, (n[1].i, n[2].i)); |
||
8052 | break; |
||
8053 | |||
8054 | /* GL_EXT_texture_integer */ |
||
8055 | case OPCODE_CLEARCOLOR_I: |
||
8056 | CALL_ClearColorIiEXT(ctx->Exec, (n[1].i, n[2].i, n[3].i, n[4].i)); |
||
8057 | break; |
||
8058 | case OPCODE_CLEARCOLOR_UI: |
||
8059 | CALL_ClearColorIuiEXT(ctx->Exec, |
||
8060 | (n[1].ui, n[2].ui, n[3].ui, n[4].ui)); |
||
8061 | break; |
||
8062 | case OPCODE_TEXPARAMETER_I: |
||
8063 | { |
||
8064 | GLint params[4]; |
||
8065 | params[0] = n[3].i; |
||
8066 | params[1] = n[4].i; |
||
8067 | params[2] = n[5].i; |
||
8068 | params[3] = n[6].i; |
||
8069 | CALL_TexParameterIivEXT(ctx->Exec, (n[1].e, n[2].e, params)); |
||
8070 | } |
||
8071 | break; |
||
8072 | case OPCODE_TEXPARAMETER_UI: |
||
8073 | { |
||
8074 | GLuint params[4]; |
||
8075 | params[0] = n[3].ui; |
||
8076 | params[1] = n[4].ui; |
||
8077 | params[2] = n[5].ui; |
||
8078 | params[3] = n[6].ui; |
||
8079 | CALL_TexParameterIuivEXT(ctx->Exec, (n[1].e, n[2].e, params)); |
||
8080 | } |
||
8081 | break; |
||
8082 | |||
8083 | case OPCODE_CONTINUE: |
||
8084 | n = (Node *) n[1].next; |
||
8085 | break; |
||
8086 | case OPCODE_END_OF_LIST: |
||
8087 | done = GL_TRUE; |
||
8088 | break; |
||
8089 | default: |
||
8090 | { |
||
8091 | char msg[1000]; |
||
8092 | _mesa_snprintf(msg, sizeof(msg), "Error in execute_list: opcode=%d", |
||
8093 | (int) opcode); |
||
8094 | _mesa_problem(ctx, "%s", msg); |
||
8095 | } |
||
8096 | done = GL_TRUE; |
||
8097 | } |
||
8098 | |||
8099 | /* increment n to point to next compiled command */ |
||
8100 | if (opcode != OPCODE_CONTINUE) { |
||
8101 | n += InstSize[opcode]; |
||
8102 | } |
||
8103 | } |
||
8104 | } |
||
8105 | |||
8106 | if (ctx->Driver.EndCallList) |
||
8107 | ctx->Driver.EndCallList(ctx); |
||
8108 | |||
8109 | ctx->ListState.CallDepth--; |
||
8110 | } |
||
8111 | |||
8112 | |||
8113 | |||
8114 | /**********************************************************************/ |
||
8115 | /* GL functions */ |
||
8116 | /**********************************************************************/ |
||
8117 | |||
8118 | /** |
||
8119 | * Test if a display list number is valid. |
||
8120 | */ |
||
8121 | static GLboolean GLAPIENTRY |
||
8122 | _mesa_IsList(GLuint list) |
||
8123 | { |
||
8124 | GET_CURRENT_CONTEXT(ctx); |
||
8125 | FLUSH_VERTICES(ctx, 0); /* must be called before assert */ |
||
8126 | ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); |
||
8127 | return islist(ctx, list); |
||
8128 | } |
||
8129 | |||
8130 | |||
8131 | /** |
||
8132 | * Delete a sequence of consecutive display lists. |
||
8133 | */ |
||
8134 | static void GLAPIENTRY |
||
8135 | _mesa_DeleteLists(GLuint list, GLsizei range) |
||
8136 | { |
||
8137 | GET_CURRENT_CONTEXT(ctx); |
||
8138 | GLuint i; |
||
8139 | FLUSH_VERTICES(ctx, 0); /* must be called before assert */ |
||
8140 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
8141 | |||
8142 | if (range < 0) { |
||
8143 | _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteLists"); |
||
8144 | return; |
||
8145 | } |
||
8146 | for (i = list; i < list + range; i++) { |
||
8147 | destroy_list(ctx, i); |
||
8148 | } |
||
8149 | } |
||
8150 | |||
8151 | |||
8152 | /** |
||
8153 | * Return a display list number, n, such that lists n through n+range-1 |
||
8154 | * are free. |
||
8155 | */ |
||
8156 | static GLuint GLAPIENTRY |
||
8157 | _mesa_GenLists(GLsizei range) |
||
8158 | { |
||
8159 | GET_CURRENT_CONTEXT(ctx); |
||
8160 | GLuint base; |
||
8161 | FLUSH_VERTICES(ctx, 0); /* must be called before assert */ |
||
8162 | ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0); |
||
8163 | |||
8164 | if (range < 0) { |
||
8165 | _mesa_error(ctx, GL_INVALID_VALUE, "glGenLists"); |
||
8166 | return 0; |
||
8167 | } |
||
8168 | if (range == 0) { |
||
8169 | return 0; |
||
8170 | } |
||
8171 | |||
8172 | /* |
||
8173 | * Make this an atomic operation |
||
8174 | */ |
||
8175 | _glthread_LOCK_MUTEX(ctx->Shared->Mutex); |
||
8176 | |||
8177 | base = _mesa_HashFindFreeKeyBlock(ctx->Shared->DisplayList, range); |
||
8178 | if (base) { |
||
8179 | /* reserve the list IDs by with empty/dummy lists */ |
||
8180 | GLint i; |
||
8181 | for (i = 0; i < range; i++) { |
||
8182 | _mesa_HashInsert(ctx->Shared->DisplayList, base + i, |
||
8183 | make_list(base + i, 1)); |
||
8184 | } |
||
8185 | } |
||
8186 | |||
8187 | _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex); |
||
8188 | |||
8189 | return base; |
||
8190 | } |
||
8191 | |||
8192 | |||
8193 | /** |
||
8194 | * Begin a new display list. |
||
8195 | */ |
||
8196 | static void GLAPIENTRY |
||
8197 | _mesa_NewList(GLuint name, GLenum mode) |
||
8198 | { |
||
8199 | GET_CURRENT_CONTEXT(ctx); |
||
8200 | |||
8201 | FLUSH_CURRENT(ctx, 0); /* must be called before assert */ |
||
8202 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
8203 | |||
8204 | if (MESA_VERBOSE & VERBOSE_API) |
||
8205 | _mesa_debug(ctx, "glNewList %u %s\n", name, |
||
8206 | _mesa_lookup_enum_by_nr(mode)); |
||
8207 | |||
8208 | if (name == 0) { |
||
8209 | _mesa_error(ctx, GL_INVALID_VALUE, "glNewList"); |
||
8210 | return; |
||
8211 | } |
||
8212 | |||
8213 | if (mode != GL_COMPILE && mode != GL_COMPILE_AND_EXECUTE) { |
||
8214 | _mesa_error(ctx, GL_INVALID_ENUM, "glNewList"); |
||
8215 | return; |
||
8216 | } |
||
8217 | |||
8218 | if (ctx->ListState.CurrentList) { |
||
8219 | /* already compiling a display list */ |
||
8220 | _mesa_error(ctx, GL_INVALID_OPERATION, "glNewList"); |
||
8221 | return; |
||
8222 | } |
||
8223 | |||
8224 | ctx->CompileFlag = GL_TRUE; |
||
8225 | ctx->ExecuteFlag = (mode == GL_COMPILE_AND_EXECUTE); |
||
8226 | |||
8227 | /* Reset acumulated list state: |
||
8228 | */ |
||
8229 | invalidate_saved_current_state( ctx ); |
||
8230 | |||
8231 | /* Allocate new display list */ |
||
8232 | ctx->ListState.CurrentList = make_list(name, BLOCK_SIZE); |
||
8233 | ctx->ListState.CurrentBlock = ctx->ListState.CurrentList->Head; |
||
8234 | ctx->ListState.CurrentPos = 0; |
||
8235 | |||
8236 | ctx->Driver.NewList(ctx, name, mode); |
||
8237 | |||
8238 | ctx->CurrentDispatch = ctx->Save; |
||
8239 | _glapi_set_dispatch(ctx->CurrentDispatch); |
||
8240 | } |
||
8241 | |||
8242 | |||
8243 | /** |
||
8244 | * End definition of current display list. |
||
8245 | */ |
||
8246 | static void GLAPIENTRY |
||
8247 | _mesa_EndList(void) |
||
8248 | { |
||
8249 | GET_CURRENT_CONTEXT(ctx); |
||
8250 | SAVE_FLUSH_VERTICES(ctx); |
||
8251 | ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); |
||
8252 | |||
8253 | if (MESA_VERBOSE & VERBOSE_API) |
||
8254 | _mesa_debug(ctx, "glEndList\n"); |
||
8255 | |||
8256 | /* Check that a list is under construction */ |
||
8257 | if (!ctx->ListState.CurrentList) { |
||
8258 | _mesa_error(ctx, GL_INVALID_OPERATION, "glEndList"); |
||
8259 | return; |
||
8260 | } |
||
8261 | |||
8262 | /* Call before emitting END_OF_LIST, in case the driver wants to |
||
8263 | * emit opcodes itself. |
||
8264 | */ |
||
8265 | ctx->Driver.EndList(ctx); |
||
8266 | |||
8267 | (void) alloc_instruction(ctx, OPCODE_END_OF_LIST, 0); |
||
8268 | |||
8269 | /* Destroy old list, if any */ |
||
8270 | destroy_list(ctx, ctx->ListState.CurrentList->Name); |
||
8271 | |||
8272 | /* Install the new list */ |
||
8273 | _mesa_HashInsert(ctx->Shared->DisplayList, |
||
8274 | ctx->ListState.CurrentList->Name, |
||
8275 | ctx->ListState.CurrentList); |
||
8276 | |||
8277 | |||
8278 | if (MESA_VERBOSE & VERBOSE_DISPLAY_LIST) |
||
8279 | mesa_print_display_list(ctx->ListState.CurrentList->Name); |
||
8280 | |||
8281 | ctx->ListState.CurrentList = NULL; |
||
8282 | ctx->ExecuteFlag = GL_TRUE; |
||
8283 | ctx->CompileFlag = GL_FALSE; |
||
8284 | |||
8285 | ctx->CurrentDispatch = ctx->Exec; |
||
8286 | _glapi_set_dispatch(ctx->CurrentDispatch); |
||
8287 | } |
||
8288 | |||
8289 | |||
8290 | void GLAPIENTRY |
||
8291 | _mesa_CallList(GLuint list) |
||
8292 | { |
||
8293 | GLboolean save_compile_flag; |
||
8294 | GET_CURRENT_CONTEXT(ctx); |
||
8295 | FLUSH_CURRENT(ctx, 0); |
||
8296 | /* VERY IMPORTANT: Save the CompileFlag status, turn it off, */ |
||
8297 | /* execute the display list, and restore the CompileFlag. */ |
||
8298 | |||
8299 | if (MESA_VERBOSE & VERBOSE_API) |
||
8300 | _mesa_debug(ctx, "glCallList %d\n", list); |
||
8301 | |||
8302 | if (list == 0) { |
||
8303 | _mesa_error(ctx, GL_INVALID_VALUE, "glCallList(list==0)"); |
||
8304 | return; |
||
8305 | } |
||
8306 | |||
8307 | /* mesa_print_display_list( list ); */ |
||
8308 | |||
8309 | save_compile_flag = ctx->CompileFlag; |
||
8310 | if (save_compile_flag) { |
||
8311 | ctx->CompileFlag = GL_FALSE; |
||
8312 | } |
||
8313 | |||
8314 | execute_list(ctx, list); |
||
8315 | ctx->CompileFlag = save_compile_flag; |
||
8316 | |||
8317 | /* also restore API function pointers to point to "save" versions */ |
||
8318 | if (save_compile_flag) { |
||
8319 | ctx->CurrentDispatch = ctx->Save; |
||
8320 | _glapi_set_dispatch(ctx->CurrentDispatch); |
||
8321 | } |
||
8322 | } |
||
8323 | |||
8324 | |||
8325 | /** |
||
8326 | * Execute glCallLists: call multiple display lists. |
||
8327 | */ |
||
8328 | void GLAPIENTRY |
||
8329 | _mesa_CallLists(GLsizei n, GLenum type, const GLvoid * lists) |
||
8330 | { |
||
8331 | GET_CURRENT_CONTEXT(ctx); |
||
8332 | GLint i; |
||
8333 | GLboolean save_compile_flag; |
||
8334 | |||
8335 | if (MESA_VERBOSE & VERBOSE_API) |
||
8336 | _mesa_debug(ctx, "glCallLists %d\n", n); |
||
8337 | |||
8338 | switch (type) { |
||
8339 | case GL_BYTE: |
||
8340 | case GL_UNSIGNED_BYTE: |
||
8341 | case GL_SHORT: |
||
8342 | case GL_UNSIGNED_SHORT: |
||
8343 | case GL_INT: |
||
8344 | case GL_UNSIGNED_INT: |
||
8345 | case GL_FLOAT: |
||
8346 | case GL_2_BYTES: |
||
8347 | case GL_3_BYTES: |
||
8348 | case GL_4_BYTES: |
||
8349 | /* OK */ |
||
8350 | break; |
||
8351 | default: |
||
8352 | _mesa_error(ctx, GL_INVALID_ENUM, "glCallLists(type)"); |
||
8353 | return; |
||
8354 | } |
||
8355 | |||
8356 | /* Save the CompileFlag status, turn it off, execute display list, |
||
8357 | * and restore the CompileFlag. |
||
8358 | */ |
||
8359 | save_compile_flag = ctx->CompileFlag; |
||
8360 | ctx->CompileFlag = GL_FALSE; |
||
8361 | |||
8362 | for (i = 0; i < n; i++) { |
||
8363 | GLuint list = (GLuint) (ctx->List.ListBase + translate_id(i, type, lists)); |
||
8364 | execute_list(ctx, list); |
||
8365 | } |
||
8366 | |||
8367 | ctx->CompileFlag = save_compile_flag; |
||
8368 | |||
8369 | /* also restore API function pointers to point to "save" versions */ |
||
8370 | if (save_compile_flag) { |
||
8371 | ctx->CurrentDispatch = ctx->Save; |
||
8372 | _glapi_set_dispatch(ctx->CurrentDispatch); |
||
8373 | } |
||
8374 | } |
||
8375 | |||
8376 | |||
8377 | /** |
||
8378 | * Set the offset added to list numbers in glCallLists. |
||
8379 | */ |
||
8380 | static void GLAPIENTRY |
||
8381 | _mesa_ListBase(GLuint base) |
||
8382 | { |
||
8383 | GET_CURRENT_CONTEXT(ctx); |
||
8384 | FLUSH_VERTICES(ctx, 0); /* must be called before assert */ |
||
8385 | ASSERT_OUTSIDE_BEGIN_END(ctx); |
||
8386 | ctx->List.ListBase = base; |
||
8387 | } |
||
8388 | |||
8389 | |||
8390 | /* Can no longer assume ctx->Exec->Func is equal to _mesa_Func. |
||
8391 | */ |
||
8392 | static void GLAPIENTRY |
||
8393 | exec_Finish(void) |
||
8394 | { |
||
8395 | GET_CURRENT_CONTEXT(ctx); |
||
8396 | FLUSH_VERTICES(ctx, 0); |
||
8397 | CALL_Finish(ctx->Exec, ()); |
||
8398 | } |
||
8399 | |||
8400 | static void GLAPIENTRY |
||
8401 | exec_Flush(void) |
||
8402 | { |
||
8403 | GET_CURRENT_CONTEXT(ctx); |
||
8404 | FLUSH_VERTICES(ctx, 0); |
||
8405 | CALL_Flush(ctx->Exec, ()); |
||
8406 | } |
||
8407 | |||
8408 | static void GLAPIENTRY |
||
8409 | exec_GetBooleanv(GLenum pname, GLboolean *params) |
||
8410 | { |
||
8411 | GET_CURRENT_CONTEXT(ctx); |
||
8412 | FLUSH_VERTICES(ctx, 0); |
||
8413 | CALL_GetBooleanv(ctx->Exec, (pname, params)); |
||
8414 | } |
||
8415 | |||
8416 | static void GLAPIENTRY |
||
8417 | exec_GetClipPlane(GLenum plane, GLdouble * equation) |
||
8418 | { |
||
8419 | GET_CURRENT_CONTEXT(ctx); |
||
8420 | FLUSH_VERTICES(ctx, 0); |
||
8421 | CALL_GetClipPlane(ctx->Exec, (plane, equation)); |
||
8422 | } |
||
8423 | |||
8424 | static void GLAPIENTRY |
||
8425 | exec_GetDoublev(GLenum pname, GLdouble *params) |
||
8426 | { |
||
8427 | GET_CURRENT_CONTEXT(ctx); |
||
8428 | FLUSH_VERTICES(ctx, 0); |
||
8429 | CALL_GetDoublev(ctx->Exec, (pname, params)); |
||
8430 | } |
||
8431 | |||
8432 | static GLenum GLAPIENTRY |
||
8433 | exec_GetError(void) |
||
8434 | { |
||
8435 | GET_CURRENT_CONTEXT(ctx); |
||
8436 | FLUSH_VERTICES(ctx, 0); |
||
8437 | return CALL_GetError(ctx->Exec, ()); |
||
8438 | } |
||
8439 | |||
8440 | static void GLAPIENTRY |
||
8441 | exec_GetFloatv(GLenum pname, GLfloat *params) |
||
8442 | { |
||
8443 | GET_CURRENT_CONTEXT(ctx); |
||
8444 | FLUSH_VERTICES(ctx, 0); |
||
8445 | CALL_GetFloatv(ctx->Exec, (pname, params)); |
||
8446 | } |
||
8447 | |||
8448 | static void GLAPIENTRY |
||
8449 | exec_GetIntegerv(GLenum pname, GLint *params) |
||
8450 | { |
||
8451 | GET_CURRENT_CONTEXT(ctx); |
||
8452 | FLUSH_VERTICES(ctx, 0); |
||
8453 | CALL_GetIntegerv(ctx->Exec, (pname, params)); |
||
8454 | } |
||
8455 | |||
8456 | static void GLAPIENTRY |
||
8457 | exec_GetLightfv(GLenum light, GLenum pname, GLfloat *params) |
||
8458 | { |
||
8459 | GET_CURRENT_CONTEXT(ctx); |
||
8460 | FLUSH_VERTICES(ctx, 0); |
||
8461 | CALL_GetLightfv(ctx->Exec, (light, pname, params)); |
||
8462 | } |
||
8463 | |||
8464 | static void GLAPIENTRY |
||
8465 | exec_GetLightiv(GLenum light, GLenum pname, GLint *params) |
||
8466 | { |
||
8467 | GET_CURRENT_CONTEXT(ctx); |
||
8468 | FLUSH_VERTICES(ctx, 0); |
||
8469 | CALL_GetLightiv(ctx->Exec, (light, pname, params)); |
||
8470 | } |
||
8471 | |||
8472 | static void GLAPIENTRY |
||
8473 | exec_GetMapdv(GLenum target, GLenum query, GLdouble * v) |
||
8474 | { |
||
8475 | GET_CURRENT_CONTEXT(ctx); |
||
8476 | FLUSH_VERTICES(ctx, 0); |
||
8477 | CALL_GetMapdv(ctx->Exec, (target, query, v)); |
||
8478 | } |
||
8479 | |||
8480 | static void GLAPIENTRY |
||
8481 | exec_GetMapfv(GLenum target, GLenum query, GLfloat * v) |
||
8482 | { |
||
8483 | GET_CURRENT_CONTEXT(ctx); |
||
8484 | FLUSH_VERTICES(ctx, 0); |
||
8485 | CALL_GetMapfv(ctx->Exec, (target, query, v)); |
||
8486 | } |
||
8487 | |||
8488 | static void GLAPIENTRY |
||
8489 | exec_GetMapiv(GLenum target, GLenum query, GLint * v) |
||
8490 | { |
||
8491 | GET_CURRENT_CONTEXT(ctx); |
||
8492 | FLUSH_VERTICES(ctx, 0); |
||
8493 | CALL_GetMapiv(ctx->Exec, (target, query, v)); |
||
8494 | } |
||
8495 | |||
8496 | static void GLAPIENTRY |
||
8497 | exec_GetMaterialfv(GLenum face, GLenum pname, GLfloat *params) |
||
8498 | { |
||
8499 | GET_CURRENT_CONTEXT(ctx); |
||
8500 | FLUSH_VERTICES(ctx, 0); |
||
8501 | CALL_GetMaterialfv(ctx->Exec, (face, pname, params)); |
||
8502 | } |
||
8503 | |||
8504 | static void GLAPIENTRY |
||
8505 | exec_GetMaterialiv(GLenum face, GLenum pname, GLint *params) |
||
8506 | { |
||
8507 | GET_CURRENT_CONTEXT(ctx); |
||
8508 | FLUSH_VERTICES(ctx, 0); |
||
8509 | CALL_GetMaterialiv(ctx->Exec, (face, pname, params)); |
||
8510 | } |
||
8511 | |||
8512 | static void GLAPIENTRY |
||
8513 | exec_GetPixelMapfv(GLenum map, GLfloat *values) |
||
8514 | { |
||
8515 | GET_CURRENT_CONTEXT(ctx); |
||
8516 | FLUSH_VERTICES(ctx, 0); |
||
8517 | CALL_GetPixelMapfv(ctx->Exec, (map, values)); |
||
8518 | } |
||
8519 | |||
8520 | static void GLAPIENTRY |
||
8521 | exec_GetPixelMapuiv(GLenum map, GLuint *values) |
||
8522 | { |
||
8523 | GET_CURRENT_CONTEXT(ctx); |
||
8524 | FLUSH_VERTICES(ctx, 0); |
||
8525 | CALL_GetPixelMapuiv(ctx->Exec, (map, values)); |
||
8526 | } |
||
8527 | |||
8528 | static void GLAPIENTRY |
||
8529 | exec_GetPixelMapusv(GLenum map, GLushort *values) |
||
8530 | { |
||
8531 | GET_CURRENT_CONTEXT(ctx); |
||
8532 | FLUSH_VERTICES(ctx, 0); |
||
8533 | CALL_GetPixelMapusv(ctx->Exec, (map, values)); |
||
8534 | } |
||
8535 | |||
8536 | static void GLAPIENTRY |
||
8537 | exec_GetPolygonStipple(GLubyte * dest) |
||
8538 | { |
||
8539 | GET_CURRENT_CONTEXT(ctx); |
||
8540 | FLUSH_VERTICES(ctx, 0); |
||
8541 | CALL_GetPolygonStipple(ctx->Exec, (dest)); |
||
8542 | } |
||
8543 | |||
8544 | static const GLubyte *GLAPIENTRY |
||
8545 | exec_GetString(GLenum name) |
||
8546 | { |
||
8547 | GET_CURRENT_CONTEXT(ctx); |
||
8548 | FLUSH_VERTICES(ctx, 0); |
||
8549 | return CALL_GetString(ctx->Exec, (name)); |
||
8550 | } |
||
8551 | |||
8552 | static void GLAPIENTRY |
||
8553 | exec_GetTexEnvfv(GLenum target, GLenum pname, GLfloat *params) |
||
8554 | { |
||
8555 | GET_CURRENT_CONTEXT(ctx); |
||
8556 | FLUSH_VERTICES(ctx, 0); |
||
8557 | CALL_GetTexEnvfv(ctx->Exec, (target, pname, params)); |
||
8558 | } |
||
8559 | |||
8560 | static void GLAPIENTRY |
||
8561 | exec_GetTexEnviv(GLenum target, GLenum pname, GLint *params) |
||
8562 | { |
||
8563 | GET_CURRENT_CONTEXT(ctx); |
||
8564 | FLUSH_VERTICES(ctx, 0); |
||
8565 | CALL_GetTexEnviv(ctx->Exec, (target, pname, params)); |
||
8566 | } |
||
8567 | |||
8568 | static void GLAPIENTRY |
||
8569 | exec_GetTexGendv(GLenum coord, GLenum pname, GLdouble *params) |
||
8570 | { |
||
8571 | GET_CURRENT_CONTEXT(ctx); |
||
8572 | FLUSH_VERTICES(ctx, 0); |
||
8573 | CALL_GetTexGendv(ctx->Exec, (coord, pname, params)); |
||
8574 | } |
||
8575 | |||
8576 | static void GLAPIENTRY |
||
8577 | exec_GetTexGenfv(GLenum coord, GLenum pname, GLfloat *params) |
||
8578 | { |
||
8579 | GET_CURRENT_CONTEXT(ctx); |
||
8580 | FLUSH_VERTICES(ctx, 0); |
||
8581 | CALL_GetTexGenfv(ctx->Exec, (coord, pname, params)); |
||
8582 | } |
||
8583 | |||
8584 | static void GLAPIENTRY |
||
8585 | exec_GetTexGeniv(GLenum coord, GLenum pname, GLint *params) |
||
8586 | { |
||
8587 | GET_CURRENT_CONTEXT(ctx); |
||
8588 | FLUSH_VERTICES(ctx, 0); |
||
8589 | CALL_GetTexGeniv(ctx->Exec, (coord, pname, params)); |
||
8590 | } |
||
8591 | |||
8592 | static void GLAPIENTRY |
||
8593 | exec_GetTexImage(GLenum target, GLint level, GLenum format, |
||
8594 | GLenum type, GLvoid * pixels) |
||
8595 | { |
||
8596 | GET_CURRENT_CONTEXT(ctx); |
||
8597 | FLUSH_VERTICES(ctx, 0); |
||
8598 | CALL_GetTexImage(ctx->Exec, (target, level, format, type, pixels)); |
||
8599 | } |
||
8600 | |||
8601 | static void GLAPIENTRY |
||
8602 | exec_GetTexLevelParameterfv(GLenum target, GLint level, |
||
8603 | GLenum pname, GLfloat *params) |
||
8604 | { |
||
8605 | GET_CURRENT_CONTEXT(ctx); |
||
8606 | FLUSH_VERTICES(ctx, 0); |
||
8607 | CALL_GetTexLevelParameterfv(ctx->Exec, (target, level, pname, params)); |
||
8608 | } |
||
8609 | |||
8610 | static void GLAPIENTRY |
||
8611 | exec_GetTexLevelParameteriv(GLenum target, GLint level, |
||
8612 | GLenum pname, GLint *params) |
||
8613 | { |
||
8614 | GET_CURRENT_CONTEXT(ctx); |
||
8615 | FLUSH_VERTICES(ctx, 0); |
||
8616 | CALL_GetTexLevelParameteriv(ctx->Exec, (target, level, pname, params)); |
||
8617 | } |
||
8618 | |||
8619 | static void GLAPIENTRY |
||
8620 | exec_GetTexParameterfv(GLenum target, GLenum pname, GLfloat *params) |
||
8621 | { |
||
8622 | GET_CURRENT_CONTEXT(ctx); |
||
8623 | FLUSH_VERTICES(ctx, 0); |
||
8624 | CALL_GetTexParameterfv(ctx->Exec, (target, pname, params)); |
||
8625 | } |
||
8626 | |||
8627 | static void GLAPIENTRY |
||
8628 | exec_GetTexParameteriv(GLenum target, GLenum pname, GLint *params) |
||
8629 | { |
||
8630 | GET_CURRENT_CONTEXT(ctx); |
||
8631 | FLUSH_VERTICES(ctx, 0); |
||
8632 | CALL_GetTexParameteriv(ctx->Exec, (target, pname, params)); |
||
8633 | } |
||
8634 | |||
8635 | static GLboolean GLAPIENTRY |
||
8636 | exec_IsEnabled(GLenum cap) |
||
8637 | { |
||
8638 | GET_CURRENT_CONTEXT(ctx); |
||
8639 | FLUSH_VERTICES(ctx, 0); |
||
8640 | return CALL_IsEnabled(ctx->Exec, (cap)); |
||
8641 | } |
||
8642 | |||
8643 | static void GLAPIENTRY |
||
8644 | exec_PixelStoref(GLenum pname, GLfloat param) |
||
8645 | { |
||
8646 | GET_CURRENT_CONTEXT(ctx); |
||
8647 | FLUSH_VERTICES(ctx, 0); |
||
8648 | CALL_PixelStoref(ctx->Exec, (pname, param)); |
||
8649 | } |
||
8650 | |||
8651 | static void GLAPIENTRY |
||
8652 | exec_PixelStorei(GLenum pname, GLint param) |
||
8653 | { |
||
8654 | GET_CURRENT_CONTEXT(ctx); |
||
8655 | FLUSH_VERTICES(ctx, 0); |
||
8656 | CALL_PixelStorei(ctx->Exec, (pname, param)); |
||
8657 | } |
||
8658 | |||
8659 | static void GLAPIENTRY |
||
8660 | exec_ReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, |
||
8661 | GLenum format, GLenum type, GLvoid * pixels) |
||
8662 | { |
||
8663 | GET_CURRENT_CONTEXT(ctx); |
||
8664 | FLUSH_VERTICES(ctx, 0); |
||
8665 | CALL_ReadPixels(ctx->Exec, (x, y, width, height, format, type, pixels)); |
||
8666 | } |
||
8667 | |||
8668 | static GLint GLAPIENTRY |
||
8669 | exec_RenderMode(GLenum mode) |
||
8670 | { |
||
8671 | GET_CURRENT_CONTEXT(ctx); |
||
8672 | FLUSH_VERTICES(ctx, 0); |
||
8673 | return CALL_RenderMode(ctx->Exec, (mode)); |
||
8674 | } |
||
8675 | |||
8676 | static void GLAPIENTRY |
||
8677 | exec_FeedbackBuffer(GLsizei size, GLenum type, GLfloat * buffer) |
||
8678 | { |
||
8679 | GET_CURRENT_CONTEXT(ctx); |
||
8680 | FLUSH_VERTICES(ctx, 0); |
||
8681 | CALL_FeedbackBuffer(ctx->Exec, (size, type, buffer)); |
||
8682 | } |
||
8683 | |||
8684 | static void GLAPIENTRY |
||
8685 | exec_SelectBuffer(GLsizei size, GLuint * buffer) |
||
8686 | { |
||
8687 | GET_CURRENT_CONTEXT(ctx); |
||
8688 | FLUSH_VERTICES(ctx, 0); |
||
8689 | CALL_SelectBuffer(ctx->Exec, (size, buffer)); |
||
8690 | } |
||
8691 | |||
8692 | static GLboolean GLAPIENTRY |
||
8693 | exec_AreTexturesResident(GLsizei n, const GLuint * texName, |
||
8694 | GLboolean * residences) |
||
8695 | { |
||
8696 | GET_CURRENT_CONTEXT(ctx); |
||
8697 | FLUSH_VERTICES(ctx, 0); |
||
8698 | return CALL_AreTexturesResident(ctx->Exec, (n, texName, residences)); |
||
8699 | } |
||
8700 | |||
8701 | static void GLAPIENTRY |
||
8702 | exec_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) |
||
8703 | { |
||
8704 | GET_CURRENT_CONTEXT(ctx); |
||
8705 | FLUSH_VERTICES(ctx, 0); |
||
8706 | CALL_ColorPointer(ctx->Exec, (size, type, stride, ptr)); |
||
8707 | } |
||
8708 | |||
8709 | static void GLAPIENTRY |
||
8710 | exec_DeleteTextures(GLsizei n, const GLuint * texName) |
||
8711 | { |
||
8712 | GET_CURRENT_CONTEXT(ctx); |
||
8713 | FLUSH_VERTICES(ctx, 0); |
||
8714 | CALL_DeleteTextures(ctx->Exec, (n, texName)); |
||
8715 | } |
||
8716 | |||
8717 | static void GLAPIENTRY |
||
8718 | exec_DisableClientState(GLenum cap) |
||
8719 | { |
||
8720 | GET_CURRENT_CONTEXT(ctx); |
||
8721 | FLUSH_VERTICES(ctx, 0); |
||
8722 | CALL_DisableClientState(ctx->Exec, (cap)); |
||
8723 | } |
||
8724 | |||
8725 | static void GLAPIENTRY |
||
8726 | exec_EdgeFlagPointer(GLsizei stride, const GLvoid * vptr) |
||
8727 | { |
||
8728 | GET_CURRENT_CONTEXT(ctx); |
||
8729 | FLUSH_VERTICES(ctx, 0); |
||
8730 | CALL_EdgeFlagPointer(ctx->Exec, (stride, vptr)); |
||
8731 | } |
||
8732 | |||
8733 | static void GLAPIENTRY |
||
8734 | exec_EnableClientState(GLenum cap) |
||
8735 | { |
||
8736 | GET_CURRENT_CONTEXT(ctx); |
||
8737 | FLUSH_VERTICES(ctx, 0); |
||
8738 | CALL_EnableClientState(ctx->Exec, (cap)); |
||
8739 | } |
||
8740 | |||
8741 | static void GLAPIENTRY |
||
8742 | exec_GenTextures(GLsizei n, GLuint * texName) |
||
8743 | { |
||
8744 | GET_CURRENT_CONTEXT(ctx); |
||
8745 | FLUSH_VERTICES(ctx, 0); |
||
8746 | CALL_GenTextures(ctx->Exec, (n, texName)); |
||
8747 | } |
||
8748 | |||
8749 | static void GLAPIENTRY |
||
8750 | exec_GetPointerv(GLenum pname, GLvoid **params) |
||
8751 | { |
||
8752 | GET_CURRENT_CONTEXT(ctx); |
||
8753 | FLUSH_VERTICES(ctx, 0); |
||
8754 | CALL_GetPointerv(ctx->Exec, (pname, params)); |
||
8755 | } |
||
8756 | |||
8757 | static void GLAPIENTRY |
||
8758 | exec_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) |
||
8759 | { |
||
8760 | GET_CURRENT_CONTEXT(ctx); |
||
8761 | FLUSH_VERTICES(ctx, 0); |
||
8762 | CALL_IndexPointer(ctx->Exec, (type, stride, ptr)); |
||
8763 | } |
||
8764 | |||
8765 | static void GLAPIENTRY |
||
8766 | exec_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid * pointer) |
||
8767 | { |
||
8768 | GET_CURRENT_CONTEXT(ctx); |
||
8769 | FLUSH_VERTICES(ctx, 0); |
||
8770 | CALL_InterleavedArrays(ctx->Exec, (format, stride, pointer)); |
||
8771 | } |
||
8772 | |||
8773 | static GLboolean GLAPIENTRY |
||
8774 | exec_IsTexture(GLuint texture) |
||
8775 | { |
||
8776 | GET_CURRENT_CONTEXT(ctx); |
||
8777 | FLUSH_VERTICES(ctx, 0); |
||
8778 | return CALL_IsTexture(ctx->Exec, (texture)); |
||
8779 | } |
||
8780 | |||
8781 | static void GLAPIENTRY |
||
8782 | exec_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr) |
||
8783 | { |
||
8784 | GET_CURRENT_CONTEXT(ctx); |
||
8785 | FLUSH_VERTICES(ctx, 0); |
||
8786 | CALL_NormalPointer(ctx->Exec, (type, stride, ptr)); |
||
8787 | } |
||
8788 | |||
8789 | static void GLAPIENTRY |
||
8790 | exec_PopClientAttrib(void) |
||
8791 | { |
||
8792 | GET_CURRENT_CONTEXT(ctx); |
||
8793 | FLUSH_VERTICES(ctx, 0); |
||
8794 | CALL_PopClientAttrib(ctx->Exec, ()); |
||
8795 | } |
||
8796 | |||
8797 | static void GLAPIENTRY |
||
8798 | exec_PushClientAttrib(GLbitfield mask) |
||
8799 | { |
||
8800 | GET_CURRENT_CONTEXT(ctx); |
||
8801 | FLUSH_VERTICES(ctx, 0); |
||
8802 | CALL_PushClientAttrib(ctx->Exec, (mask)); |
||
8803 | } |
||
8804 | |||
8805 | static void GLAPIENTRY |
||
8806 | exec_TexCoordPointer(GLint size, GLenum type, GLsizei stride, |
||
8807 | const GLvoid *ptr) |
||
8808 | { |
||
8809 | GET_CURRENT_CONTEXT(ctx); |
||
8810 | FLUSH_VERTICES(ctx, 0); |
||
8811 | CALL_TexCoordPointer(ctx->Exec, (size, type, stride, ptr)); |
||
8812 | } |
||
8813 | |||
8814 | static void GLAPIENTRY |
||
8815 | exec_GetCompressedTexImageARB(GLenum target, GLint level, GLvoid * img) |
||
8816 | { |
||
8817 | GET_CURRENT_CONTEXT(ctx); |
||
8818 | FLUSH_VERTICES(ctx, 0); |
||
8819 | CALL_GetCompressedTexImageARB(ctx->Exec, (target, level, img)); |
||
8820 | } |
||
8821 | |||
8822 | static void GLAPIENTRY |
||
8823 | exec_VertexPointer(GLint size, GLenum type, GLsizei stride, |
||
8824 | const GLvoid *ptr) |
||
8825 | { |
||
8826 | GET_CURRENT_CONTEXT(ctx); |
||
8827 | FLUSH_VERTICES(ctx, 0); |
||
8828 | CALL_VertexPointer(ctx->Exec, (size, type, stride, ptr)); |
||
8829 | } |
||
8830 | |||
8831 | static void GLAPIENTRY |
||
8832 | exec_CopyConvolutionFilter1D(GLenum target, GLenum internalFormat, |
||
8833 | GLint x, GLint y, GLsizei width) |
||
8834 | { |
||
8835 | GET_CURRENT_CONTEXT(ctx); |
||
8836 | FLUSH_VERTICES(ctx, 0); |
||
8837 | CALL_CopyConvolutionFilter1D(ctx->Exec, |
||
8838 | (target, internalFormat, x, y, width)); |
||
8839 | } |
||
8840 | |||
8841 | static void GLAPIENTRY |
||
8842 | exec_CopyConvolutionFilter2D(GLenum target, GLenum internalFormat, |
||
8843 | GLint x, GLint y, GLsizei width, GLsizei height) |
||
8844 | { |
||
8845 | GET_CURRENT_CONTEXT(ctx); |
||
8846 | FLUSH_VERTICES(ctx, 0); |
||
8847 | CALL_CopyConvolutionFilter2D(ctx->Exec, |
||
8848 | (target, internalFormat, x, y, width, |
||
8849 | height)); |
||
8850 | } |
||
8851 | |||
8852 | static void GLAPIENTRY |
||
8853 | exec_GetColorTable(GLenum target, GLenum format, GLenum type, GLvoid * data) |
||
8854 | { |
||
8855 | GET_CURRENT_CONTEXT(ctx); |
||
8856 | FLUSH_VERTICES(ctx, 0); |
||
8857 | CALL_GetColorTable(ctx->Exec, (target, format, type, data)); |
||
8858 | } |
||
8859 | |||
8860 | static void GLAPIENTRY |
||
8861 | exec_GetColorTableParameterfv(GLenum target, GLenum pname, GLfloat *params) |
||
8862 | { |
||
8863 | GET_CURRENT_CONTEXT(ctx); |
||
8864 | FLUSH_VERTICES(ctx, 0); |
||
8865 | CALL_GetColorTableParameterfv(ctx->Exec, (target, pname, params)); |
||
8866 | } |
||
8867 | |||
8868 | static void GLAPIENTRY |
||
8869 | exec_GetColorTableParameteriv(GLenum target, GLenum pname, GLint *params) |
||
8870 | { |
||
8871 | GET_CURRENT_CONTEXT(ctx); |
||
8872 | FLUSH_VERTICES(ctx, 0); |
||
8873 | CALL_GetColorTableParameteriv(ctx->Exec, (target, pname, params)); |
||
8874 | } |
||
8875 | |||
8876 | static void GLAPIENTRY |
||
8877 | exec_GetConvolutionFilter(GLenum target, GLenum format, GLenum type, |
||
8878 | GLvoid * image) |
||
8879 | { |
||
8880 | GET_CURRENT_CONTEXT(ctx); |
||
8881 | FLUSH_VERTICES(ctx, 0); |
||
8882 | CALL_GetConvolutionFilter(ctx->Exec, (target, format, type, image)); |
||
8883 | } |
||
8884 | |||
8885 | static void GLAPIENTRY |
||
8886 | exec_GetConvolutionParameterfv(GLenum target, GLenum pname, GLfloat *params) |
||
8887 | { |
||
8888 | GET_CURRENT_CONTEXT(ctx); |
||
8889 | FLUSH_VERTICES(ctx, 0); |
||
8890 | CALL_GetConvolutionParameterfv(ctx->Exec, (target, pname, params)); |
||
8891 | } |
||
8892 | |||
8893 | static void GLAPIENTRY |
||
8894 | exec_GetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params) |
||
8895 | { |
||
8896 | GET_CURRENT_CONTEXT(ctx); |
||
8897 | FLUSH_VERTICES(ctx, 0); |
||
8898 | CALL_GetConvolutionParameteriv(ctx->Exec, (target, pname, params)); |
||
8899 | } |
||
8900 | |||
8901 | static void GLAPIENTRY |
||
8902 | exec_GetHistogram(GLenum target, GLboolean reset, GLenum format, |
||
8903 | GLenum type, GLvoid *values) |
||
8904 | { |
||
8905 | GET_CURRENT_CONTEXT(ctx); |
||
8906 | FLUSH_VERTICES(ctx, 0); |
||
8907 | CALL_GetHistogram(ctx->Exec, (target, reset, format, type, values)); |
||
8908 | } |
||
8909 | |||
8910 | static void GLAPIENTRY |
||
8911 | exec_GetHistogramParameterfv(GLenum target, GLenum pname, GLfloat *params) |
||
8912 | { |
||
8913 | GET_CURRENT_CONTEXT(ctx); |
||
8914 | FLUSH_VERTICES(ctx, 0); |
||
8915 | CALL_GetHistogramParameterfv(ctx->Exec, (target, pname, params)); |
||
8916 | } |
||
8917 | |||
8918 | static void GLAPIENTRY |
||
8919 | exec_GetHistogramParameteriv(GLenum target, GLenum pname, GLint *params) |
||
8920 | { |
||
8921 | GET_CURRENT_CONTEXT(ctx); |
||
8922 | FLUSH_VERTICES(ctx, 0); |
||
8923 | CALL_GetHistogramParameteriv(ctx->Exec, (target, pname, params)); |
||
8924 | } |
||
8925 | |||
8926 | static void GLAPIENTRY |
||
8927 | exec_GetMinmax(GLenum target, GLboolean reset, GLenum format, |
||
8928 | GLenum type, GLvoid *values) |
||
8929 | { |
||
8930 | GET_CURRENT_CONTEXT(ctx); |
||
8931 | FLUSH_VERTICES(ctx, 0); |
||
8932 | CALL_GetMinmax(ctx->Exec, (target, reset, format, type, values)); |
||
8933 | } |
||
8934 | |||
8935 | static void GLAPIENTRY |
||
8936 | exec_GetMinmaxParameterfv(GLenum target, GLenum pname, GLfloat *params) |
||
8937 | { |
||
8938 | GET_CURRENT_CONTEXT(ctx); |
||
8939 | FLUSH_VERTICES(ctx, 0); |
||
8940 | CALL_GetMinmaxParameterfv(ctx->Exec, (target, pname, params)); |
||
8941 | } |
||
8942 | |||
8943 | static void GLAPIENTRY |
||
8944 | exec_GetMinmaxParameteriv(GLenum target, GLenum pname, GLint *params) |
||
8945 | { |
||
8946 | GET_CURRENT_CONTEXT(ctx); |
||
8947 | FLUSH_VERTICES(ctx, 0); |
||
8948 | CALL_GetMinmaxParameteriv(ctx->Exec, (target, pname, params)); |
||
8949 | } |
||
8950 | |||
8951 | static void GLAPIENTRY |
||
8952 | exec_GetSeparableFilter(GLenum target, GLenum format, GLenum type, |
||
8953 | GLvoid *row, GLvoid *column, GLvoid *span) |
||
8954 | { |
||
8955 | GET_CURRENT_CONTEXT(ctx); |
||
8956 | FLUSH_VERTICES(ctx, 0); |
||
8957 | CALL_GetSeparableFilter(ctx->Exec, |
||
8958 | (target, format, type, row, column, span)); |
||
8959 | } |
||
8960 | |||
8961 | static void GLAPIENTRY |
||
8962 | exec_SeparableFilter2D(GLenum target, GLenum internalFormat, |
||
8963 | GLsizei width, GLsizei height, GLenum format, |
||
8964 | GLenum type, const GLvoid *row, const GLvoid *column) |
||
8965 | { |
||
8966 | GET_CURRENT_CONTEXT(ctx); |
||
8967 | FLUSH_VERTICES(ctx, 0); |
||
8968 | CALL_SeparableFilter2D(ctx->Exec, |
||
8969 | (target, internalFormat, width, height, format, |
||
8970 | type, row, column)); |
||
8971 | } |
||
8972 | |||
8973 | static void GLAPIENTRY |
||
8974 | exec_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, |
||
8975 | GLsizei count, const GLvoid *ptr) |
||
8976 | { |
||
8977 | GET_CURRENT_CONTEXT(ctx); |
||
8978 | FLUSH_VERTICES(ctx, 0); |
||
8979 | CALL_ColorPointerEXT(ctx->Exec, (size, type, stride, count, ptr)); |
||
8980 | } |
||
8981 | |||
8982 | static void GLAPIENTRY |
||
8983 | exec_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr) |
||
8984 | { |
||
8985 | GET_CURRENT_CONTEXT(ctx); |
||
8986 | FLUSH_VERTICES(ctx, 0); |
||
8987 | CALL_EdgeFlagPointerEXT(ctx->Exec, (stride, count, ptr)); |
||
8988 | } |
||
8989 | |||
8990 | static void GLAPIENTRY |
||
8991 | exec_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, |
||
8992 | const GLvoid *ptr) |
||
8993 | { |
||
8994 | GET_CURRENT_CONTEXT(ctx); |
||
8995 | FLUSH_VERTICES(ctx, 0); |
||
8996 | CALL_IndexPointerEXT(ctx->Exec, (type, stride, count, ptr)); |
||
8997 | } |
||
8998 | |||
8999 | static void GLAPIENTRY |
||
9000 | exec_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, |
||
9001 | const GLvoid *ptr) |
||
9002 | { |
||
9003 | GET_CURRENT_CONTEXT(ctx); |
||
9004 | FLUSH_VERTICES(ctx, 0); |
||
9005 | CALL_NormalPointerEXT(ctx->Exec, (type, stride, count, ptr)); |
||
9006 | } |
||
9007 | |||
9008 | static void GLAPIENTRY |
||
9009 | exec_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, |
||
9010 | GLsizei count, const GLvoid *ptr) |
||
9011 | { |
||
9012 | GET_CURRENT_CONTEXT(ctx); |
||
9013 | FLUSH_VERTICES(ctx, 0); |
||
9014 | CALL_TexCoordPointerEXT(ctx->Exec, (size, type, stride, count, ptr)); |
||
9015 | } |
||
9016 | |||
9017 | static void GLAPIENTRY |
||
9018 | exec_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, |
||
9019 | GLsizei count, const GLvoid *ptr) |
||
9020 | { |
||
9021 | GET_CURRENT_CONTEXT(ctx); |
||
9022 | FLUSH_VERTICES(ctx, 0); |
||
9023 | CALL_VertexPointerEXT(ctx->Exec, (size, type, stride, count, ptr)); |
||
9024 | } |
||
9025 | |||
9026 | static void GLAPIENTRY |
||
9027 | exec_LockArraysEXT(GLint first, GLsizei count) |
||
9028 | { |
||
9029 | GET_CURRENT_CONTEXT(ctx); |
||
9030 | FLUSH_VERTICES(ctx, 0); |
||
9031 | CALL_LockArraysEXT(ctx->Exec, (first, count)); |
||
9032 | } |
||
9033 | |||
9034 | static void GLAPIENTRY |
||
9035 | exec_UnlockArraysEXT(void) |
||
9036 | { |
||
9037 | GET_CURRENT_CONTEXT(ctx); |
||
9038 | FLUSH_VERTICES(ctx, 0); |
||
9039 | CALL_UnlockArraysEXT(ctx->Exec, ()); |
||
9040 | } |
||
9041 | |||
9042 | static void GLAPIENTRY |
||
9043 | exec_ClientActiveTextureARB(GLenum target) |
||
9044 | { |
||
9045 | GET_CURRENT_CONTEXT(ctx); |
||
9046 | FLUSH_VERTICES(ctx, 0); |
||
9047 | CALL_ClientActiveTextureARB(ctx->Exec, (target)); |
||
9048 | } |
||
9049 | |||
9050 | static void GLAPIENTRY |
||
9051 | exec_SecondaryColorPointerEXT(GLint size, GLenum type, |
||
9052 | GLsizei stride, const GLvoid *ptr) |
||
9053 | { |
||
9054 | GET_CURRENT_CONTEXT(ctx); |
||
9055 | FLUSH_VERTICES(ctx, 0); |
||
9056 | CALL_SecondaryColorPointerEXT(ctx->Exec, (size, type, stride, ptr)); |
||
9057 | } |
||
9058 | |||
9059 | static void GLAPIENTRY |
||
9060 | exec_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr) |
||
9061 | { |
||
9062 | GET_CURRENT_CONTEXT(ctx); |
||
9063 | FLUSH_VERTICES(ctx, 0); |
||
9064 | CALL_FogCoordPointerEXT(ctx->Exec, (type, stride, ptr)); |
||
9065 | } |
||
9066 | |||
9067 | /* GL_EXT_multi_draw_arrays */ |
||
9068 | static void GLAPIENTRY |
||
9069 | exec_MultiDrawArraysEXT(GLenum mode, const GLint *first, |
||
9070 | const GLsizei *count, GLsizei primcount) |
||
9071 | { |
||
9072 | GET_CURRENT_CONTEXT(ctx); |
||
9073 | FLUSH_VERTICES(ctx, 0); |
||
9074 | CALL_MultiDrawArraysEXT(ctx->Exec, (mode, first, count, primcount)); |
||
9075 | } |
||
9076 | |||
9077 | /* GL_IBM_multimode_draw_arrays */ |
||
9078 | static void GLAPIENTRY |
||
9079 | exec_MultiModeDrawArraysIBM(const GLenum * mode, const GLint * first, |
||
9080 | const GLsizei * count, GLsizei primcount, |
||
9081 | GLint modestride) |
||
9082 | { |
||
9083 | GET_CURRENT_CONTEXT(ctx); |
||
9084 | FLUSH_VERTICES(ctx, 0); |
||
9085 | CALL_MultiModeDrawArraysIBM(ctx->Exec, |
||
9086 | (mode, first, count, primcount, modestride)); |
||
9087 | } |
||
9088 | |||
9089 | /* GL_IBM_multimode_draw_arrays */ |
||
9090 | static void GLAPIENTRY |
||
9091 | exec_MultiModeDrawElementsIBM(const GLenum * mode, |
||
9092 | const GLsizei * count, |
||
9093 | GLenum type, |
||
9094 | const GLvoid * const *indices, |
||
9095 | GLsizei primcount, GLint modestride) |
||
9096 | { |
||
9097 | GET_CURRENT_CONTEXT(ctx); |
||
9098 | FLUSH_VERTICES(ctx, 0); |
||
9099 | CALL_MultiModeDrawElementsIBM(ctx->Exec, |
||
9100 | (mode, count, type, indices, primcount, |
||
9101 | modestride)); |
||
9102 | } |
||
9103 | |||
9104 | |||
9105 | |||
9106 | /** |
||
9107 | * Setup the given dispatch table to point to Mesa's display list |
||
9108 | * building functions. |
||
9109 | * |
||
9110 | * This does not include any of the tnl functions - they are |
||
9111 | * initialized from _mesa_init_api_defaults and from the active vtxfmt |
||
9112 | * struct. |
||
9113 | */ |
||
9114 | struct _glapi_table * |
||
9115 | _mesa_create_save_table(void) |
||
9116 | { |
||
9117 | struct _glapi_table *table; |
||
9118 | |||
9119 | table = _mesa_alloc_dispatch_table(_gloffset_COUNT); |
||
9120 | if (table == NULL) |
||
9121 | return NULL; |
||
9122 | |||
9123 | _mesa_loopback_init_api_table(table); |
||
9124 | |||
9125 | /* GL 1.0 */ |
||
9126 | SET_Accum(table, save_Accum); |
||
9127 | SET_AlphaFunc(table, save_AlphaFunc); |
||
9128 | SET_Bitmap(table, save_Bitmap); |
||
9129 | SET_BlendFunc(table, save_BlendFunc); |
||
9130 | SET_CallList(table, save_CallList); |
||
9131 | SET_CallLists(table, save_CallLists); |
||
9132 | SET_Clear(table, save_Clear); |
||
9133 | SET_ClearAccum(table, save_ClearAccum); |
||
9134 | SET_ClearColor(table, save_ClearColor); |
||
9135 | SET_ClearDepth(table, save_ClearDepth); |
||
9136 | SET_ClearIndex(table, save_ClearIndex); |
||
9137 | SET_ClearStencil(table, save_ClearStencil); |
||
9138 | SET_ClipPlane(table, save_ClipPlane); |
||
9139 | SET_ColorMask(table, save_ColorMask); |
||
9140 | SET_ColorMaskIndexedEXT(table, save_ColorMaskIndexed); |
||
9141 | SET_ColorMaterial(table, save_ColorMaterial); |
||
9142 | SET_CopyPixels(table, save_CopyPixels); |
||
9143 | SET_CullFace(table, save_CullFace); |
||
9144 | SET_DeleteLists(table, _mesa_DeleteLists); |
||
9145 | SET_DepthFunc(table, save_DepthFunc); |
||
9146 | SET_DepthMask(table, save_DepthMask); |
||
9147 | SET_DepthRange(table, save_DepthRange); |
||
9148 | SET_Disable(table, save_Disable); |
||
9149 | SET_DisableIndexedEXT(table, save_DisableIndexed); |
||
9150 | SET_DrawBuffer(table, save_DrawBuffer); |
||
9151 | SET_DrawPixels(table, save_DrawPixels); |
||
9152 | SET_Enable(table, save_Enable); |
||
9153 | SET_EnableIndexedEXT(table, save_EnableIndexed); |
||
9154 | SET_EndList(table, _mesa_EndList); |
||
9155 | SET_EvalMesh1(table, save_EvalMesh1); |
||
9156 | SET_EvalMesh2(table, save_EvalMesh2); |
||
9157 | SET_Finish(table, exec_Finish); |
||
9158 | SET_Flush(table, exec_Flush); |
||
9159 | SET_Fogf(table, save_Fogf); |
||
9160 | SET_Fogfv(table, save_Fogfv); |
||
9161 | SET_Fogi(table, save_Fogi); |
||
9162 | SET_Fogiv(table, save_Fogiv); |
||
9163 | SET_FrontFace(table, save_FrontFace); |
||
9164 | SET_Frustum(table, save_Frustum); |
||
9165 | SET_GenLists(table, _mesa_GenLists); |
||
9166 | SET_GetBooleanv(table, exec_GetBooleanv); |
||
9167 | SET_GetClipPlane(table, exec_GetClipPlane); |
||
9168 | SET_GetDoublev(table, exec_GetDoublev); |
||
9169 | SET_GetError(table, exec_GetError); |
||
9170 | SET_GetFloatv(table, exec_GetFloatv); |
||
9171 | SET_GetIntegerv(table, exec_GetIntegerv); |
||
9172 | SET_GetLightfv(table, exec_GetLightfv); |
||
9173 | SET_GetLightiv(table, exec_GetLightiv); |
||
9174 | SET_GetMapdv(table, exec_GetMapdv); |
||
9175 | SET_GetMapfv(table, exec_GetMapfv); |
||
9176 | SET_GetMapiv(table, exec_GetMapiv); |
||
9177 | SET_GetMaterialfv(table, exec_GetMaterialfv); |
||
9178 | SET_GetMaterialiv(table, exec_GetMaterialiv); |
||
9179 | SET_GetPixelMapfv(table, exec_GetPixelMapfv); |
||
9180 | SET_GetPixelMapuiv(table, exec_GetPixelMapuiv); |
||
9181 | SET_GetPixelMapusv(table, exec_GetPixelMapusv); |
||
9182 | SET_GetPolygonStipple(table, exec_GetPolygonStipple); |
||
9183 | SET_GetString(table, exec_GetString); |
||
9184 | SET_GetTexEnvfv(table, exec_GetTexEnvfv); |
||
9185 | SET_GetTexEnviv(table, exec_GetTexEnviv); |
||
9186 | SET_GetTexGendv(table, exec_GetTexGendv); |
||
9187 | SET_GetTexGenfv(table, exec_GetTexGenfv); |
||
9188 | SET_GetTexGeniv(table, exec_GetTexGeniv); |
||
9189 | SET_GetTexImage(table, exec_GetTexImage); |
||
9190 | SET_GetTexLevelParameterfv(table, exec_GetTexLevelParameterfv); |
||
9191 | SET_GetTexLevelParameteriv(table, exec_GetTexLevelParameteriv); |
||
9192 | SET_GetTexParameterfv(table, exec_GetTexParameterfv); |
||
9193 | SET_GetTexParameteriv(table, exec_GetTexParameteriv); |
||
9194 | SET_Hint(table, save_Hint); |
||
9195 | SET_IndexMask(table, save_IndexMask); |
||
9196 | SET_InitNames(table, save_InitNames); |
||
9197 | SET_IsEnabled(table, exec_IsEnabled); |
||
9198 | SET_IsList(table, _mesa_IsList); |
||
9199 | SET_LightModelf(table, save_LightModelf); |
||
9200 | SET_LightModelfv(table, save_LightModelfv); |
||
9201 | SET_LightModeli(table, save_LightModeli); |
||
9202 | SET_LightModeliv(table, save_LightModeliv); |
||
9203 | SET_Lightf(table, save_Lightf); |
||
9204 | SET_Lightfv(table, save_Lightfv); |
||
9205 | SET_Lighti(table, save_Lighti); |
||
9206 | SET_Lightiv(table, save_Lightiv); |
||
9207 | SET_LineStipple(table, save_LineStipple); |
||
9208 | SET_LineWidth(table, save_LineWidth); |
||
9209 | SET_ListBase(table, save_ListBase); |
||
9210 | SET_LoadIdentity(table, save_LoadIdentity); |
||
9211 | SET_LoadMatrixd(table, save_LoadMatrixd); |
||
9212 | SET_LoadMatrixf(table, save_LoadMatrixf); |
||
9213 | SET_LoadName(table, save_LoadName); |
||
9214 | SET_LogicOp(table, save_LogicOp); |
||
9215 | SET_Map1d(table, save_Map1d); |
||
9216 | SET_Map1f(table, save_Map1f); |
||
9217 | SET_Map2d(table, save_Map2d); |
||
9218 | SET_Map2f(table, save_Map2f); |
||
9219 | SET_MapGrid1d(table, save_MapGrid1d); |
||
9220 | SET_MapGrid1f(table, save_MapGrid1f); |
||
9221 | SET_MapGrid2d(table, save_MapGrid2d); |
||
9222 | SET_MapGrid2f(table, save_MapGrid2f); |
||
9223 | SET_MatrixMode(table, save_MatrixMode); |
||
9224 | SET_MultMatrixd(table, save_MultMatrixd); |
||
9225 | SET_MultMatrixf(table, save_MultMatrixf); |
||
9226 | SET_NewList(table, save_NewList); |
||
9227 | SET_Ortho(table, save_Ortho); |
||
9228 | SET_PassThrough(table, save_PassThrough); |
||
9229 | SET_PixelMapfv(table, save_PixelMapfv); |
||
9230 | SET_PixelMapuiv(table, save_PixelMapuiv); |
||
9231 | SET_PixelMapusv(table, save_PixelMapusv); |
||
9232 | SET_PixelStoref(table, exec_PixelStoref); |
||
9233 | SET_PixelStorei(table, exec_PixelStorei); |
||
9234 | SET_PixelTransferf(table, save_PixelTransferf); |
||
9235 | SET_PixelTransferi(table, save_PixelTransferi); |
||
9236 | SET_PixelZoom(table, save_PixelZoom); |
||
9237 | SET_PointSize(table, save_PointSize); |
||
9238 | SET_PolygonMode(table, save_PolygonMode); |
||
9239 | SET_PolygonOffset(table, save_PolygonOffset); |
||
9240 | SET_PolygonStipple(table, save_PolygonStipple); |
||
9241 | SET_PopAttrib(table, save_PopAttrib); |
||
9242 | SET_PopMatrix(table, save_PopMatrix); |
||
9243 | SET_PopName(table, save_PopName); |
||
9244 | SET_PushAttrib(table, save_PushAttrib); |
||
9245 | SET_PushMatrix(table, save_PushMatrix); |
||
9246 | SET_PushName(table, save_PushName); |
||
9247 | SET_RasterPos2d(table, save_RasterPos2d); |
||
9248 | SET_RasterPos2dv(table, save_RasterPos2dv); |
||
9249 | SET_RasterPos2f(table, save_RasterPos2f); |
||
9250 | SET_RasterPos2fv(table, save_RasterPos2fv); |
||
9251 | SET_RasterPos2i(table, save_RasterPos2i); |
||
9252 | SET_RasterPos2iv(table, save_RasterPos2iv); |
||
9253 | SET_RasterPos2s(table, save_RasterPos2s); |
||
9254 | SET_RasterPos2sv(table, save_RasterPos2sv); |
||
9255 | SET_RasterPos3d(table, save_RasterPos3d); |
||
9256 | SET_RasterPos3dv(table, save_RasterPos3dv); |
||
9257 | SET_RasterPos3f(table, save_RasterPos3f); |
||
9258 | SET_RasterPos3fv(table, save_RasterPos3fv); |
||
9259 | SET_RasterPos3i(table, save_RasterPos3i); |
||
9260 | SET_RasterPos3iv(table, save_RasterPos3iv); |
||
9261 | SET_RasterPos3s(table, save_RasterPos3s); |
||
9262 | SET_RasterPos3sv(table, save_RasterPos3sv); |
||
9263 | SET_RasterPos4d(table, save_RasterPos4d); |
||
9264 | SET_RasterPos4dv(table, save_RasterPos4dv); |
||
9265 | SET_RasterPos4f(table, save_RasterPos4f); |
||
9266 | SET_RasterPos4fv(table, save_RasterPos4fv); |
||
9267 | SET_RasterPos4i(table, save_RasterPos4i); |
||
9268 | SET_RasterPos4iv(table, save_RasterPos4iv); |
||
9269 | SET_RasterPos4s(table, save_RasterPos4s); |
||
9270 | SET_RasterPos4sv(table, save_RasterPos4sv); |
||
9271 | SET_ReadBuffer(table, save_ReadBuffer); |
||
9272 | SET_ReadPixels(table, exec_ReadPixels); |
||
9273 | SET_RenderMode(table, exec_RenderMode); |
||
9274 | SET_Rotated(table, save_Rotated); |
||
9275 | SET_Rotatef(table, save_Rotatef); |
||
9276 | SET_Scaled(table, save_Scaled); |
||
9277 | SET_Scalef(table, save_Scalef); |
||
9278 | SET_Scissor(table, save_Scissor); |
||
9279 | SET_FeedbackBuffer(table, exec_FeedbackBuffer); |
||
9280 | SET_SelectBuffer(table, exec_SelectBuffer); |
||
9281 | SET_ShadeModel(table, save_ShadeModel); |
||
9282 | SET_StencilFunc(table, save_StencilFunc); |
||
9283 | SET_StencilMask(table, save_StencilMask); |
||
9284 | SET_StencilOp(table, save_StencilOp); |
||
9285 | SET_TexEnvf(table, save_TexEnvf); |
||
9286 | SET_TexEnvfv(table, save_TexEnvfv); |
||
9287 | SET_TexEnvi(table, save_TexEnvi); |
||
9288 | SET_TexEnviv(table, save_TexEnviv); |
||
9289 | SET_TexGend(table, save_TexGend); |
||
9290 | SET_TexGendv(table, save_TexGendv); |
||
9291 | SET_TexGenf(table, save_TexGenf); |
||
9292 | SET_TexGenfv(table, save_TexGenfv); |
||
9293 | SET_TexGeni(table, save_TexGeni); |
||
9294 | SET_TexGeniv(table, save_TexGeniv); |
||
9295 | SET_TexImage1D(table, save_TexImage1D); |
||
9296 | SET_TexImage2D(table, save_TexImage2D); |
||
9297 | SET_TexParameterf(table, save_TexParameterf); |
||
9298 | SET_TexParameterfv(table, save_TexParameterfv); |
||
9299 | SET_TexParameteri(table, save_TexParameteri); |
||
9300 | SET_TexParameteriv(table, save_TexParameteriv); |
||
9301 | SET_Translated(table, save_Translated); |
||
9302 | SET_Translatef(table, save_Translatef); |
||
9303 | SET_Viewport(table, save_Viewport); |
||
9304 | |||
9305 | /* GL 1.1 */ |
||
9306 | SET_AreTexturesResident(table, exec_AreTexturesResident); |
||
9307 | SET_BindTexture(table, save_BindTexture); |
||
9308 | SET_ColorPointer(table, exec_ColorPointer); |
||
9309 | SET_CopyTexImage1D(table, save_CopyTexImage1D); |
||
9310 | SET_CopyTexImage2D(table, save_CopyTexImage2D); |
||
9311 | SET_CopyTexSubImage1D(table, save_CopyTexSubImage1D); |
||
9312 | SET_CopyTexSubImage2D(table, save_CopyTexSubImage2D); |
||
9313 | SET_DeleteTextures(table, exec_DeleteTextures); |
||
9314 | SET_DisableClientState(table, exec_DisableClientState); |
||
9315 | SET_EdgeFlagPointer(table, exec_EdgeFlagPointer); |
||
9316 | SET_EnableClientState(table, exec_EnableClientState); |
||
9317 | SET_GenTextures(table, exec_GenTextures); |
||
9318 | SET_GetPointerv(table, exec_GetPointerv); |
||
9319 | SET_IndexPointer(table, exec_IndexPointer); |
||
9320 | SET_InterleavedArrays(table, exec_InterleavedArrays); |
||
9321 | SET_IsTexture(table, exec_IsTexture); |
||
9322 | SET_NormalPointer(table, exec_NormalPointer); |
||
9323 | SET_PopClientAttrib(table, exec_PopClientAttrib); |
||
9324 | SET_PrioritizeTextures(table, save_PrioritizeTextures); |
||
9325 | SET_PushClientAttrib(table, exec_PushClientAttrib); |
||
9326 | SET_TexCoordPointer(table, exec_TexCoordPointer); |
||
9327 | SET_TexSubImage1D(table, save_TexSubImage1D); |
||
9328 | SET_TexSubImage2D(table, save_TexSubImage2D); |
||
9329 | SET_VertexPointer(table, exec_VertexPointer); |
||
9330 | |||
9331 | /* GL 1.2 */ |
||
9332 | SET_CopyTexSubImage3D(table, save_CopyTexSubImage3D); |
||
9333 | SET_TexImage3D(table, save_TexImage3D); |
||
9334 | SET_TexSubImage3D(table, save_TexSubImage3D); |
||
9335 | |||
9336 | /* GL 2.0 */ |
||
9337 | SET_StencilFuncSeparate(table, save_StencilFuncSeparate); |
||
9338 | SET_StencilMaskSeparate(table, save_StencilMaskSeparate); |
||
9339 | SET_StencilOpSeparate(table, save_StencilOpSeparate); |
||
9340 | |||
9341 | /* ATI_separate_stencil */ |
||
9342 | SET_StencilFuncSeparateATI(table, save_StencilFuncSeparateATI); |
||
9343 | |||
9344 | /* GL_ARB_imaging */ |
||
9345 | /* Not all are supported */ |
||
9346 | SET_BlendColor(table, save_BlendColor); |
||
9347 | SET_BlendEquation(table, save_BlendEquation); |
||
9348 | SET_ColorSubTable(table, save_ColorSubTable); |
||
9349 | SET_ColorTable(table, save_ColorTable); |
||
9350 | SET_ColorTableParameterfv(table, save_ColorTableParameterfv); |
||
9351 | SET_ColorTableParameteriv(table, save_ColorTableParameteriv); |
||
9352 | SET_ConvolutionFilter1D(table, save_ConvolutionFilter1D); |
||
9353 | SET_ConvolutionFilter2D(table, save_ConvolutionFilter2D); |
||
9354 | SET_ConvolutionParameterf(table, save_ConvolutionParameterf); |
||
9355 | SET_ConvolutionParameterfv(table, save_ConvolutionParameterfv); |
||
9356 | SET_ConvolutionParameteri(table, save_ConvolutionParameteri); |
||
9357 | SET_ConvolutionParameteriv(table, save_ConvolutionParameteriv); |
||
9358 | SET_CopyColorSubTable(table, save_CopyColorSubTable); |
||
9359 | SET_CopyColorTable(table, save_CopyColorTable); |
||
9360 | SET_CopyConvolutionFilter1D(table, exec_CopyConvolutionFilter1D); |
||
9361 | SET_CopyConvolutionFilter2D(table, exec_CopyConvolutionFilter2D); |
||
9362 | SET_GetColorTable(table, exec_GetColorTable); |
||
9363 | SET_GetColorTableParameterfv(table, exec_GetColorTableParameterfv); |
||
9364 | SET_GetColorTableParameteriv(table, exec_GetColorTableParameteriv); |
||
9365 | SET_GetConvolutionFilter(table, exec_GetConvolutionFilter); |
||
9366 | SET_GetConvolutionParameterfv(table, exec_GetConvolutionParameterfv); |
||
9367 | SET_GetConvolutionParameteriv(table, exec_GetConvolutionParameteriv); |
||
9368 | SET_GetHistogram(table, exec_GetHistogram); |
||
9369 | SET_GetHistogramParameterfv(table, exec_GetHistogramParameterfv); |
||
9370 | SET_GetHistogramParameteriv(table, exec_GetHistogramParameteriv); |
||
9371 | SET_GetMinmax(table, exec_GetMinmax); |
||
9372 | SET_GetMinmaxParameterfv(table, exec_GetMinmaxParameterfv); |
||
9373 | SET_GetMinmaxParameteriv(table, exec_GetMinmaxParameteriv); |
||
9374 | SET_GetSeparableFilter(table, exec_GetSeparableFilter); |
||
9375 | SET_Histogram(table, save_Histogram); |
||
9376 | SET_Minmax(table, save_Minmax); |
||
9377 | SET_ResetHistogram(table, save_ResetHistogram); |
||
9378 | SET_ResetMinmax(table, save_ResetMinmax); |
||
9379 | SET_SeparableFilter2D(table, exec_SeparableFilter2D); |
||
9380 | |||
9381 | /* 2. GL_EXT_blend_color */ |
||
9382 | #if 0 |
||
9383 | SET_BlendColorEXT(table, save_BlendColorEXT); |
||
9384 | #endif |
||
9385 | |||
9386 | /* 3. GL_EXT_polygon_offset */ |
||
9387 | SET_PolygonOffsetEXT(table, save_PolygonOffsetEXT); |
||
9388 | |||
9389 | /* 6. GL_EXT_texture3d */ |
||
9390 | #if 0 |
||
9391 | SET_CopyTexSubImage3DEXT(table, save_CopyTexSubImage3D); |
||
9392 | SET_TexImage3DEXT(table, save_TexImage3DEXT); |
||
9393 | SET_TexSubImage3DEXT(table, save_TexSubImage3D); |
||
9394 | #endif |
||
9395 | |||
9396 | /* 14. GL_SGI_color_table */ |
||
9397 | #if 0 |
||
9398 | SET_ColorTableSGI(table, save_ColorTable); |
||
9399 | SET_ColorSubTableSGI(table, save_ColorSubTable); |
||
9400 | SET_GetColorTableSGI(table, exec_GetColorTable); |
||
9401 | SET_GetColorTableParameterfvSGI(table, exec_GetColorTableParameterfv); |
||
9402 | SET_GetColorTableParameterivSGI(table, exec_GetColorTableParameteriv); |
||
9403 | #endif |
||
9404 | |||
9405 | /* 30. GL_EXT_vertex_array */ |
||
9406 | SET_ColorPointerEXT(table, exec_ColorPointerEXT); |
||
9407 | SET_EdgeFlagPointerEXT(table, exec_EdgeFlagPointerEXT); |
||
9408 | SET_IndexPointerEXT(table, exec_IndexPointerEXT); |
||
9409 | SET_NormalPointerEXT(table, exec_NormalPointerEXT); |
||
9410 | SET_TexCoordPointerEXT(table, exec_TexCoordPointerEXT); |
||
9411 | SET_VertexPointerEXT(table, exec_VertexPointerEXT); |
||
9412 | |||
9413 | /* 37. GL_EXT_blend_minmax */ |
||
9414 | #if 0 |
||
9415 | SET_BlendEquationEXT(table, save_BlendEquationEXT); |
||
9416 | #endif |
||
9417 | |||
9418 | /* 54. GL_EXT_point_parameters */ |
||
9419 | SET_PointParameterfEXT(table, save_PointParameterfEXT); |
||
9420 | SET_PointParameterfvEXT(table, save_PointParameterfvEXT); |
||
9421 | |||
9422 | /* 97. GL_EXT_compiled_vertex_array */ |
||
9423 | SET_LockArraysEXT(table, exec_LockArraysEXT); |
||
9424 | SET_UnlockArraysEXT(table, exec_UnlockArraysEXT); |
||
9425 | |||
9426 | /* 145. GL_EXT_secondary_color */ |
||
9427 | SET_SecondaryColorPointerEXT(table, exec_SecondaryColorPointerEXT); |
||
9428 | |||
9429 | /* 148. GL_EXT_multi_draw_arrays */ |
||
9430 | SET_MultiDrawArraysEXT(table, exec_MultiDrawArraysEXT); |
||
9431 | |||
9432 | /* 149. GL_EXT_fog_coord */ |
||
9433 | SET_FogCoordPointerEXT(table, exec_FogCoordPointerEXT); |
||
9434 | |||
9435 | /* 173. GL_EXT_blend_func_separate */ |
||
9436 | SET_BlendFuncSeparateEXT(table, save_BlendFuncSeparateEXT); |
||
9437 | |||
9438 | /* 196. GL_MESA_resize_buffers */ |
||
9439 | SET_ResizeBuffersMESA(table, _mesa_ResizeBuffersMESA); |
||
9440 | |||
9441 | /* 197. GL_MESA_window_pos */ |
||
9442 | SET_WindowPos2dMESA(table, save_WindowPos2dMESA); |
||
9443 | SET_WindowPos2dvMESA(table, save_WindowPos2dvMESA); |
||
9444 | SET_WindowPos2fMESA(table, save_WindowPos2fMESA); |
||
9445 | SET_WindowPos2fvMESA(table, save_WindowPos2fvMESA); |
||
9446 | SET_WindowPos2iMESA(table, save_WindowPos2iMESA); |
||
9447 | SET_WindowPos2ivMESA(table, save_WindowPos2ivMESA); |
||
9448 | SET_WindowPos2sMESA(table, save_WindowPos2sMESA); |
||
9449 | SET_WindowPos2svMESA(table, save_WindowPos2svMESA); |
||
9450 | SET_WindowPos3dMESA(table, save_WindowPos3dMESA); |
||
9451 | SET_WindowPos3dvMESA(table, save_WindowPos3dvMESA); |
||
9452 | SET_WindowPos3fMESA(table, save_WindowPos3fMESA); |
||
9453 | SET_WindowPos3fvMESA(table, save_WindowPos3fvMESA); |
||
9454 | SET_WindowPos3iMESA(table, save_WindowPos3iMESA); |
||
9455 | SET_WindowPos3ivMESA(table, save_WindowPos3ivMESA); |
||
9456 | SET_WindowPos3sMESA(table, save_WindowPos3sMESA); |
||
9457 | SET_WindowPos3svMESA(table, save_WindowPos3svMESA); |
||
9458 | SET_WindowPos4dMESA(table, save_WindowPos4dMESA); |
||
9459 | SET_WindowPos4dvMESA(table, save_WindowPos4dvMESA); |
||
9460 | SET_WindowPos4fMESA(table, save_WindowPos4fMESA); |
||
9461 | SET_WindowPos4fvMESA(table, save_WindowPos4fvMESA); |
||
9462 | SET_WindowPos4iMESA(table, save_WindowPos4iMESA); |
||
9463 | SET_WindowPos4ivMESA(table, save_WindowPos4ivMESA); |
||
9464 | SET_WindowPos4sMESA(table, save_WindowPos4sMESA); |
||
9465 | SET_WindowPos4svMESA(table, save_WindowPos4svMESA); |
||
9466 | |||
9467 | /* 200. GL_IBM_multimode_draw_arrays */ |
||
9468 | SET_MultiModeDrawArraysIBM(table, exec_MultiModeDrawArraysIBM); |
||
9469 | SET_MultiModeDrawElementsIBM(table, exec_MultiModeDrawElementsIBM); |
||
9470 | |||
9471 | #if FEATURE_NV_vertex_program |
||
9472 | /* 233. GL_NV_vertex_program */ |
||
9473 | /* The following commands DO NOT go into display lists: |
||
9474 | * AreProgramsResidentNV, IsProgramNV, GenProgramsNV, DeleteProgramsNV, |
||
9475 | * VertexAttribPointerNV, GetProgram*, GetVertexAttrib* |
||
9476 | */ |
||
9477 | SET_BindProgramNV(table, save_BindProgramNV); |
||
9478 | SET_DeleteProgramsNV(table, _mesa_DeletePrograms); |
||
9479 | SET_ExecuteProgramNV(table, save_ExecuteProgramNV); |
||
9480 | SET_GenProgramsNV(table, _mesa_GenPrograms); |
||
9481 | SET_AreProgramsResidentNV(table, _mesa_AreProgramsResidentNV); |
||
9482 | SET_RequestResidentProgramsNV(table, save_RequestResidentProgramsNV); |
||
9483 | SET_GetProgramParameterfvNV(table, _mesa_GetProgramParameterfvNV); |
||
9484 | SET_GetProgramParameterdvNV(table, _mesa_GetProgramParameterdvNV); |
||
9485 | SET_GetProgramivNV(table, _mesa_GetProgramivNV); |
||
9486 | SET_GetProgramStringNV(table, _mesa_GetProgramStringNV); |
||
9487 | SET_GetTrackMatrixivNV(table, _mesa_GetTrackMatrixivNV); |
||
9488 | SET_GetVertexAttribdvNV(table, _mesa_GetVertexAttribdvNV); |
||
9489 | SET_GetVertexAttribfvNV(table, _mesa_GetVertexAttribfvNV); |
||
9490 | SET_GetVertexAttribivNV(table, _mesa_GetVertexAttribivNV); |
||
9491 | SET_GetVertexAttribPointervNV(table, _mesa_GetVertexAttribPointervNV); |
||
9492 | SET_IsProgramNV(table, _mesa_IsProgramARB); |
||
9493 | SET_LoadProgramNV(table, save_LoadProgramNV); |
||
9494 | SET_ProgramEnvParameter4dARB(table, save_ProgramEnvParameter4dARB); |
||
9495 | SET_ProgramEnvParameter4dvARB(table, save_ProgramEnvParameter4dvARB); |
||
9496 | SET_ProgramEnvParameter4fARB(table, save_ProgramEnvParameter4fARB); |
||
9497 | SET_ProgramEnvParameter4fvARB(table, save_ProgramEnvParameter4fvARB); |
||
9498 | SET_ProgramParameters4dvNV(table, save_ProgramParameters4dvNV); |
||
9499 | SET_ProgramParameters4fvNV(table, save_ProgramParameters4fvNV); |
||
9500 | SET_TrackMatrixNV(table, save_TrackMatrixNV); |
||
9501 | SET_VertexAttribPointerNV(table, _mesa_VertexAttribPointerNV); |
||
9502 | #endif |
||
9503 | |||
9504 | /* 244. GL_ATI_envmap_bumpmap */ |
||
9505 | SET_TexBumpParameterivATI(table, save_TexBumpParameterivATI); |
||
9506 | SET_TexBumpParameterfvATI(table, save_TexBumpParameterfvATI); |
||
9507 | |||
9508 | /* 245. GL_ATI_fragment_shader */ |
||
9509 | #if FEATURE_ATI_fragment_shader |
||
9510 | SET_BindFragmentShaderATI(table, save_BindFragmentShaderATI); |
||
9511 | SET_SetFragmentShaderConstantATI(table, save_SetFragmentShaderConstantATI); |
||
9512 | #endif |
||
9513 | |||
9514 | /* 282. GL_NV_fragment_program */ |
||
9515 | #if FEATURE_NV_fragment_program |
||
9516 | SET_ProgramNamedParameter4fNV(table, save_ProgramNamedParameter4fNV); |
||
9517 | SET_ProgramNamedParameter4dNV(table, save_ProgramNamedParameter4dNV); |
||
9518 | SET_ProgramNamedParameter4fvNV(table, save_ProgramNamedParameter4fvNV); |
||
9519 | SET_ProgramNamedParameter4dvNV(table, save_ProgramNamedParameter4dvNV); |
||
9520 | SET_GetProgramNamedParameterfvNV(table, |
||
9521 | _mesa_GetProgramNamedParameterfvNV); |
||
9522 | SET_GetProgramNamedParameterdvNV(table, |
||
9523 | _mesa_GetProgramNamedParameterdvNV); |
||
9524 | SET_ProgramLocalParameter4dARB(table, save_ProgramLocalParameter4dARB); |
||
9525 | SET_ProgramLocalParameter4dvARB(table, save_ProgramLocalParameter4dvARB); |
||
9526 | SET_ProgramLocalParameter4fARB(table, save_ProgramLocalParameter4fARB); |
||
9527 | SET_ProgramLocalParameter4fvARB(table, save_ProgramLocalParameter4fvARB); |
||
9528 | SET_GetProgramLocalParameterdvARB(table, |
||
9529 | _mesa_GetProgramLocalParameterdvARB); |
||
9530 | SET_GetProgramLocalParameterfvARB(table, |
||
9531 | _mesa_GetProgramLocalParameterfvARB); |
||
9532 | #endif |
||
9533 | |||
9534 | /* 262. GL_NV_point_sprite */ |
||
9535 | SET_PointParameteriNV(table, save_PointParameteriNV); |
||
9536 | SET_PointParameterivNV(table, save_PointParameterivNV); |
||
9537 | |||
9538 | /* 268. GL_EXT_stencil_two_side */ |
||
9539 | SET_ActiveStencilFaceEXT(table, save_ActiveStencilFaceEXT); |
||
9540 | |||
9541 | /* 273. GL_APPLE_vertex_array_object */ |
||
9542 | SET_BindVertexArrayAPPLE(table, _mesa_BindVertexArrayAPPLE); |
||
9543 | SET_DeleteVertexArraysAPPLE(table, _mesa_DeleteVertexArraysAPPLE); |
||
9544 | SET_GenVertexArraysAPPLE(table, _mesa_GenVertexArraysAPPLE); |
||
9545 | SET_IsVertexArrayAPPLE(table, _mesa_IsVertexArrayAPPLE); |
||
9546 | |||
9547 | /* ???. GL_EXT_depth_bounds_test */ |
||
9548 | SET_DepthBoundsEXT(table, save_DepthBoundsEXT); |
||
9549 | |||
9550 | /* ARB 1. GL_ARB_multitexture */ |
||
9551 | SET_ActiveTextureARB(table, save_ActiveTextureARB); |
||
9552 | SET_ClientActiveTextureARB(table, exec_ClientActiveTextureARB); |
||
9553 | |||
9554 | /* ARB 3. GL_ARB_transpose_matrix */ |
||
9555 | SET_LoadTransposeMatrixdARB(table, save_LoadTransposeMatrixdARB); |
||
9556 | SET_LoadTransposeMatrixfARB(table, save_LoadTransposeMatrixfARB); |
||
9557 | SET_MultTransposeMatrixdARB(table, save_MultTransposeMatrixdARB); |
||
9558 | SET_MultTransposeMatrixfARB(table, save_MultTransposeMatrixfARB); |
||
9559 | |||
9560 | /* ARB 5. GL_ARB_multisample */ |
||
9561 | SET_SampleCoverageARB(table, save_SampleCoverageARB); |
||
9562 | |||
9563 | /* ARB 12. GL_ARB_texture_compression */ |
||
9564 | SET_CompressedTexImage3DARB(table, save_CompressedTexImage3DARB); |
||
9565 | SET_CompressedTexImage2DARB(table, save_CompressedTexImage2DARB); |
||
9566 | SET_CompressedTexImage1DARB(table, save_CompressedTexImage1DARB); |
||
9567 | SET_CompressedTexSubImage3DARB(table, save_CompressedTexSubImage3DARB); |
||
9568 | SET_CompressedTexSubImage2DARB(table, save_CompressedTexSubImage2DARB); |
||
9569 | SET_CompressedTexSubImage1DARB(table, save_CompressedTexSubImage1DARB); |
||
9570 | SET_GetCompressedTexImageARB(table, exec_GetCompressedTexImageARB); |
||
9571 | |||
9572 | /* ARB 14. GL_ARB_point_parameters */ |
||
9573 | /* aliased with EXT_point_parameters functions */ |
||
9574 | |||
9575 | /* ARB 25. GL_ARB_window_pos */ |
||
9576 | /* aliased with MESA_window_pos functions */ |
||
9577 | |||
9578 | /* ARB 26. GL_ARB_vertex_program */ |
||
9579 | /* ARB 27. GL_ARB_fragment_program */ |
||
9580 | #if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program |
||
9581 | /* glVertexAttrib* functions alias the NV ones, handled elsewhere */ |
||
9582 | SET_VertexAttribPointerARB(table, _mesa_VertexAttribPointerARB); |
||
9583 | SET_EnableVertexAttribArrayARB(table, _mesa_EnableVertexAttribArrayARB); |
||
9584 | SET_DisableVertexAttribArrayARB(table, _mesa_DisableVertexAttribArrayARB); |
||
9585 | SET_ProgramStringARB(table, save_ProgramStringARB); |
||
9586 | SET_BindProgramNV(table, save_BindProgramNV); |
||
9587 | SET_DeleteProgramsNV(table, _mesa_DeletePrograms); |
||
9588 | SET_GenProgramsNV(table, _mesa_GenPrograms); |
||
9589 | SET_IsProgramNV(table, _mesa_IsProgramARB); |
||
9590 | SET_GetVertexAttribdvNV(table, _mesa_GetVertexAttribdvNV); |
||
9591 | SET_GetVertexAttribfvNV(table, _mesa_GetVertexAttribfvNV); |
||
9592 | SET_GetVertexAttribivNV(table, _mesa_GetVertexAttribivNV); |
||
9593 | SET_GetVertexAttribPointervNV(table, _mesa_GetVertexAttribPointervNV); |
||
9594 | SET_ProgramEnvParameter4dARB(table, save_ProgramEnvParameter4dARB); |
||
9595 | SET_ProgramEnvParameter4dvARB(table, save_ProgramEnvParameter4dvARB); |
||
9596 | SET_ProgramEnvParameter4fARB(table, save_ProgramEnvParameter4fARB); |
||
9597 | SET_ProgramEnvParameter4fvARB(table, save_ProgramEnvParameter4fvARB); |
||
9598 | SET_ProgramLocalParameter4dARB(table, save_ProgramLocalParameter4dARB); |
||
9599 | SET_ProgramLocalParameter4dvARB(table, save_ProgramLocalParameter4dvARB); |
||
9600 | SET_ProgramLocalParameter4fARB(table, save_ProgramLocalParameter4fARB); |
||
9601 | SET_ProgramLocalParameter4fvARB(table, save_ProgramLocalParameter4fvARB); |
||
9602 | SET_GetProgramEnvParameterdvARB(table, _mesa_GetProgramEnvParameterdvARB); |
||
9603 | SET_GetProgramEnvParameterfvARB(table, _mesa_GetProgramEnvParameterfvARB); |
||
9604 | SET_GetProgramLocalParameterdvARB(table, |
||
9605 | _mesa_GetProgramLocalParameterdvARB); |
||
9606 | SET_GetProgramLocalParameterfvARB(table, |
||
9607 | _mesa_GetProgramLocalParameterfvARB); |
||
9608 | SET_GetProgramivARB(table, _mesa_GetProgramivARB); |
||
9609 | SET_GetProgramStringARB(table, _mesa_GetProgramStringARB); |
||
9610 | #endif |
||
9611 | |||
9612 | /* ARB 28. GL_ARB_vertex_buffer_object */ |
||
9613 | #if FEATURE_ARB_vertex_buffer_object |
||
9614 | /* None of the extension's functions get compiled */ |
||
9615 | SET_BindBufferARB(table, _mesa_BindBufferARB); |
||
9616 | SET_BufferDataARB(table, _mesa_BufferDataARB); |
||
9617 | SET_BufferSubDataARB(table, _mesa_BufferSubDataARB); |
||
9618 | SET_DeleteBuffersARB(table, _mesa_DeleteBuffersARB); |
||
9619 | SET_GenBuffersARB(table, _mesa_GenBuffersARB); |
||
9620 | SET_GetBufferParameterivARB(table, _mesa_GetBufferParameterivARB); |
||
9621 | SET_GetBufferPointervARB(table, _mesa_GetBufferPointervARB); |
||
9622 | SET_GetBufferSubDataARB(table, _mesa_GetBufferSubDataARB); |
||
9623 | SET_IsBufferARB(table, _mesa_IsBufferARB); |
||
9624 | SET_MapBufferARB(table, _mesa_MapBufferARB); |
||
9625 | SET_UnmapBufferARB(table, _mesa_UnmapBufferARB); |
||
9626 | #endif |
||
9627 | |||
9628 | #if FEATURE_queryobj |
||
9629 | SET_BeginQueryARB(table, save_BeginQueryARB); |
||
9630 | SET_EndQueryARB(table, save_EndQueryARB); |
||
9631 | SET_GenQueriesARB(table, _mesa_GenQueriesARB); |
||
9632 | SET_DeleteQueriesARB(table, _mesa_DeleteQueriesARB); |
||
9633 | SET_IsQueryARB(table, _mesa_IsQueryARB); |
||
9634 | SET_GetQueryivARB(table, _mesa_GetQueryivARB); |
||
9635 | SET_GetQueryObjectivARB(table, _mesa_GetQueryObjectivARB); |
||
9636 | SET_GetQueryObjectuivARB(table, _mesa_GetQueryObjectuivARB); |
||
9637 | #endif |
||
9638 | SET_DrawBuffersARB(table, save_DrawBuffersARB); |
||
9639 | |||
9640 | #if FEATURE_EXT_framebuffer_blit |
||
9641 | SET_BlitFramebufferEXT(table, save_BlitFramebufferEXT); |
||
9642 | #endif |
||
9643 | |||
9644 | /* GL_ARB_shader_objects */ |
||
9645 | SET_UseProgramObjectARB(table, save_UseProgramObjectARB); |
||
9646 | SET_Uniform1fARB(table, save_Uniform1fARB); |
||
9647 | SET_Uniform2fARB(table, save_Uniform2fARB); |
||
9648 | SET_Uniform3fARB(table, save_Uniform3fARB); |
||
9649 | SET_Uniform4fARB(table, save_Uniform4fARB); |
||
9650 | SET_Uniform1fvARB(table, save_Uniform1fvARB); |
||
9651 | SET_Uniform2fvARB(table, save_Uniform2fvARB); |
||
9652 | SET_Uniform3fvARB(table, save_Uniform3fvARB); |
||
9653 | SET_Uniform4fvARB(table, save_Uniform4fvARB); |
||
9654 | SET_Uniform1iARB(table, save_Uniform1iARB); |
||
9655 | SET_Uniform2iARB(table, save_Uniform2iARB); |
||
9656 | SET_Uniform3iARB(table, save_Uniform3iARB); |
||
9657 | SET_Uniform4iARB(table, save_Uniform4iARB); |
||
9658 | SET_Uniform1ivARB(table, save_Uniform1ivARB); |
||
9659 | SET_Uniform2ivARB(table, save_Uniform2ivARB); |
||
9660 | SET_Uniform3ivARB(table, save_Uniform3ivARB); |
||
9661 | SET_Uniform4ivARB(table, save_Uniform4ivARB); |
||
9662 | SET_UniformMatrix2fvARB(table, save_UniformMatrix2fvARB); |
||
9663 | SET_UniformMatrix3fvARB(table, save_UniformMatrix3fvARB); |
||
9664 | SET_UniformMatrix4fvARB(table, save_UniformMatrix4fvARB); |
||
9665 | SET_UniformMatrix2x3fv(table, save_UniformMatrix2x3fv); |
||
9666 | SET_UniformMatrix3x2fv(table, save_UniformMatrix3x2fv); |
||
9667 | SET_UniformMatrix2x4fv(table, save_UniformMatrix2x4fv); |
||
9668 | SET_UniformMatrix4x2fv(table, save_UniformMatrix4x2fv); |
||
9669 | SET_UniformMatrix3x4fv(table, save_UniformMatrix3x4fv); |
||
9670 | SET_UniformMatrix4x3fv(table, save_UniformMatrix4x3fv); |
||
9671 | |||
9672 | /* ARB 30/31/32. GL_ARB_shader_objects, GL_ARB_vertex/fragment_shader */ |
||
9673 | SET_BindAttribLocationARB(table, exec_BindAttribLocationARB); |
||
9674 | SET_GetAttribLocationARB(table, exec_GetAttribLocationARB); |
||
9675 | SET_GetUniformLocationARB(table, exec_GetUniformLocationARB); |
||
9676 | /* XXX additional functions need to be implemented here! */ |
||
9677 | |||
9678 | /* 299. GL_EXT_blend_equation_separate */ |
||
9679 | SET_BlendEquationSeparateEXT(table, save_BlendEquationSeparateEXT); |
||
9680 | |||
9681 | /* GL_EXT_gpu_program_parameters */ |
||
9682 | #if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program |
||
9683 | SET_ProgramEnvParameters4fvEXT(table, save_ProgramEnvParameters4fvEXT); |
||
9684 | SET_ProgramLocalParameters4fvEXT(table, save_ProgramLocalParameters4fvEXT); |
||
9685 | #endif |
||
9686 | |||
9687 | /* ARB 50. GL_ARB_map_buffer_range */ |
||
9688 | #if FEATURE_ARB_map_buffer_range |
||
9689 | SET_MapBufferRange(table, _mesa_MapBufferRange); /* no dlist save */ |
||
9690 | SET_FlushMappedBufferRange(table, _mesa_FlushMappedBufferRange); /* no dl */ |
||
9691 | #endif |
||
9692 | |||
9693 | /* ARB 59. GL_ARB_copy_buffer */ |
||
9694 | SET_CopyBufferSubData(table, _mesa_CopyBufferSubData); /* no dlist save */ |
||
9695 | |||
9696 | /* 352. GL_EXT_transform_feedback */ |
||
9697 | #if FEATURE_EXT_transform_feedback |
||
9698 | SET_BeginTransformFeedbackEXT(table, save_BeginTransformFeedback); |
||
9699 | SET_EndTransformFeedbackEXT(table, save_EndTransformFeedback); |
||
9700 | #endif |
||
9701 | |||
9702 | /* 364. GL_EXT_provoking_vertex */ |
||
9703 | SET_ProvokingVertexEXT(table, save_ProvokingVertexEXT); |
||
9704 | |||
9705 | /* 371. GL_APPLE_object_purgeable */ |
||
9706 | #if FEATURE_APPLE_object_purgeable |
||
9707 | SET_ObjectPurgeableAPPLE(table, _mesa_ObjectPurgeableAPPLE); |
||
9708 | SET_ObjectUnpurgeableAPPLE(table, _mesa_ObjectUnpurgeableAPPLE); |
||
9709 | #endif |
||
9710 | |||
9711 | /* GL_EXT_texture_integer */ |
||
9712 | SET_ClearColorIiEXT(table, save_ClearColorIi); |
||
9713 | SET_ClearColorIuiEXT(table, save_ClearColorIui); |
||
9714 | SET_TexParameterIivEXT(table, save_TexParameterIiv); |
||
9715 | SET_TexParameterIuivEXT(table, save_TexParameterIuiv); |
||
9716 | SET_GetTexParameterIivEXT(table, exec_GetTexParameterIiv); |
||
9717 | SET_GetTexParameterIuivEXT(table, exec_GetTexParameterIuiv); |
||
9718 | |||
9719 | /* 377. GL_EXT_separate_shader_objects */ |
||
9720 | SET_UseShaderProgramEXT(table, save_UseShaderProgramEXT); |
||
9721 | SET_ActiveProgramEXT(table, save_ActiveProgramEXT); |
||
9722 | |||
9723 | /* GL 3.0 */ |
||
9724 | #if 0 |
||
9725 | SET_ClearBufferiv(table, save_ClearBufferiv); |
||
9726 | SET_ClearBufferuiv(table, save_ClearBufferuiv); |
||
9727 | SET_ClearBufferfv(table, save_ClearBufferfv); |
||
9728 | SET_ClearBufferfi(table, save_ClearBufferfi); |
||
9729 | SET_Uniform1ui(table, save_Uniform1ui); |
||
9730 | SET_Uniform2ui(table, save_Uniform2ui); |
||
9731 | SET_Uniform3ui(table, save_Uniform3ui); |
||
9732 | SET_Uniform4ui(table, save_Uniform4ui); |
||
9733 | SET_Uniform1uiv(table, save_Uniform1uiv); |
||
9734 | SET_Uniform2uiv(table, save_Uniform2uiv); |
||
9735 | SET_Uniform3uiv(table, save_Uniform3uiv); |
||
9736 | SET_Uniform4uiv(table, save_Uniform4uiv); |
||
9737 | #else |
||
9738 | (void) save_ClearBufferiv; |
||
9739 | (void) save_ClearBufferuiv; |
||
9740 | (void) save_ClearBufferfv; |
||
9741 | (void) save_ClearBufferfi; |
||
9742 | (void) save_Uniform1ui; |
||
9743 | (void) save_Uniform2ui; |
||
9744 | (void) save_Uniform3ui; |
||
9745 | (void) save_Uniform4ui; |
||
9746 | (void) save_Uniform1uiv; |
||
9747 | (void) save_Uniform2uiv; |
||
9748 | (void) save_Uniform3uiv; |
||
9749 | (void) save_Uniform4uiv; |
||
9750 | #endif |
||
9751 | |||
9752 | return table; |
||
9753 | } |
||
9754 | |||
9755 | |||
9756 | |||
9757 | static const char * |
||
9758 | enum_string(GLenum k) |
||
9759 | { |
||
9760 | return _mesa_lookup_enum_by_nr(k); |
||
9761 | } |
||
9762 | |||
9763 | |||
9764 | /** |
||
9765 | * Print the commands in a display list. For debugging only. |
||
9766 | * TODO: many commands aren't handled yet. |
||
9767 | */ |
||
9768 | static void GLAPIENTRY |
||
9769 | print_list(struct gl_context *ctx, GLuint list) |
||
9770 | { |
||
9771 | struct gl_display_list *dlist; |
||
9772 | Node *n; |
||
9773 | GLboolean done; |
||
9774 | |||
9775 | if (!islist(ctx, list)) { |
||
9776 | printf("%u is not a display list ID\n", list); |
||
9777 | return; |
||
9778 | } |
||
9779 | |||
9780 | dlist = lookup_list(ctx, list); |
||
9781 | if (!dlist) |
||
9782 | return; |
||
9783 | |||
9784 | n = dlist->Head; |
||
9785 | |||
9786 | printf("START-LIST %u, address %p\n", list, (void *) n); |
||
9787 | |||
9788 | done = n ? GL_FALSE : GL_TRUE; |
||
9789 | while (!done) { |
||
9790 | const OpCode opcode = n[0].opcode; |
||
9791 | |||
9792 | if (is_ext_opcode(opcode)) { |
||
9793 | n += ext_opcode_print(ctx, n); |
||
9794 | } |
||
9795 | else { |
||
9796 | switch (opcode) { |
||
9797 | case OPCODE_ACCUM: |
||
9798 | printf("Accum %s %g\n", enum_string(n[1].e), n[2].f); |
||
9799 | break; |
||
9800 | case OPCODE_BITMAP: |
||
9801 | printf("Bitmap %d %d %g %g %g %g %p\n", n[1].i, n[2].i, |
||
9802 | n[3].f, n[4].f, n[5].f, n[6].f, (void *) n[7].data); |
||
9803 | break; |
||
9804 | case OPCODE_CALL_LIST: |
||
9805 | printf("CallList %d\n", (int) n[1].ui); |
||
9806 | break; |
||
9807 | case OPCODE_CALL_LIST_OFFSET: |
||
9808 | printf("CallList %d + offset %u = %u\n", (int) n[1].ui, |
||
9809 | ctx->List.ListBase, ctx->List.ListBase + n[1].ui); |
||
9810 | break; |
||
9811 | case OPCODE_COLOR_TABLE_PARAMETER_FV: |
||
9812 | printf("ColorTableParameterfv %s %s %f %f %f %f\n", |
||
9813 | enum_string(n[1].e), enum_string(n[2].e), |
||
9814 | n[3].f, n[4].f, n[5].f, n[6].f); |
||
9815 | break; |
||
9816 | case OPCODE_COLOR_TABLE_PARAMETER_IV: |
||
9817 | printf("ColorTableParameteriv %s %s %d %d %d %d\n", |
||
9818 | enum_string(n[1].e), enum_string(n[2].e), |
||
9819 | n[3].i, n[4].i, n[5].i, n[6].i); |
||
9820 | break; |
||
9821 | case OPCODE_DISABLE: |
||
9822 | printf("Disable %s\n", enum_string(n[1].e)); |
||
9823 | break; |
||
9824 | case OPCODE_ENABLE: |
||
9825 | printf("Enable %s\n", enum_string(n[1].e)); |
||
9826 | break; |
||
9827 | case OPCODE_FRUSTUM: |
||
9828 | printf("Frustum %g %g %g %g %g %g\n", |
||
9829 | n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f); |
||
9830 | break; |
||
9831 | case OPCODE_LINE_STIPPLE: |
||
9832 | printf("LineStipple %d %x\n", n[1].i, (int) n[2].us); |
||
9833 | break; |
||
9834 | case OPCODE_LOAD_IDENTITY: |
||
9835 | printf("LoadIdentity\n"); |
||
9836 | break; |
||
9837 | case OPCODE_LOAD_MATRIX: |
||
9838 | printf("LoadMatrix\n"); |
||
9839 | printf(" %8f %8f %8f %8f\n", |
||
9840 | n[1].f, n[5].f, n[9].f, n[13].f); |
||
9841 | printf(" %8f %8f %8f %8f\n", |
||
9842 | n[2].f, n[6].f, n[10].f, n[14].f); |
||
9843 | printf(" %8f %8f %8f %8f\n", |
||
9844 | n[3].f, n[7].f, n[11].f, n[15].f); |
||
9845 | printf(" %8f %8f %8f %8f\n", |
||
9846 | n[4].f, n[8].f, n[12].f, n[16].f); |
||
9847 | break; |
||
9848 | case OPCODE_MULT_MATRIX: |
||
9849 | printf("MultMatrix (or Rotate)\n"); |
||
9850 | printf(" %8f %8f %8f %8f\n", |
||
9851 | n[1].f, n[5].f, n[9].f, n[13].f); |
||
9852 | printf(" %8f %8f %8f %8f\n", |
||
9853 | n[2].f, n[6].f, n[10].f, n[14].f); |
||
9854 | printf(" %8f %8f %8f %8f\n", |
||
9855 | n[3].f, n[7].f, n[11].f, n[15].f); |
||
9856 | printf(" %8f %8f %8f %8f\n", |
||
9857 | n[4].f, n[8].f, n[12].f, n[16].f); |
||
9858 | break; |
||
9859 | case OPCODE_ORTHO: |
||
9860 | printf("Ortho %g %g %g %g %g %g\n", |
||
9861 | n[1].f, n[2].f, n[3].f, n[4].f, n[5].f, n[6].f); |
||
9862 | break; |
||
9863 | case OPCODE_POP_ATTRIB: |
||
9864 | printf("PopAttrib\n"); |
||
9865 | break; |
||
9866 | case OPCODE_POP_MATRIX: |
||
9867 | printf("PopMatrix\n"); |
||
9868 | break; |
||
9869 | case OPCODE_POP_NAME: |
||
9870 | printf("PopName\n"); |
||
9871 | break; |
||
9872 | case OPCODE_PUSH_ATTRIB: |
||
9873 | printf("PushAttrib %x\n", n[1].bf); |
||
9874 | break; |
||
9875 | case OPCODE_PUSH_MATRIX: |
||
9876 | printf("PushMatrix\n"); |
||
9877 | break; |
||
9878 | case OPCODE_PUSH_NAME: |
||
9879 | printf("PushName %d\n", (int) n[1].ui); |
||
9880 | break; |
||
9881 | case OPCODE_RASTER_POS: |
||
9882 | printf("RasterPos %g %g %g %g\n", |
||
9883 | n[1].f, n[2].f, n[3].f, n[4].f); |
||
9884 | break; |
||
9885 | case OPCODE_ROTATE: |
||
9886 | printf("Rotate %g %g %g %g\n", |
||
9887 | n[1].f, n[2].f, n[3].f, n[4].f); |
||
9888 | break; |
||
9889 | case OPCODE_SCALE: |
||
9890 | printf("Scale %g %g %g\n", n[1].f, n[2].f, n[3].f); |
||
9891 | break; |
||
9892 | case OPCODE_TRANSLATE: |
||
9893 | printf("Translate %g %g %g\n", n[1].f, n[2].f, n[3].f); |
||
9894 | break; |
||
9895 | case OPCODE_BIND_TEXTURE: |
||
9896 | printf("BindTexture %s %d\n", |
||
9897 | _mesa_lookup_enum_by_nr(n[1].ui), n[2].ui); |
||
9898 | break; |
||
9899 | case OPCODE_SHADE_MODEL: |
||
9900 | printf("ShadeModel %s\n", _mesa_lookup_enum_by_nr(n[1].ui)); |
||
9901 | break; |
||
9902 | case OPCODE_MAP1: |
||
9903 | printf("Map1 %s %.3f %.3f %d %d\n", |
||
9904 | _mesa_lookup_enum_by_nr(n[1].ui), |
||
9905 | n[2].f, n[3].f, n[4].i, n[5].i); |
||
9906 | break; |
||
9907 | case OPCODE_MAP2: |
||
9908 | printf("Map2 %s %.3f %.3f %.3f %.3f %d %d %d %d\n", |
||
9909 | _mesa_lookup_enum_by_nr(n[1].ui), |
||
9910 | n[2].f, n[3].f, n[4].f, n[5].f, |
||
9911 | n[6].i, n[7].i, n[8].i, n[9].i); |
||
9912 | break; |
||
9913 | case OPCODE_MAPGRID1: |
||
9914 | printf("MapGrid1 %d %.3f %.3f\n", n[1].i, n[2].f, n[3].f); |
||
9915 | break; |
||
9916 | case OPCODE_MAPGRID2: |
||
9917 | printf("MapGrid2 %d %.3f %.3f, %d %.3f %.3f\n", |
||
9918 | n[1].i, n[2].f, n[3].f, n[4].i, n[5].f, n[6].f); |
||
9919 | break; |
||
9920 | case OPCODE_EVALMESH1: |
||
9921 | printf("EvalMesh1 %d %d\n", n[1].i, n[2].i); |
||
9922 | break; |
||
9923 | case OPCODE_EVALMESH2: |
||
9924 | printf("EvalMesh2 %d %d %d %d\n", |
||
9925 | n[1].i, n[2].i, n[3].i, n[4].i); |
||
9926 | break; |
||
9927 | |||
9928 | case OPCODE_ATTR_1F_NV: |
||
9929 | printf("ATTR_1F_NV attr %d: %f\n", n[1].i, n[2].f); |
||
9930 | break; |
||
9931 | case OPCODE_ATTR_2F_NV: |
||
9932 | printf("ATTR_2F_NV attr %d: %f %f\n", |
||
9933 | n[1].i, n[2].f, n[3].f); |
||
9934 | break; |
||
9935 | case OPCODE_ATTR_3F_NV: |
||
9936 | printf("ATTR_3F_NV attr %d: %f %f %f\n", |
||
9937 | n[1].i, n[2].f, n[3].f, n[4].f); |
||
9938 | break; |
||
9939 | case OPCODE_ATTR_4F_NV: |
||
9940 | printf("ATTR_4F_NV attr %d: %f %f %f %f\n", |
||
9941 | n[1].i, n[2].f, n[3].f, n[4].f, n[5].f); |
||
9942 | break; |
||
9943 | case OPCODE_ATTR_1F_ARB: |
||
9944 | printf("ATTR_1F_ARB attr %d: %f\n", n[1].i, n[2].f); |
||
9945 | break; |
||
9946 | case OPCODE_ATTR_2F_ARB: |
||
9947 | printf("ATTR_2F_ARB attr %d: %f %f\n", |
||
9948 | n[1].i, n[2].f, n[3].f); |
||
9949 | break; |
||
9950 | case OPCODE_ATTR_3F_ARB: |
||
9951 | printf("ATTR_3F_ARB attr %d: %f %f %f\n", |
||
9952 | n[1].i, n[2].f, n[3].f, n[4].f); |
||
9953 | break; |
||
9954 | case OPCODE_ATTR_4F_ARB: |
||
9955 | printf("ATTR_4F_ARB attr %d: %f %f %f %f\n", |
||
9956 | n[1].i, n[2].f, n[3].f, n[4].f, n[5].f); |
||
9957 | break; |
||
9958 | |||
9959 | case OPCODE_MATERIAL: |
||
9960 | printf("MATERIAL %x %x: %f %f %f %f\n", |
||
9961 | n[1].i, n[2].i, n[3].f, n[4].f, n[5].f, n[6].f); |
||
9962 | break; |
||
9963 | case OPCODE_BEGIN: |
||
9964 | printf("BEGIN %x\n", n[1].i); |
||
9965 | break; |
||
9966 | case OPCODE_END: |
||
9967 | printf("END\n"); |
||
9968 | break; |
||
9969 | case OPCODE_RECTF: |
||
9970 | printf("RECTF %f %f %f %f\n", n[1].f, n[2].f, n[3].f, |
||
9971 | n[4].f); |
||
9972 | break; |
||
9973 | case OPCODE_EVAL_C1: |
||
9974 | printf("EVAL_C1 %f\n", n[1].f); |
||
9975 | break; |
||
9976 | case OPCODE_EVAL_C2: |
||
9977 | printf("EVAL_C2 %f %f\n", n[1].f, n[2].f); |
||
9978 | break; |
||
9979 | case OPCODE_EVAL_P1: |
||
9980 | printf("EVAL_P1 %d\n", n[1].i); |
||
9981 | break; |
||
9982 | case OPCODE_EVAL_P2: |
||
9983 | printf("EVAL_P2 %d %d\n", n[1].i, n[2].i); |
||
9984 | break; |
||
9985 | |||
9986 | case OPCODE_PROVOKING_VERTEX: |
||
9987 | printf("ProvokingVertex %s\n", |
||
9988 | _mesa_lookup_enum_by_nr(n[1].ui)); |
||
9989 | break; |
||
9990 | |||
9991 | /* |
||
9992 | * meta opcodes/commands |
||
9993 | */ |
||
9994 | case OPCODE_ERROR: |
||
9995 | printf("Error: %s %s\n", |
||
9996 | enum_string(n[1].e), (const char *) n[2].data); |
||
9997 | break; |
||
9998 | case OPCODE_CONTINUE: |
||
9999 | printf("DISPLAY-LIST-CONTINUE\n"); |
||
10000 | n = (Node *) n[1].next; |
||
10001 | break; |
||
10002 | case OPCODE_END_OF_LIST: |
||
10003 | printf("END-LIST %u\n", list); |
||
10004 | done = GL_TRUE; |
||
10005 | break; |
||
10006 | default: |
||
10007 | if (opcode < 0 || opcode > OPCODE_END_OF_LIST) { |
||
10008 | printf |
||
10009 | ("ERROR IN DISPLAY LIST: opcode = %d, address = %p\n", |
||
10010 | opcode, (void *) n); |
||
10011 | return; |
||
10012 | } |
||
10013 | else { |
||
10014 | printf("command %d, %u operands\n", opcode, |
||
10015 | InstSize[opcode]); |
||
10016 | } |
||
10017 | } |
||
10018 | /* increment n to point to next compiled command */ |
||
10019 | if (opcode != OPCODE_CONTINUE) { |
||
10020 | n += InstSize[opcode]; |
||
10021 | } |
||
10022 | } |
||
10023 | } |
||
10024 | } |
||
10025 | |||
10026 | |||
10027 | |||
10028 | /** |
||
10029 | * Clients may call this function to help debug display list problems. |
||
10030 | * This function is _ONLY_FOR_DEBUGGING_PURPOSES_. It may be removed, |
||
10031 | * changed, or break in the future without notice. |
||
10032 | */ |
||
10033 | void |
||
10034 | mesa_print_display_list(GLuint list) |
||
10035 | { |
||
10036 | GET_CURRENT_CONTEXT(ctx); |
||
10037 | print_list(ctx, list); |
||
10038 | } |
||
10039 | |||
10040 | |||
10041 | /**********************************************************************/ |
||
10042 | /***** Initialization *****/ |
||
10043 | /**********************************************************************/ |
||
10044 | |||
10045 | void |
||
10046 | _mesa_save_vtxfmt_init(GLvertexformat * vfmt) |
||
10047 | { |
||
10048 | _MESA_INIT_ARRAYELT_VTXFMT(vfmt, _ae_); |
||
10049 | |||
10050 | vfmt->Begin = save_Begin; |
||
10051 | |||
10052 | _MESA_INIT_DLIST_VTXFMT(vfmt, save_); |
||
10053 | |||
10054 | vfmt->Color3f = save_Color3f; |
||
10055 | vfmt->Color3fv = save_Color3fv; |
||
10056 | vfmt->Color4f = save_Color4f; |
||
10057 | vfmt->Color4fv = save_Color4fv; |
||
10058 | vfmt->EdgeFlag = save_EdgeFlag; |
||
10059 | vfmt->End = save_End; |
||
10060 | |||
10061 | _MESA_INIT_EVAL_VTXFMT(vfmt, save_); |
||
10062 | |||
10063 | vfmt->FogCoordfEXT = save_FogCoordfEXT; |
||
10064 | vfmt->FogCoordfvEXT = save_FogCoordfvEXT; |
||
10065 | vfmt->Indexf = save_Indexf; |
||
10066 | vfmt->Indexfv = save_Indexfv; |
||
10067 | vfmt->Materialfv = save_Materialfv; |
||
10068 | vfmt->MultiTexCoord1fARB = save_MultiTexCoord1f; |
||
10069 | vfmt->MultiTexCoord1fvARB = save_MultiTexCoord1fv; |
||
10070 | vfmt->MultiTexCoord2fARB = save_MultiTexCoord2f; |
||
10071 | vfmt->MultiTexCoord2fvARB = save_MultiTexCoord2fv; |
||
10072 | vfmt->MultiTexCoord3fARB = save_MultiTexCoord3f; |
||
10073 | vfmt->MultiTexCoord3fvARB = save_MultiTexCoord3fv; |
||
10074 | vfmt->MultiTexCoord4fARB = save_MultiTexCoord4f; |
||
10075 | vfmt->MultiTexCoord4fvARB = save_MultiTexCoord4fv; |
||
10076 | vfmt->Normal3f = save_Normal3f; |
||
10077 | vfmt->Normal3fv = save_Normal3fv; |
||
10078 | vfmt->SecondaryColor3fEXT = save_SecondaryColor3fEXT; |
||
10079 | vfmt->SecondaryColor3fvEXT = save_SecondaryColor3fvEXT; |
||
10080 | vfmt->TexCoord1f = save_TexCoord1f; |
||
10081 | vfmt->TexCoord1fv = save_TexCoord1fv; |
||
10082 | vfmt->TexCoord2f = save_TexCoord2f; |
||
10083 | vfmt->TexCoord2fv = save_TexCoord2fv; |
||
10084 | vfmt->TexCoord3f = save_TexCoord3f; |
||
10085 | vfmt->TexCoord3fv = save_TexCoord3fv; |
||
10086 | vfmt->TexCoord4f = save_TexCoord4f; |
||
10087 | vfmt->TexCoord4fv = save_TexCoord4fv; |
||
10088 | vfmt->Vertex2f = save_Vertex2f; |
||
10089 | vfmt->Vertex2fv = save_Vertex2fv; |
||
10090 | vfmt->Vertex3f = save_Vertex3f; |
||
10091 | vfmt->Vertex3fv = save_Vertex3fv; |
||
10092 | vfmt->Vertex4f = save_Vertex4f; |
||
10093 | vfmt->Vertex4fv = save_Vertex4fv; |
||
10094 | vfmt->VertexAttrib1fNV = save_VertexAttrib1fNV; |
||
10095 | vfmt->VertexAttrib1fvNV = save_VertexAttrib1fvNV; |
||
10096 | vfmt->VertexAttrib2fNV = save_VertexAttrib2fNV; |
||
10097 | vfmt->VertexAttrib2fvNV = save_VertexAttrib2fvNV; |
||
10098 | vfmt->VertexAttrib3fNV = save_VertexAttrib3fNV; |
||
10099 | vfmt->VertexAttrib3fvNV = save_VertexAttrib3fvNV; |
||
10100 | vfmt->VertexAttrib4fNV = save_VertexAttrib4fNV; |
||
10101 | vfmt->VertexAttrib4fvNV = save_VertexAttrib4fvNV; |
||
10102 | vfmt->VertexAttrib1fARB = save_VertexAttrib1fARB; |
||
10103 | vfmt->VertexAttrib1fvARB = save_VertexAttrib1fvARB; |
||
10104 | vfmt->VertexAttrib2fARB = save_VertexAttrib2fARB; |
||
10105 | vfmt->VertexAttrib2fvARB = save_VertexAttrib2fvARB; |
||
10106 | vfmt->VertexAttrib3fARB = save_VertexAttrib3fARB; |
||
10107 | vfmt->VertexAttrib3fvARB = save_VertexAttrib3fvARB; |
||
10108 | vfmt->VertexAttrib4fARB = save_VertexAttrib4fARB; |
||
10109 | vfmt->VertexAttrib4fvARB = save_VertexAttrib4fvARB; |
||
10110 | |||
10111 | vfmt->Rectf = save_Rectf; |
||
10112 | |||
10113 | /* The driver is required to implement these as |
||
10114 | * 1) They can probably do a better job. |
||
10115 | * 2) A lot of new mechanisms would have to be added to this module |
||
10116 | * to support it. That code would probably never get used, |
||
10117 | * because of (1). |
||
10118 | */ |
||
10119 | #if 0 |
||
10120 | vfmt->DrawArrays = 0; |
||
10121 | vfmt->DrawElements = 0; |
||
10122 | vfmt->DrawRangeElements = 0; |
||
10123 | vfmt->MultiDrawElemementsEXT = 0; |
||
10124 | vfmt->DrawElementsBaseVertex = 0; |
||
10125 | vfmt->DrawRangeElementsBaseVertex = 0; |
||
10126 | vfmt->MultiDrawElemementsBaseVertex = 0; |
||
10127 | #endif |
||
10128 | } |
||
10129 | |||
10130 | |||
10131 | void |
||
10132 | _mesa_install_dlist_vtxfmt(struct _glapi_table *disp, |
||
10133 | const GLvertexformat *vfmt) |
||
10134 | { |
||
10135 | SET_CallList(disp, vfmt->CallList); |
||
10136 | SET_CallLists(disp, vfmt->CallLists); |
||
10137 | } |
||
10138 | |||
10139 | |||
10140 | void _mesa_init_dlist_dispatch(struct _glapi_table *disp) |
||
10141 | { |
||
10142 | SET_CallList(disp, _mesa_CallList); |
||
10143 | SET_CallLists(disp, _mesa_CallLists); |
||
10144 | |||
10145 | SET_DeleteLists(disp, _mesa_DeleteLists); |
||
10146 | SET_EndList(disp, _mesa_EndList); |
||
10147 | SET_GenLists(disp, _mesa_GenLists); |
||
10148 | SET_IsList(disp, _mesa_IsList); |
||
10149 | SET_ListBase(disp, _mesa_ListBase); |
||
10150 | SET_NewList(disp, _mesa_NewList); |
||
10151 | } |
||
10152 | |||
10153 | |||
10154 | #endif /* FEATURE_dlist */ |
||
10155 | |||
10156 | |||
10157 | /** |
||
10158 | * Initialize display list state for given context. |
||
10159 | */ |
||
10160 | void |
||
10161 | _mesa_init_display_list(struct gl_context *ctx) |
||
10162 | { |
||
10163 | static GLboolean tableInitialized = GL_FALSE; |
||
10164 | |||
10165 | /* zero-out the instruction size table, just once */ |
||
10166 | if (!tableInitialized) { |
||
10167 | memset(InstSize, 0, sizeof(InstSize)); |
||
10168 | tableInitialized = GL_TRUE; |
||
10169 | } |
||
10170 | |||
10171 | /* extension info */ |
||
10172 | ctx->ListExt = CALLOC_STRUCT(gl_list_extensions); |
||
10173 | |||
10174 | /* Display list */ |
||
10175 | ctx->ListState.CallDepth = 0; |
||
10176 | ctx->ExecuteFlag = GL_TRUE; |
||
10177 | ctx->CompileFlag = GL_FALSE; |
||
10178 | ctx->ListState.CurrentBlock = NULL; |
||
10179 | ctx->ListState.CurrentPos = 0; |
||
10180 | |||
10181 | /* Display List group */ |
||
10182 | ctx->List.ListBase = 0; |
||
10183 | |||
10184 | #if FEATURE_dlist |
||
10185 | _mesa_save_vtxfmt_init(&ctx->ListState.ListVtxfmt); |
||
10186 | #endif |
||
10187 | } |
||
10188 | |||
10189 | |||
10190 | void |
||
10191 | _mesa_free_display_list_data(struct gl_context *ctx) |
||
10192 | { |
||
10193 | free(ctx->ListExt); |
||
10194 | ctx->ListExt = NULL; |
||
10195 | }>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><>><>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=>=> |