OSDN Git Service

mesa: allow drivers not to expose ARB_color_buffer_float in GL core profile
[android-x86/external-mesa.git] / src / mesa / main / get.c
1 /*
2  * Copyright (C) 2010  Brian Paul   All Rights Reserved.
3  * Copyright (C) 2010  Intel Corporation
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included
13  * in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * Author: Kristian Høgsberg <krh@bitplanet.net>
23  */
24
25 #include "glheader.h"
26 #include "context.h"
27 #include "blend.h"
28 #include "enable.h"
29 #include "enums.h"
30 #include "extensions.h"
31 #include "get.h"
32 #include "macros.h"
33 #include "mfeatures.h"
34 #include "mtypes.h"
35 #include "state.h"
36 #include "texcompress.h"
37 #include "framebuffer.h"
38 #include "samplerobj.h"
39
40 /* This is a table driven implemetation of the glGet*v() functions.
41  * The basic idea is that most getters just look up an int somewhere
42  * in struct gl_context and then convert it to a bool or float according to
43  * which of glGetIntegerv() glGetBooleanv() etc is being called.
44  * Instead of generating code to do this, we can just record the enum
45  * value and the offset into struct gl_context in an array of structs.  Then
46  * in glGet*(), we lookup the struct for the enum in question, and use
47  * the offset to get the int we need.
48  *
49  * Sometimes we need to look up a float, a boolean, a bit in a
50  * bitfield, a matrix or other types instead, so we need to track the
51  * type of the value in struct gl_context.  And sometimes the value isn't in
52  * struct gl_context but in the drawbuffer, the array object, current texture
53  * unit, or maybe it's a computed value.  So we need to also track
54  * where or how to find the value.  Finally, we sometimes need to
55  * check that one of a number of extensions are enabled, the GL
56  * version or flush or call _mesa_update_state().  This is done by
57  * attaching optional extra information to the value description
58  * struct, it's sort of like an array of opcodes that describe extra
59  * checks or actions.
60  *
61  * Putting all this together we end up with struct value_desc below,
62  * and with a couple of macros to help, the table of struct value_desc
63  * is about as concise as the specification in the old python script.
64  */
65
66 #define FLOAT_TO_BOOLEAN(X)   ( (X) ? GL_TRUE : GL_FALSE )
67 #define FLOAT_TO_FIXED(F)     ( ((F) * 65536.0f > INT_MAX) ? INT_MAX : \
68                                 ((F) * 65536.0f < INT_MIN) ? INT_MIN : \
69                                 (GLint) ((F) * 65536.0f) )
70
71 #define INT_TO_BOOLEAN(I)     ( (I) ? GL_TRUE : GL_FALSE )
72 #define INT_TO_FIXED(I)       ( ((I) > SHRT_MAX) ? INT_MAX : \
73                                 ((I) < SHRT_MIN) ? INT_MIN : \
74                                 (GLint) ((I) * 65536) )
75
76 #define INT64_TO_BOOLEAN(I)   ( (I) ? GL_TRUE : GL_FALSE )
77 #define INT64_TO_INT(I)       ( (GLint)((I > INT_MAX) ? INT_MAX : ((I < INT_MIN) ? INT_MIN : (I))) )
78
79 #define BOOLEAN_TO_INT(B)     ( (GLint) (B) )
80 #define BOOLEAN_TO_INT64(B)   ( (GLint64) (B) )
81 #define BOOLEAN_TO_FLOAT(B)   ( (B) ? 1.0F : 0.0F )
82 #define BOOLEAN_TO_FIXED(B)   ( (GLint) ((B) ? 1 : 0) << 16 )
83
84 #define ENUM_TO_INT64(E)      ( (GLint64) (E) )
85 #define ENUM_TO_FIXED(E)      (E)
86
87 enum value_type {
88    TYPE_INVALID,
89    TYPE_INT,
90    TYPE_INT_2,
91    TYPE_INT_3,
92    TYPE_INT_4,
93    TYPE_INT_N,
94    TYPE_INT64,
95    TYPE_ENUM,
96    TYPE_ENUM_2,
97    TYPE_BOOLEAN,
98    TYPE_BIT_0,
99    TYPE_BIT_1,
100    TYPE_BIT_2,
101    TYPE_BIT_3,
102    TYPE_BIT_4,
103    TYPE_BIT_5,
104    TYPE_BIT_6,
105    TYPE_BIT_7,
106    TYPE_FLOAT,
107    TYPE_FLOAT_2,
108    TYPE_FLOAT_3,
109    TYPE_FLOAT_4,
110    TYPE_FLOATN,
111    TYPE_FLOATN_2,
112    TYPE_FLOATN_3,
113    TYPE_FLOATN_4,
114    TYPE_DOUBLEN,
115    TYPE_MATRIX,
116    TYPE_MATRIX_T,
117    TYPE_CONST
118 };
119
120 enum value_location {
121    LOC_BUFFER,
122    LOC_CONTEXT,
123    LOC_ARRAY,
124    LOC_TEXUNIT,
125    LOC_CUSTOM
126 };
127
128 enum value_extra {
129    EXTRA_END = 0x8000,
130    EXTRA_VERSION_30,
131    EXTRA_VERSION_31,
132    EXTRA_VERSION_32,
133    EXTRA_API_GL,
134    EXTRA_API_GL_CORE,
135    EXTRA_API_ES2,
136    EXTRA_API_ES3,
137    EXTRA_NEW_BUFFERS, 
138    EXTRA_NEW_FRAG_CLAMP,
139    EXTRA_VALID_DRAW_BUFFER,
140    EXTRA_VALID_TEXTURE_UNIT,
141    EXTRA_VALID_CLIP_DISTANCE,
142    EXTRA_FLUSH_CURRENT,
143    EXTRA_GLSL_130,
144 };
145
146 #define NO_EXTRA NULL
147 #define NO_OFFSET 0
148
149 struct value_desc {
150    GLenum pname;
151    GLubyte location;  /**< enum value_location */
152    GLubyte type;      /**< enum value_type */
153    int offset;
154    const int *extra;
155 };
156
157 union value {
158    GLfloat value_float;
159    GLfloat value_float_4[4];
160    GLmatrix *value_matrix;
161    GLint value_int;
162    GLint value_int_4[4];
163    GLint64 value_int64;
164    GLenum value_enum;
165
166    /* Sigh, see GL_COMPRESSED_TEXTURE_FORMATS_ARB handling */
167    struct {
168       GLint n, ints[100];
169    } value_int_n;
170    GLboolean value_bool;
171 };
172
173 #define BUFFER_FIELD(field, type) \
174    LOC_BUFFER, type, offsetof(struct gl_framebuffer, field)
175 #define CONTEXT_FIELD(field, type) \
176    LOC_CONTEXT, type, offsetof(struct gl_context, field)
177 #define ARRAY_FIELD(field, type) \
178    LOC_ARRAY, type, offsetof(struct gl_array_object, field)
179 #undef CONST /* already defined through windows.h */
180 #define CONST(value) \
181    LOC_CONTEXT, TYPE_CONST, value
182
183 #define BUFFER_INT(field) BUFFER_FIELD(field, TYPE_INT)
184 #define BUFFER_ENUM(field) BUFFER_FIELD(field, TYPE_ENUM)
185 #define BUFFER_BOOL(field) BUFFER_FIELD(field, TYPE_BOOLEAN)
186
187 #define CONTEXT_INT(field) CONTEXT_FIELD(field, TYPE_INT)
188 #define CONTEXT_INT2(field) CONTEXT_FIELD(field, TYPE_INT_2)
189 #define CONTEXT_INT64(field) CONTEXT_FIELD(field, TYPE_INT64)
190 #define CONTEXT_ENUM(field) CONTEXT_FIELD(field, TYPE_ENUM)
191 #define CONTEXT_ENUM2(field) CONTEXT_FIELD(field, TYPE_ENUM_2)
192 #define CONTEXT_BOOL(field) CONTEXT_FIELD(field, TYPE_BOOLEAN)
193 #define CONTEXT_BIT0(field) CONTEXT_FIELD(field, TYPE_BIT_0)
194 #define CONTEXT_BIT1(field) CONTEXT_FIELD(field, TYPE_BIT_1)
195 #define CONTEXT_BIT2(field) CONTEXT_FIELD(field, TYPE_BIT_2)
196 #define CONTEXT_BIT3(field) CONTEXT_FIELD(field, TYPE_BIT_3)
197 #define CONTEXT_BIT4(field) CONTEXT_FIELD(field, TYPE_BIT_4)
198 #define CONTEXT_BIT5(field) CONTEXT_FIELD(field, TYPE_BIT_5)
199 #define CONTEXT_BIT6(field) CONTEXT_FIELD(field, TYPE_BIT_6)
200 #define CONTEXT_BIT7(field) CONTEXT_FIELD(field, TYPE_BIT_7)
201 #define CONTEXT_FLOAT(field) CONTEXT_FIELD(field, TYPE_FLOAT)
202 #define CONTEXT_FLOAT2(field) CONTEXT_FIELD(field, TYPE_FLOAT_2)
203 #define CONTEXT_FLOAT3(field) CONTEXT_FIELD(field, TYPE_FLOAT_3)
204 #define CONTEXT_FLOAT4(field) CONTEXT_FIELD(field, TYPE_FLOAT_4)
205 #define CONTEXT_MATRIX(field) CONTEXT_FIELD(field, TYPE_MATRIX)
206 #define CONTEXT_MATRIX_T(field) CONTEXT_FIELD(field, TYPE_MATRIX_T)
207
208 #define ARRAY_INT(field) ARRAY_FIELD(field, TYPE_INT)
209 #define ARRAY_ENUM(field) ARRAY_FIELD(field, TYPE_ENUM)
210 #define ARRAY_BOOL(field) ARRAY_FIELD(field, TYPE_BOOLEAN)
211
212 #define EXT(f)                                  \
213    offsetof(struct gl_extensions, f)
214
215 #define EXTRA_EXT(e)                            \
216    static const int extra_##e[] = {             \
217       EXT(e), EXTRA_END                         \
218    }
219
220 #define EXTRA_EXT2(e1, e2)                      \
221    static const int extra_##e1##_##e2[] = {     \
222       EXT(e1), EXT(e2), EXTRA_END               \
223    }
224
225 /* The 'extra' mechanism is a way to specify extra checks (such as
226  * extensions or specific gl versions) or actions (flush current, new
227  * buffers) that we need to do before looking up an enum.  We need to
228  * declare them all up front so we can refer to them in the value_desc
229  * structs below. */
230
231 static const int extra_new_buffers[] = {
232    EXTRA_NEW_BUFFERS,
233    EXTRA_END
234 };
235
236 static const int extra_new_frag_clamp[] = {
237    EXTRA_NEW_FRAG_CLAMP,
238    EXTRA_END
239 };
240
241 static const int extra_valid_draw_buffer[] = {
242    EXTRA_VALID_DRAW_BUFFER,
243    EXTRA_END
244 };
245
246 static const int extra_valid_texture_unit[] = {
247    EXTRA_VALID_TEXTURE_UNIT,
248    EXTRA_END
249 };
250
251 static const int extra_valid_clip_distance[] = {
252    EXTRA_VALID_CLIP_DISTANCE,
253    EXTRA_END
254 };
255
256 static const int extra_flush_current_valid_texture_unit[] = {
257    EXTRA_FLUSH_CURRENT,
258    EXTRA_VALID_TEXTURE_UNIT,
259    EXTRA_END
260 };
261
262 static const int extra_flush_current[] = {
263    EXTRA_FLUSH_CURRENT,
264    EXTRA_END
265 };
266
267 static const int extra_EXT_secondary_color_flush_current[] = {
268    EXT(EXT_secondary_color),
269    EXTRA_FLUSH_CURRENT,
270    EXTRA_END
271 };
272
273 static const int extra_EXT_fog_coord_flush_current[] = {
274    EXT(EXT_fog_coord),
275    EXTRA_FLUSH_CURRENT,
276    EXTRA_END
277 };
278
279 static const int extra_EXT_texture_integer[] = {
280    EXT(EXT_texture_integer),
281    EXTRA_END
282 };
283
284 static const int extra_GLSL_130[] = {
285    EXTRA_GLSL_130,
286    EXTRA_END
287 };
288
289 static const int extra_texture_buffer_object[] = {
290    EXTRA_API_GL_CORE,
291    EXTRA_VERSION_31,
292    EXT(ARB_texture_buffer_object),
293    EXTRA_END
294 };
295
296 static const int extra_ARB_transform_feedback2_api_es3[] = {
297    EXT(ARB_transform_feedback2),
298    EXTRA_API_ES3,
299    EXTRA_END
300 };
301
302 static const int extra_ARB_uniform_buffer_object_and_geometry_shader[] = {
303    EXT(ARB_uniform_buffer_object),
304    EXT(ARB_geometry_shader4),
305    EXTRA_END
306 };
307
308 static const int extra_ARB_ES2_compatibility_api_es2[] = {
309    EXT(ARB_ES2_compatibility),
310    EXTRA_API_ES2,
311    EXTRA_END
312 };
313
314 static const int extra_ARB_ES3_compatibility_api_es3[] = {
315    EXT(ARB_ES3_compatibility),
316    EXTRA_API_ES3,
317    EXTRA_END
318 };
319
320 EXTRA_EXT(ARB_texture_cube_map);
321 EXTRA_EXT(MESA_texture_array);
322 EXTRA_EXT2(EXT_secondary_color, ARB_vertex_program);
323 EXTRA_EXT(EXT_secondary_color);
324 EXTRA_EXT(EXT_fog_coord);
325 EXTRA_EXT(NV_fog_distance);
326 EXTRA_EXT(EXT_texture_filter_anisotropic);
327 EXTRA_EXT(NV_point_sprite);
328 EXTRA_EXT(NV_texture_rectangle);
329 EXTRA_EXT(EXT_stencil_two_side);
330 EXTRA_EXT(EXT_depth_bounds_test);
331 EXTRA_EXT(ARB_depth_clamp);
332 EXTRA_EXT(ATI_fragment_shader);
333 EXTRA_EXT(EXT_framebuffer_blit);
334 EXTRA_EXT(ARB_shader_objects);
335 EXTRA_EXT(EXT_provoking_vertex);
336 EXTRA_EXT(ARB_fragment_shader);
337 EXTRA_EXT(ARB_fragment_program);
338 EXTRA_EXT2(ARB_framebuffer_object, EXT_framebuffer_multisample);
339 EXTRA_EXT(EXT_framebuffer_object);
340 EXTRA_EXT(ARB_seamless_cube_map);
341 EXTRA_EXT(ARB_sync);
342 EXTRA_EXT(ARB_vertex_shader);
343 EXTRA_EXT(EXT_transform_feedback);
344 EXTRA_EXT(ARB_transform_feedback3);
345 EXTRA_EXT(EXT_pixel_buffer_object);
346 EXTRA_EXT(ARB_vertex_program);
347 EXTRA_EXT2(NV_point_sprite, ARB_point_sprite);
348 EXTRA_EXT2(ARB_vertex_program, ARB_fragment_program);
349 EXTRA_EXT(ARB_geometry_shader4);
350 EXTRA_EXT(ARB_color_buffer_float);
351 EXTRA_EXT(EXT_framebuffer_sRGB);
352 EXTRA_EXT(OES_EGL_image_external);
353 EXTRA_EXT(ARB_blend_func_extended);
354 EXTRA_EXT(ARB_uniform_buffer_object);
355 EXTRA_EXT(ARB_timer_query);
356 EXTRA_EXT(ARB_map_buffer_alignment);
357 EXTRA_EXT(ARB_texture_cube_map_array);
358 EXTRA_EXT(ARB_texture_buffer_range);
359 EXTRA_EXT(ARB_texture_multisample);
360
361 static const int
362 extra_ARB_color_buffer_float_or_glcore[] = {
363    EXT(ARB_color_buffer_float),
364    EXTRA_API_GL_CORE,
365    EXTRA_END
366 };
367
368 static const int
369 extra_NV_primitive_restart[] = {
370    EXT(NV_primitive_restart),
371    EXTRA_END
372 };
373
374 static const int extra_version_30[] = { EXTRA_VERSION_30, EXTRA_END };
375 static const int extra_version_31[] = { EXTRA_VERSION_31, EXTRA_END };
376 static const int extra_version_32[] = { EXTRA_VERSION_32, EXTRA_END };
377
378 static const int extra_gl30_es3[] = {
379     EXTRA_VERSION_30,
380     EXTRA_API_ES3,
381     EXTRA_END,
382 };
383
384 static const int
385 extra_ARB_vertex_program_api_es2[] = {
386    EXT(ARB_vertex_program),
387    EXTRA_API_ES2,
388    EXTRA_END
389 };
390
391 /* The ReadBuffer get token is valid under either full GL or under
392  * GLES2 if the NV_read_buffer extension is available. */
393 static const int
394 extra_NV_read_buffer_api_gl[] = {
395    EXTRA_API_ES2,
396    EXTRA_API_GL,
397    EXTRA_END
398 };
399
400 /* This is the big table describing all the enums we accept in
401  * glGet*v().  The table is partitioned into six parts: enums
402  * understood by all GL APIs (OpenGL, GLES and GLES2), enums shared
403  * between OpenGL and GLES, enums exclusive to GLES, etc for the
404  * remaining combinations. To look up the enums valid in a given API
405  * we will use a hash table specific to that API. These tables are in
406  * turn generated at build time and included through get_hash.h.
407  * The different sections are guarded by #if FEATURE_GL etc to make
408  * sure we only compile in the enums we may need. */
409
410 #include "get_hash.h"
411
412 /* All we need now is a way to look up the value struct from the enum.
413  * The code generated by gcc for the old generated big switch
414  * statement is a big, balanced, open coded if/else tree, essentially
415  * an unrolled binary search.  It would be natural to sort the new
416  * enum table and use bsearch(), but we will use a read-only hash
417  * table instead.  bsearch() has a nice guaranteed worst case
418  * performance, but we're also guaranteed to hit that worst case
419  * (log2(n) iterations) for about half the enums.  Instead, using an
420  * open addressing hash table, we can find the enum on the first try
421  * for 80% of the enums, 1 collision for 10% and never more than 5
422  * collisions for any enum (typical numbers).  And the code is very
423  * simple, even though it feels a little magic. */
424
425 #ifdef GET_DEBUG
426 static void
427 print_table_stats(int api)
428 {
429    int i, j, collisions[11], count, hash, mask;
430    const struct value_desc *d;
431    const char *api_names[] = {
432       [API_OPENGL_COMPAT] = "GL",
433       [API_OPENGL_CORE] = "GL_CORE",
434       [API_OPENGLES] = "GLES",
435       [API_OPENGLES2] = "GLES2",
436    };
437    const char *api_name;
438
439    api_name = api < Elements(api_names) ? api_names[api] : "N/A";
440    count = 0;
441    mask = Elements(table(api)) - 1;
442    memset(collisions, 0, sizeof collisions);
443
444    for (i = 0; i < Elements(table(api)); i++) {
445       if (!table(api)[i])
446          continue;
447       count++;
448       d = &values[table(api)[i]];
449       hash = (d->pname * prime_factor);
450       j = 0;
451       while (1) {
452          if (values[table(api)[hash & mask]].pname == d->pname)
453             break;
454          hash += prime_step;
455          j++;
456       }
457
458       if (j < 10)
459          collisions[j]++;
460       else
461          collisions[10]++;
462    }
463
464    printf("number of enums for %s: %d (total %ld)\n",
465          api_name, count, Elements(values));
466    for (i = 0; i < Elements(collisions) - 1; i++)
467       if (collisions[i] > 0)
468          printf("  %d enums with %d %scollisions\n",
469                collisions[i], i, i == 10 ? "or more " : "");
470 }
471 #endif
472
473 /**
474  * Initialize the enum hash for a given API 
475  *
476  * This is called from one_time_init() to insert the enum values that
477  * are valid for the API in question into the enum hash table.
478  *
479  * \param the current context, for determining the API in question
480  */
481 void _mesa_init_get_hash(struct gl_context *ctx)
482 {
483 #ifdef GET_DEBUG
484    print_table_stats();
485 #endif
486 }
487
488 /**
489  * Handle irregular enums
490  *
491  * Some values don't conform to the "well-known type at context
492  * pointer + offset" pattern, so we have this function to catch all
493  * the corner cases.  Typically, it's a computed value or a one-off
494  * pointer to a custom struct or something.
495  *
496  * In this case we can't return a pointer to the value, so we'll have
497  * to use the temporary variable 'v' declared back in the calling
498  * glGet*v() function to store the result.
499  *
500  * \param ctx the current context
501  * \param d the struct value_desc that describes the enum
502  * \param v pointer to the tmp declared in the calling glGet*v() function
503  */
504 static void
505 find_custom_value(struct gl_context *ctx, const struct value_desc *d, union value *v)
506 {
507    struct gl_buffer_object **buffer_obj;
508    struct gl_client_array *array;
509    GLuint unit, *p;
510
511    switch (d->pname) {
512    case GL_MAJOR_VERSION:
513       v->value_int = ctx->Version / 10;
514       break;
515    case GL_MINOR_VERSION:
516       v->value_int = ctx->Version % 10;
517       break;
518
519    case GL_TEXTURE_1D:
520    case GL_TEXTURE_2D:
521    case GL_TEXTURE_3D:
522    case GL_TEXTURE_1D_ARRAY_EXT:
523    case GL_TEXTURE_2D_ARRAY_EXT:
524    case GL_TEXTURE_CUBE_MAP_ARB:
525    case GL_TEXTURE_RECTANGLE_NV:
526    case GL_TEXTURE_EXTERNAL_OES:
527       v->value_bool = _mesa_IsEnabled(d->pname);
528       break;
529
530    case GL_LINE_STIPPLE_PATTERN:
531       /* This is the only GLushort, special case it here by promoting
532        * to an int rather than introducing a new type. */
533       v->value_int = ctx->Line.StipplePattern;
534       break;
535
536    case GL_CURRENT_RASTER_TEXTURE_COORDS:
537       unit = ctx->Texture.CurrentUnit;
538       v->value_float_4[0] = ctx->Current.RasterTexCoords[unit][0];
539       v->value_float_4[1] = ctx->Current.RasterTexCoords[unit][1];
540       v->value_float_4[2] = ctx->Current.RasterTexCoords[unit][2];
541       v->value_float_4[3] = ctx->Current.RasterTexCoords[unit][3];
542       break;
543
544    case GL_CURRENT_TEXTURE_COORDS:
545       unit = ctx->Texture.CurrentUnit;
546       v->value_float_4[0] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][0];
547       v->value_float_4[1] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][1];
548       v->value_float_4[2] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][2];
549       v->value_float_4[3] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][3];
550       break;
551
552    case GL_COLOR_WRITEMASK:
553       v->value_int_4[0] = ctx->Color.ColorMask[0][RCOMP] ? 1 : 0;
554       v->value_int_4[1] = ctx->Color.ColorMask[0][GCOMP] ? 1 : 0;
555       v->value_int_4[2] = ctx->Color.ColorMask[0][BCOMP] ? 1 : 0;
556       v->value_int_4[3] = ctx->Color.ColorMask[0][ACOMP] ? 1 : 0;
557       break;
558
559    case GL_EDGE_FLAG:
560       v->value_bool = ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG][0] == 1.0;
561       break;
562
563    case GL_READ_BUFFER:
564       v->value_enum = ctx->ReadBuffer->ColorReadBuffer;
565       break;
566
567    case GL_MAP2_GRID_DOMAIN:
568       v->value_float_4[0] = ctx->Eval.MapGrid2u1;
569       v->value_float_4[1] = ctx->Eval.MapGrid2u2;
570       v->value_float_4[2] = ctx->Eval.MapGrid2v1;
571       v->value_float_4[3] = ctx->Eval.MapGrid2v2;
572       break;
573
574    case GL_TEXTURE_STACK_DEPTH:
575       unit = ctx->Texture.CurrentUnit;
576       v->value_int = ctx->TextureMatrixStack[unit].Depth + 1;
577       break;
578    case GL_TEXTURE_MATRIX:
579       unit = ctx->Texture.CurrentUnit;
580       v->value_matrix = ctx->TextureMatrixStack[unit].Top;
581       break;
582
583    case GL_TEXTURE_COORD_ARRAY:
584    case GL_TEXTURE_COORD_ARRAY_SIZE:
585    case GL_TEXTURE_COORD_ARRAY_TYPE:
586    case GL_TEXTURE_COORD_ARRAY_STRIDE:
587       array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)];
588       v->value_int = *(GLuint *) ((char *) array + d->offset);
589       break;
590
591    case GL_ACTIVE_TEXTURE_ARB:
592       v->value_int = GL_TEXTURE0_ARB + ctx->Texture.CurrentUnit;
593       break;
594    case GL_CLIENT_ACTIVE_TEXTURE_ARB:
595       v->value_int = GL_TEXTURE0_ARB + ctx->Array.ActiveTexture;
596       break;
597
598    case GL_MODELVIEW_STACK_DEPTH:
599    case GL_PROJECTION_STACK_DEPTH:
600       v->value_int = *(GLint *) ((char *) ctx + d->offset) + 1;
601       break;
602
603    case GL_MAX_TEXTURE_SIZE:
604    case GL_MAX_3D_TEXTURE_SIZE:
605    case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:
606       p = (GLuint *) ((char *) ctx + d->offset);
607       v->value_int = 1 << (*p - 1);
608       break;
609
610    case GL_SCISSOR_BOX:
611       v->value_int_4[0] = ctx->Scissor.X;
612       v->value_int_4[1] = ctx->Scissor.Y;
613       v->value_int_4[2] = ctx->Scissor.Width;
614       v->value_int_4[3] = ctx->Scissor.Height;
615       break;
616
617    case GL_LIST_INDEX:
618       v->value_int =
619          ctx->ListState.CurrentList ? ctx->ListState.CurrentList->Name : 0;
620       break;
621    case GL_LIST_MODE:
622       if (!ctx->CompileFlag)
623          v->value_enum = 0;
624       else if (ctx->ExecuteFlag)
625          v->value_enum = GL_COMPILE_AND_EXECUTE;
626       else
627          v->value_enum = GL_COMPILE;
628       break;
629
630    case GL_VIEWPORT:
631       v->value_int_4[0] = ctx->Viewport.X;
632       v->value_int_4[1] = ctx->Viewport.Y;
633       v->value_int_4[2] = ctx->Viewport.Width;
634       v->value_int_4[3] = ctx->Viewport.Height;
635       break;
636
637    case GL_ACTIVE_STENCIL_FACE_EXT:
638       v->value_enum = ctx->Stencil.ActiveFace ? GL_BACK : GL_FRONT;
639       break;
640
641    case GL_STENCIL_FAIL:
642       v->value_enum = ctx->Stencil.FailFunc[ctx->Stencil.ActiveFace];
643       break;
644    case GL_STENCIL_FUNC:
645       v->value_enum = ctx->Stencil.Function[ctx->Stencil.ActiveFace];
646       break;
647    case GL_STENCIL_PASS_DEPTH_FAIL:
648       v->value_enum = ctx->Stencil.ZFailFunc[ctx->Stencil.ActiveFace];
649       break;
650    case GL_STENCIL_PASS_DEPTH_PASS:
651       v->value_enum = ctx->Stencil.ZPassFunc[ctx->Stencil.ActiveFace];
652       break;
653    case GL_STENCIL_REF:
654       v->value_int = ctx->Stencil.Ref[ctx->Stencil.ActiveFace];
655       break;
656    case GL_STENCIL_VALUE_MASK:
657       v->value_int = ctx->Stencil.ValueMask[ctx->Stencil.ActiveFace];
658       break;
659    case GL_STENCIL_WRITEMASK:
660       v->value_int = ctx->Stencil.WriteMask[ctx->Stencil.ActiveFace];
661       break;
662
663    case GL_NUM_EXTENSIONS:
664       v->value_int = _mesa_get_extension_count(ctx);
665       break;
666
667    case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
668       v->value_int = _mesa_get_color_read_type(ctx);
669       break;
670    case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
671       v->value_int = _mesa_get_color_read_format(ctx);
672       break;
673
674    case GL_CURRENT_MATRIX_STACK_DEPTH_ARB:
675       v->value_int = ctx->CurrentStack->Depth + 1;
676       break;
677    case GL_CURRENT_MATRIX_ARB:
678    case GL_TRANSPOSE_CURRENT_MATRIX_ARB:
679       v->value_matrix = ctx->CurrentStack->Top;
680       break;
681
682    case GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB:
683       v->value_int = _mesa_get_compressed_formats(ctx, NULL);
684       break;
685    case GL_COMPRESSED_TEXTURE_FORMATS_ARB:
686       v->value_int_n.n = 
687          _mesa_get_compressed_formats(ctx, v->value_int_n.ints);
688       ASSERT(v->value_int_n.n <= 100);
689       break;
690
691    case GL_MAX_VARYING_FLOATS_ARB:
692       v->value_int = ctx->Const.MaxVarying * 4;
693       break;
694
695    /* Various object names */
696
697    case GL_TEXTURE_BINDING_1D:
698    case GL_TEXTURE_BINDING_2D:
699    case GL_TEXTURE_BINDING_3D:
700    case GL_TEXTURE_BINDING_1D_ARRAY_EXT:
701    case GL_TEXTURE_BINDING_2D_ARRAY_EXT:
702    case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
703    case GL_TEXTURE_BINDING_RECTANGLE_NV:
704    case GL_TEXTURE_BINDING_EXTERNAL_OES:
705    case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
706    case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
707    case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
708       unit = ctx->Texture.CurrentUnit;
709       v->value_int =
710          ctx->Texture.Unit[unit].CurrentTex[d->offset]->Name;
711       break;
712
713    /* GL_ARB_vertex_buffer_object */
714    case GL_VERTEX_ARRAY_BUFFER_BINDING_ARB:
715    case GL_NORMAL_ARRAY_BUFFER_BINDING_ARB:
716    case GL_COLOR_ARRAY_BUFFER_BINDING_ARB:
717    case GL_INDEX_ARRAY_BUFFER_BINDING_ARB:
718    case GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB:
719    case GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB:
720    case GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB:
721       buffer_obj = (struct gl_buffer_object **)
722          ((char *) ctx->Array.ArrayObj + d->offset);
723       v->value_int = (*buffer_obj)->Name;
724       break;
725    case GL_ARRAY_BUFFER_BINDING_ARB:
726       v->value_int = ctx->Array.ArrayBufferObj->Name;
727       break;
728    case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB:
729       v->value_int =
730          ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].BufferObj->Name;
731       break;
732    case GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB:
733       v->value_int = ctx->Array.ArrayObj->ElementArrayBufferObj->Name;
734       break;
735
736    /* ARB_copy_buffer */
737    case GL_COPY_READ_BUFFER:
738       v->value_int = ctx->CopyReadBuffer->Name;
739       break;
740    case GL_COPY_WRITE_BUFFER:
741       v->value_int = ctx->CopyWriteBuffer->Name;
742       break;
743
744    case GL_PIXEL_PACK_BUFFER_BINDING_EXT:
745       v->value_int = ctx->Pack.BufferObj->Name;
746       break;
747    case GL_PIXEL_UNPACK_BUFFER_BINDING_EXT:
748       v->value_int = ctx->Unpack.BufferObj->Name;
749       break;
750    case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
751       v->value_int = ctx->TransformFeedback.CurrentBuffer->Name;
752       break;
753    case GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED:
754       v->value_int = ctx->TransformFeedback.CurrentObject->Paused;
755       break;
756    case GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE:
757       v->value_int = ctx->TransformFeedback.CurrentObject->Active;
758       break;
759    case GL_TRANSFORM_FEEDBACK_BINDING:
760       v->value_int = ctx->TransformFeedback.CurrentObject->Name;
761       break;
762    case GL_CURRENT_PROGRAM:
763       v->value_int =
764          ctx->Shader.ActiveProgram ? ctx->Shader.ActiveProgram->Name : 0;
765       break;
766    case GL_READ_FRAMEBUFFER_BINDING_EXT:
767       v->value_int = ctx->ReadBuffer->Name;
768       break;
769    case GL_RENDERBUFFER_BINDING_EXT:
770       v->value_int =
771          ctx->CurrentRenderbuffer ? ctx->CurrentRenderbuffer->Name : 0;
772       break;
773    case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
774       v->value_int = ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_POINT_SIZE].BufferObj->Name;
775       break;
776
777    case GL_FOG_COLOR:
778       if (_mesa_get_clamp_fragment_color(ctx))
779          COPY_4FV(v->value_float_4, ctx->Fog.Color);
780       else
781          COPY_4FV(v->value_float_4, ctx->Fog.ColorUnclamped);
782       break;
783    case GL_COLOR_CLEAR_VALUE:
784       if (_mesa_get_clamp_fragment_color(ctx)) {
785          v->value_float_4[0] = CLAMP(ctx->Color.ClearColor.f[0], 0.0F, 1.0F);
786          v->value_float_4[1] = CLAMP(ctx->Color.ClearColor.f[1], 0.0F, 1.0F);
787          v->value_float_4[2] = CLAMP(ctx->Color.ClearColor.f[2], 0.0F, 1.0F);
788          v->value_float_4[3] = CLAMP(ctx->Color.ClearColor.f[3], 0.0F, 1.0F);
789       } else
790          COPY_4FV(v->value_float_4, ctx->Color.ClearColor.f);
791       break;
792    case GL_BLEND_COLOR_EXT:
793       if (_mesa_get_clamp_fragment_color(ctx))
794          COPY_4FV(v->value_float_4, ctx->Color.BlendColor);
795       else
796          COPY_4FV(v->value_float_4, ctx->Color.BlendColorUnclamped);
797       break;
798    case GL_ALPHA_TEST_REF:
799       if (_mesa_get_clamp_fragment_color(ctx))
800          v->value_float = ctx->Color.AlphaRef;
801       else
802          v->value_float = ctx->Color.AlphaRefUnclamped;
803       break;
804    case GL_MAX_VERTEX_UNIFORM_VECTORS:
805       v->value_int = ctx->Const.VertexProgram.MaxUniformComponents / 4;
806       break;
807
808    case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
809       v->value_int = ctx->Const.FragmentProgram.MaxUniformComponents / 4;
810       break;
811
812    /* GL_ARB_texture_buffer_object */
813    case GL_TEXTURE_BUFFER_ARB:
814       v->value_int = ctx->Texture.BufferObject->Name;
815       break;
816    case GL_TEXTURE_BINDING_BUFFER_ARB:
817       unit = ctx->Texture.CurrentUnit;
818       v->value_int =
819          ctx->Texture.Unit[unit].CurrentTex[TEXTURE_BUFFER_INDEX]->Name;
820       break;
821    case GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB:
822       {
823          struct gl_buffer_object *buf =
824             ctx->Texture.Unit[ctx->Texture.CurrentUnit]
825             .CurrentTex[TEXTURE_BUFFER_INDEX]->BufferObject;
826          v->value_int = buf ? buf->Name : 0;
827       }
828       break;
829    case GL_TEXTURE_BUFFER_FORMAT_ARB:
830       v->value_int = ctx->Texture.Unit[ctx->Texture.CurrentUnit]
831          .CurrentTex[TEXTURE_BUFFER_INDEX]->BufferObjectFormat;
832       break;
833
834    /* GL_ARB_sampler_objects */
835    case GL_SAMPLER_BINDING:
836       {
837          struct gl_sampler_object *samp =
838             ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler;
839
840          /*
841           * The sampler object may have been deleted on another context,
842           * so we try to lookup the sampler object before returning its Name.
843           */
844          if (samp && _mesa_lookup_samplerobj(ctx, samp->Name)) {
845             v->value_int = samp->Name;
846          } else {
847             v->value_int = 0;
848          }
849       }
850       break;
851    /* GL_ARB_uniform_buffer_object */
852    case GL_UNIFORM_BUFFER_BINDING:
853       v->value_int = ctx->UniformBuffer->Name;
854       break;
855    /* GL_ARB_timer_query */
856    case GL_TIMESTAMP:
857       if (ctx->Driver.GetTimestamp) {
858          v->value_int64 = ctx->Driver.GetTimestamp(ctx);
859       }
860       else {
861          _mesa_problem(ctx, "driver doesn't implement GetTimestamp");
862       }
863       break;
864    }
865 }
866
867 /**
868  * Check extra constraints on a struct value_desc descriptor
869  *
870  * If a struct value_desc has a non-NULL extra pointer, it means that
871  * there are a number of extra constraints to check or actions to
872  * perform.  The extras is just an integer array where each integer
873  * encode different constraints or actions.
874  *
875  * \param ctx current context
876  * \param func name of calling glGet*v() function for error reporting
877  * \param d the struct value_desc that has the extra constraints
878  *
879  * \return GL_FALSE if all of the constraints were not satisfied,
880  *     otherwise GL_TRUE.
881  */
882 static GLboolean
883 check_extra(struct gl_context *ctx, const char *func, const struct value_desc *d)
884 {
885    const GLuint version = ctx->Version;
886    int total, enabled;
887    const int *e;
888
889    total = 0;
890    enabled = 0;
891    for (e = d->extra; *e != EXTRA_END; e++)
892       switch (*e) {
893       case EXTRA_VERSION_30:
894          if (version >= 30) {
895             total++;
896             enabled++;
897          }
898          break;
899       case EXTRA_VERSION_31:
900          if (version >= 31) {
901             total++;
902             enabled++;
903          }
904          break;
905       case EXTRA_VERSION_32:
906          if (version >= 32) {
907             total++;
908             enabled++;
909          }
910          break;
911       case EXTRA_NEW_FRAG_CLAMP:
912          if (ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
913             _mesa_update_state(ctx);
914          break;
915       case EXTRA_API_ES2:
916          if (ctx->API == API_OPENGLES2) {
917             total++;
918             enabled++;
919          }
920          break;
921       case EXTRA_API_ES3:
922          if (_mesa_is_gles3(ctx)) {
923             total++;
924             enabled++;
925          }
926          break;
927       case EXTRA_API_GL:
928          if (_mesa_is_desktop_gl(ctx)) {
929             total++;
930             enabled++;
931          }
932          break;
933       case EXTRA_API_GL_CORE:
934          if (ctx->API == API_OPENGL_CORE) {
935             total++;
936             enabled++;
937          }
938          break;
939       case EXTRA_NEW_BUFFERS:
940          if (ctx->NewState & _NEW_BUFFERS)
941             _mesa_update_state(ctx);
942          break;
943       case EXTRA_FLUSH_CURRENT:
944          FLUSH_CURRENT(ctx, 0);
945          break;
946       case EXTRA_VALID_DRAW_BUFFER:
947          if (d->pname - GL_DRAW_BUFFER0_ARB >= ctx->Const.MaxDrawBuffers) {
948             _mesa_error(ctx, GL_INVALID_OPERATION, "%s(draw buffer %u)",
949                         func, d->pname - GL_DRAW_BUFFER0_ARB);
950             return GL_FALSE;
951          }
952          break;
953       case EXTRA_VALID_TEXTURE_UNIT:
954          if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
955             _mesa_error(ctx, GL_INVALID_OPERATION, "%s(texture %u)",
956                         func, ctx->Texture.CurrentUnit);
957             return GL_FALSE;
958          }
959          break;
960       case EXTRA_VALID_CLIP_DISTANCE:
961          if (d->pname - GL_CLIP_DISTANCE0 >= ctx->Const.MaxClipPlanes) {
962             _mesa_error(ctx, GL_INVALID_ENUM, "%s(clip distance %u)",
963                         func, d->pname - GL_CLIP_DISTANCE0);
964             return GL_FALSE;
965          }
966          break;
967       case EXTRA_GLSL_130:
968          if (ctx->Const.GLSLVersion >= 130) {
969             total++;
970             enabled++;
971          }
972          break;
973       case EXTRA_END:
974          break;
975       default: /* *e is a offset into the extension struct */
976          total++;
977          if (*(GLboolean *) ((char *) &ctx->Extensions + *e))
978             enabled++;
979          break;
980       }
981
982    if (total > 0 && enabled == 0) {
983       _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)", func,
984                   _mesa_lookup_enum_by_nr(d->pname));
985       return GL_FALSE;
986    }
987
988    return GL_TRUE;
989 }
990
991 static const struct value_desc error_value =
992    { 0, 0, TYPE_INVALID, NO_OFFSET, NO_EXTRA };
993
994 /**
995  * Find the struct value_desc corresponding to the enum 'pname'.
996  * 
997  * We hash the enum value to get an index into the 'table' array,
998  * which holds the index in the 'values' array of struct value_desc.
999  * Once we've found the entry, we do the extra checks, if any, then
1000  * look up the value and return a pointer to it.
1001  *
1002  * If the value has to be computed (for example, it's the result of a
1003  * function call or we need to add 1 to it), we use the tmp 'v' to
1004  * store the result.
1005  * 
1006  * \param func name of glGet*v() func for error reporting
1007  * \param pname the enum value we're looking up
1008  * \param p is were we return the pointer to the value
1009  * \param v a tmp union value variable in the calling glGet*v() function
1010  *
1011  * \return the struct value_desc corresponding to the enum or a struct
1012  *     value_desc of TYPE_INVALID if not found.  This lets the calling
1013  *     glGet*v() function jump right into a switch statement and
1014  *     handle errors there instead of having to check for NULL.
1015  */
1016 static const struct value_desc *
1017 find_value(const char *func, GLenum pname, void **p, union value *v)
1018 {
1019    GET_CURRENT_CONTEXT(ctx);
1020    struct gl_texture_unit *unit;
1021    int mask, hash;
1022    const struct value_desc *d;
1023    int api;
1024
1025    api = ctx->API;
1026    /* We index into the table_set[] list of per-API hash tables using the API's
1027     * value in the gl_api enum. Since GLES 3 doesn't have an API_OPENGL* enum
1028     * value since it's compatible with GLES2 its entry in table_set[] is at the
1029     * end.
1030     */
1031    STATIC_ASSERT(Elements(table_set) == API_OPENGL_LAST + 2);
1032    if (_mesa_is_gles3(ctx)) {
1033       api = API_OPENGL_LAST + 1;
1034    }
1035    mask = Elements(table(api)) - 1;
1036    hash = (pname * prime_factor);
1037    while (1) {
1038       int idx = table(api)[hash & mask];
1039
1040       /* If the enum isn't valid, the hash walk ends with index 0,
1041        * pointing to the first entry of values[] which doesn't hold
1042        * any valid enum. */
1043       if (unlikely(idx == 0)) {
1044          _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)", func,
1045                _mesa_lookup_enum_by_nr(pname));
1046          return &error_value;
1047       }
1048
1049       d = &values[idx];
1050       if (likely(d->pname == pname))
1051          break;
1052
1053       hash += prime_step;
1054    }
1055
1056    if (unlikely(d->extra && !check_extra(ctx, func, d)))
1057       return &error_value;
1058
1059    switch (d->location) {
1060    case LOC_BUFFER:
1061       *p = ((char *) ctx->DrawBuffer + d->offset);
1062       return d;
1063    case LOC_CONTEXT:
1064       *p = ((char *) ctx + d->offset);
1065       return d;
1066    case LOC_ARRAY:
1067       *p = ((char *) ctx->Array.ArrayObj + d->offset);
1068       return d;
1069    case LOC_TEXUNIT:
1070       unit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
1071       *p = ((char *) unit + d->offset);
1072       return d;
1073    case LOC_CUSTOM:
1074       find_custom_value(ctx, d, v);
1075       *p = v;
1076       return d;
1077    default:
1078       assert(0);
1079       break;
1080    }
1081
1082    /* silence warning */
1083    return &error_value;
1084 }
1085
1086 static const int transpose[] = {
1087    0, 4,  8, 12,
1088    1, 5,  9, 13,
1089    2, 6, 10, 14,
1090    3, 7, 11, 15
1091 };
1092
1093 void GLAPIENTRY
1094 _mesa_GetBooleanv(GLenum pname, GLboolean *params)
1095 {
1096    const struct value_desc *d;
1097    union value v;
1098    GLmatrix *m;
1099    int shift, i;
1100    void *p;
1101
1102    d = find_value("glGetBooleanv", pname, &p, &v);
1103    switch (d->type) {
1104    case TYPE_INVALID:
1105       break;
1106    case TYPE_CONST:
1107       params[0] = INT_TO_BOOLEAN(d->offset);
1108       break;
1109
1110    case TYPE_FLOAT_4:
1111    case TYPE_FLOATN_4:
1112       params[3] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[3]);
1113    case TYPE_FLOAT_3:
1114    case TYPE_FLOATN_3:
1115       params[2] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[2]);
1116    case TYPE_FLOAT_2:
1117    case TYPE_FLOATN_2:
1118       params[1] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[1]);
1119    case TYPE_FLOAT:
1120    case TYPE_FLOATN:
1121       params[0] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[0]);
1122       break;
1123
1124    case TYPE_DOUBLEN:
1125       params[0] = FLOAT_TO_BOOLEAN(((GLdouble *) p)[0]);
1126       break;
1127
1128    case TYPE_INT_4:
1129       params[3] = INT_TO_BOOLEAN(((GLint *) p)[3]);
1130    case TYPE_INT_3:
1131       params[2] = INT_TO_BOOLEAN(((GLint *) p)[2]);
1132    case TYPE_INT_2:
1133    case TYPE_ENUM_2:
1134       params[1] = INT_TO_BOOLEAN(((GLint *) p)[1]);
1135    case TYPE_INT:
1136    case TYPE_ENUM:
1137       params[0] = INT_TO_BOOLEAN(((GLint *) p)[0]);
1138       break;
1139
1140    case TYPE_INT_N:
1141       for (i = 0; i < v.value_int_n.n; i++)
1142          params[i] = INT_TO_BOOLEAN(v.value_int_n.ints[i]);
1143       break;
1144
1145    case TYPE_INT64:
1146       params[0] = INT64_TO_BOOLEAN(((GLint64 *) p)[0]);
1147       break;
1148
1149    case TYPE_BOOLEAN:
1150       params[0] = ((GLboolean*) p)[0];
1151       break;            
1152
1153    case TYPE_MATRIX:
1154       m = *(GLmatrix **) p;
1155       for (i = 0; i < 16; i++)
1156          params[i] = FLOAT_TO_BOOLEAN(m->m[i]);
1157       break;
1158
1159    case TYPE_MATRIX_T:
1160       m = *(GLmatrix **) p;
1161       for (i = 0; i < 16; i++)
1162          params[i] = FLOAT_TO_BOOLEAN(m->m[transpose[i]]);
1163       break;
1164
1165    case TYPE_BIT_0:
1166    case TYPE_BIT_1:
1167    case TYPE_BIT_2:
1168    case TYPE_BIT_3:
1169    case TYPE_BIT_4:
1170    case TYPE_BIT_5:
1171    case TYPE_BIT_6:
1172    case TYPE_BIT_7:
1173       shift = d->type - TYPE_BIT_0;
1174       params[0] = (*(GLbitfield *) p >> shift) & 1;
1175       break;
1176    }
1177 }
1178
1179 void GLAPIENTRY
1180 _mesa_GetFloatv(GLenum pname, GLfloat *params)
1181 {
1182    const struct value_desc *d;
1183    union value v;
1184    GLmatrix *m;
1185    int shift, i;
1186    void *p;
1187
1188    d = find_value("glGetFloatv", pname, &p, &v);
1189    switch (d->type) {
1190    case TYPE_INVALID:
1191       break;
1192    case TYPE_CONST:
1193       params[0] = (GLfloat) d->offset;
1194       break;
1195
1196    case TYPE_FLOAT_4:
1197    case TYPE_FLOATN_4:
1198       params[3] = ((GLfloat *) p)[3];
1199    case TYPE_FLOAT_3:
1200    case TYPE_FLOATN_3:
1201       params[2] = ((GLfloat *) p)[2];
1202    case TYPE_FLOAT_2:
1203    case TYPE_FLOATN_2:
1204       params[1] = ((GLfloat *) p)[1];
1205    case TYPE_FLOAT:
1206    case TYPE_FLOATN:
1207       params[0] = ((GLfloat *) p)[0];
1208       break;
1209
1210    case TYPE_DOUBLEN:
1211       params[0] = (GLfloat) (((GLdouble *) p)[0]);
1212       break;
1213
1214    case TYPE_INT_4:
1215       params[3] = (GLfloat) (((GLint *) p)[3]);
1216    case TYPE_INT_3:
1217       params[2] = (GLfloat) (((GLint *) p)[2]);
1218    case TYPE_INT_2:
1219    case TYPE_ENUM_2:
1220       params[1] = (GLfloat) (((GLint *) p)[1]);
1221    case TYPE_INT:
1222    case TYPE_ENUM:
1223       params[0] = (GLfloat) (((GLint *) p)[0]);
1224       break;
1225
1226    case TYPE_INT_N:
1227       for (i = 0; i < v.value_int_n.n; i++)
1228          params[i] = INT_TO_FLOAT(v.value_int_n.ints[i]);
1229       break;
1230
1231    case TYPE_INT64:
1232       params[0] = (GLfloat) (((GLint64 *) p)[0]);
1233       break;
1234
1235    case TYPE_BOOLEAN:
1236       params[0] = BOOLEAN_TO_FLOAT(*(GLboolean*) p);
1237       break;            
1238
1239    case TYPE_MATRIX:
1240       m = *(GLmatrix **) p;
1241       for (i = 0; i < 16; i++)
1242          params[i] = m->m[i];
1243       break;
1244
1245    case TYPE_MATRIX_T:
1246       m = *(GLmatrix **) p;
1247       for (i = 0; i < 16; i++)
1248          params[i] = m->m[transpose[i]];
1249       break;
1250
1251    case TYPE_BIT_0:
1252    case TYPE_BIT_1:
1253    case TYPE_BIT_2:
1254    case TYPE_BIT_3:
1255    case TYPE_BIT_4:
1256    case TYPE_BIT_5:
1257    case TYPE_BIT_6:
1258    case TYPE_BIT_7:
1259       shift = d->type - TYPE_BIT_0;
1260       params[0] = BOOLEAN_TO_FLOAT((*(GLbitfield *) p >> shift) & 1);
1261       break;
1262    }
1263 }
1264
1265 void GLAPIENTRY
1266 _mesa_GetIntegerv(GLenum pname, GLint *params)
1267 {
1268    const struct value_desc *d;
1269    union value v;
1270    GLmatrix *m;
1271    int shift, i;
1272    void *p;
1273
1274    d = find_value("glGetIntegerv", pname, &p, &v);
1275    switch (d->type) {
1276    case TYPE_INVALID:
1277       break;
1278    case TYPE_CONST:
1279       params[0] = d->offset;
1280       break;
1281
1282    case TYPE_FLOAT_4:
1283       params[3] = IROUND(((GLfloat *) p)[3]);
1284    case TYPE_FLOAT_3:
1285       params[2] = IROUND(((GLfloat *) p)[2]);
1286    case TYPE_FLOAT_2:
1287       params[1] = IROUND(((GLfloat *) p)[1]);
1288    case TYPE_FLOAT:
1289       params[0] = IROUND(((GLfloat *) p)[0]);
1290       break;
1291
1292    case TYPE_FLOATN_4:
1293       params[3] = FLOAT_TO_INT(((GLfloat *) p)[3]);
1294    case TYPE_FLOATN_3:
1295       params[2] = FLOAT_TO_INT(((GLfloat *) p)[2]);
1296    case TYPE_FLOATN_2:
1297       params[1] = FLOAT_TO_INT(((GLfloat *) p)[1]);
1298    case TYPE_FLOATN:
1299       params[0] = FLOAT_TO_INT(((GLfloat *) p)[0]);
1300       break;
1301
1302    case TYPE_DOUBLEN:
1303       params[0] = FLOAT_TO_INT(((GLdouble *) p)[0]);
1304       break;
1305
1306    case TYPE_INT_4:
1307       params[3] = ((GLint *) p)[3];
1308    case TYPE_INT_3:
1309       params[2] = ((GLint *) p)[2];
1310    case TYPE_INT_2:
1311    case TYPE_ENUM_2:
1312       params[1] = ((GLint *) p)[1];
1313    case TYPE_INT:
1314    case TYPE_ENUM:
1315       params[0] = ((GLint *) p)[0];
1316       break;
1317
1318    case TYPE_INT_N:
1319       for (i = 0; i < v.value_int_n.n; i++)
1320          params[i] = v.value_int_n.ints[i];
1321       break;
1322
1323    case TYPE_INT64:
1324       params[0] = INT64_TO_INT(((GLint64 *) p)[0]);
1325       break;
1326
1327    case TYPE_BOOLEAN:
1328       params[0] = BOOLEAN_TO_INT(*(GLboolean*) p);
1329       break;            
1330
1331    case TYPE_MATRIX:
1332       m = *(GLmatrix **) p;
1333       for (i = 0; i < 16; i++)
1334          params[i] = FLOAT_TO_INT(m->m[i]);
1335       break;
1336
1337    case TYPE_MATRIX_T:
1338       m = *(GLmatrix **) p;
1339       for (i = 0; i < 16; i++)
1340          params[i] = FLOAT_TO_INT(m->m[transpose[i]]);
1341       break;
1342
1343    case TYPE_BIT_0:
1344    case TYPE_BIT_1:
1345    case TYPE_BIT_2:
1346    case TYPE_BIT_3:
1347    case TYPE_BIT_4:
1348    case TYPE_BIT_5:
1349    case TYPE_BIT_6:
1350    case TYPE_BIT_7:
1351       shift = d->type - TYPE_BIT_0;
1352       params[0] = (*(GLbitfield *) p >> shift) & 1;
1353       break;
1354    }
1355 }
1356
1357 void GLAPIENTRY
1358 _mesa_GetInteger64v(GLenum pname, GLint64 *params)
1359 {
1360    const struct value_desc *d;
1361    union value v;
1362    GLmatrix *m;
1363    int shift, i;
1364    void *p;
1365
1366    d = find_value("glGetInteger64v", pname, &p, &v);
1367    switch (d->type) {
1368    case TYPE_INVALID:
1369       break;
1370    case TYPE_CONST:
1371       params[0] = d->offset;
1372       break;
1373
1374    case TYPE_FLOAT_4:
1375       params[3] = IROUND64(((GLfloat *) p)[3]);
1376    case TYPE_FLOAT_3:
1377       params[2] = IROUND64(((GLfloat *) p)[2]);
1378    case TYPE_FLOAT_2:
1379       params[1] = IROUND64(((GLfloat *) p)[1]);
1380    case TYPE_FLOAT:
1381       params[0] = IROUND64(((GLfloat *) p)[0]);
1382       break;
1383
1384    case TYPE_FLOATN_4:
1385       params[3] = FLOAT_TO_INT64(((GLfloat *) p)[3]);
1386    case TYPE_FLOATN_3:
1387       params[2] = FLOAT_TO_INT64(((GLfloat *) p)[2]);
1388    case TYPE_FLOATN_2:
1389       params[1] = FLOAT_TO_INT64(((GLfloat *) p)[1]);
1390    case TYPE_FLOATN:
1391       params[0] = FLOAT_TO_INT64(((GLfloat *) p)[0]);
1392       break;
1393
1394    case TYPE_DOUBLEN:
1395       params[0] = FLOAT_TO_INT64(((GLdouble *) p)[0]);
1396       break;
1397
1398    case TYPE_INT_4:
1399       params[3] = ((GLint *) p)[3];
1400    case TYPE_INT_3:
1401       params[2] = ((GLint *) p)[2];
1402    case TYPE_INT_2:
1403    case TYPE_ENUM_2:
1404       params[1] = ((GLint *) p)[1];
1405    case TYPE_INT:
1406    case TYPE_ENUM:
1407       params[0] = ((GLint *) p)[0];
1408       break;
1409
1410    case TYPE_INT_N:
1411       for (i = 0; i < v.value_int_n.n; i++)
1412          params[i] = INT_TO_BOOLEAN(v.value_int_n.ints[i]);
1413       break;
1414
1415    case TYPE_INT64:
1416       params[0] = ((GLint64 *) p)[0];
1417       break;
1418
1419    case TYPE_BOOLEAN:
1420       params[0] = ((GLboolean*) p)[0];
1421       break;            
1422
1423    case TYPE_MATRIX:
1424       m = *(GLmatrix **) p;
1425       for (i = 0; i < 16; i++)
1426          params[i] = FLOAT_TO_INT64(m->m[i]);
1427       break;
1428
1429    case TYPE_MATRIX_T:
1430       m = *(GLmatrix **) p;
1431       for (i = 0; i < 16; i++)
1432          params[i] = FLOAT_TO_INT64(m->m[transpose[i]]);
1433       break;
1434
1435    case TYPE_BIT_0:
1436    case TYPE_BIT_1:
1437    case TYPE_BIT_2:
1438    case TYPE_BIT_3:
1439    case TYPE_BIT_4:
1440    case TYPE_BIT_5:
1441    case TYPE_BIT_6:
1442    case TYPE_BIT_7:
1443       shift = d->type - TYPE_BIT_0;
1444       params[0] = (*(GLbitfield *) p >> shift) & 1;
1445       break;
1446    }
1447 }
1448
1449 void GLAPIENTRY
1450 _mesa_GetDoublev(GLenum pname, GLdouble *params)
1451 {
1452    const struct value_desc *d;
1453    union value v;
1454    GLmatrix *m;
1455    int shift, i;
1456    void *p;
1457
1458    d = find_value("glGetDoublev", pname, &p, &v);
1459    switch (d->type) {
1460    case TYPE_INVALID:
1461       break;
1462    case TYPE_CONST:
1463       params[0] = d->offset;
1464       break;
1465
1466    case TYPE_FLOAT_4:
1467    case TYPE_FLOATN_4:
1468       params[3] = ((GLfloat *) p)[3];
1469    case TYPE_FLOAT_3:
1470    case TYPE_FLOATN_3:
1471       params[2] = ((GLfloat *) p)[2];
1472    case TYPE_FLOAT_2:
1473    case TYPE_FLOATN_2:
1474       params[1] = ((GLfloat *) p)[1];
1475    case TYPE_FLOAT:
1476    case TYPE_FLOATN:
1477       params[0] = ((GLfloat *) p)[0];
1478       break;
1479
1480    case TYPE_DOUBLEN:
1481       params[0] = ((GLdouble *) p)[0];
1482       break;
1483
1484    case TYPE_INT_4:
1485       params[3] = ((GLint *) p)[3];
1486    case TYPE_INT_3:
1487       params[2] = ((GLint *) p)[2];
1488    case TYPE_INT_2:
1489    case TYPE_ENUM_2:
1490       params[1] = ((GLint *) p)[1];
1491    case TYPE_INT:
1492    case TYPE_ENUM:
1493       params[0] = ((GLint *) p)[0];
1494       break;
1495
1496    case TYPE_INT_N:
1497       for (i = 0; i < v.value_int_n.n; i++)
1498          params[i] = v.value_int_n.ints[i];
1499       break;
1500
1501    case TYPE_INT64:
1502       params[0] = (GLdouble) (((GLint64 *) p)[0]);
1503       break;
1504
1505    case TYPE_BOOLEAN:
1506       params[0] = *(GLboolean*) p;
1507       break;            
1508
1509    case TYPE_MATRIX:
1510       m = *(GLmatrix **) p;
1511       for (i = 0; i < 16; i++)
1512          params[i] = m->m[i];
1513       break;
1514
1515    case TYPE_MATRIX_T:
1516       m = *(GLmatrix **) p;
1517       for (i = 0; i < 16; i++)
1518          params[i] = m->m[transpose[i]];
1519       break;
1520
1521    case TYPE_BIT_0:
1522    case TYPE_BIT_1:
1523    case TYPE_BIT_2:
1524    case TYPE_BIT_3:
1525    case TYPE_BIT_4:
1526    case TYPE_BIT_5:
1527    case TYPE_BIT_6:
1528    case TYPE_BIT_7:
1529       shift = d->type - TYPE_BIT_0;
1530       params[0] = (*(GLbitfield *) p >> shift) & 1;
1531       break;
1532    }
1533 }
1534
1535 static enum value_type
1536 find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
1537 {
1538    GET_CURRENT_CONTEXT(ctx);
1539
1540    switch (pname) {
1541
1542    case GL_BLEND:
1543       if (index >= ctx->Const.MaxDrawBuffers)
1544          goto invalid_value;
1545       if (!ctx->Extensions.EXT_draw_buffers2)
1546          goto invalid_enum;
1547       v->value_int = (ctx->Color.BlendEnabled >> index) & 1;
1548       return TYPE_INT;
1549
1550    case GL_BLEND_SRC:
1551       /* fall-through */
1552    case GL_BLEND_SRC_RGB:
1553       if (index >= ctx->Const.MaxDrawBuffers)
1554          goto invalid_value;
1555       if (!ctx->Extensions.ARB_draw_buffers_blend)
1556          goto invalid_enum;
1557       v->value_int = ctx->Color.Blend[index].SrcRGB;
1558       return TYPE_INT;
1559    case GL_BLEND_SRC_ALPHA:
1560       if (index >= ctx->Const.MaxDrawBuffers)
1561          goto invalid_value;
1562       if (!ctx->Extensions.ARB_draw_buffers_blend)
1563          goto invalid_enum;
1564       v->value_int = ctx->Color.Blend[index].SrcA;
1565       return TYPE_INT;
1566    case GL_BLEND_DST:
1567       /* fall-through */
1568    case GL_BLEND_DST_RGB:
1569       if (index >= ctx->Const.MaxDrawBuffers)
1570          goto invalid_value;
1571       if (!ctx->Extensions.ARB_draw_buffers_blend)
1572          goto invalid_enum;
1573       v->value_int = ctx->Color.Blend[index].DstRGB;
1574       return TYPE_INT;
1575    case GL_BLEND_DST_ALPHA:
1576       if (index >= ctx->Const.MaxDrawBuffers)
1577          goto invalid_value;
1578       if (!ctx->Extensions.ARB_draw_buffers_blend)
1579          goto invalid_enum;
1580       v->value_int = ctx->Color.Blend[index].DstA;
1581       return TYPE_INT;
1582    case GL_BLEND_EQUATION_RGB:
1583       if (index >= ctx->Const.MaxDrawBuffers)
1584          goto invalid_value;
1585       if (!ctx->Extensions.ARB_draw_buffers_blend)
1586          goto invalid_enum;
1587       v->value_int = ctx->Color.Blend[index].EquationRGB;
1588       return TYPE_INT;
1589    case GL_BLEND_EQUATION_ALPHA:
1590       if (index >= ctx->Const.MaxDrawBuffers)
1591          goto invalid_value;
1592       if (!ctx->Extensions.ARB_draw_buffers_blend)
1593          goto invalid_enum;
1594       v->value_int = ctx->Color.Blend[index].EquationA;
1595       return TYPE_INT;
1596
1597    case GL_COLOR_WRITEMASK:
1598       if (index >= ctx->Const.MaxDrawBuffers)
1599          goto invalid_value;
1600       if (!ctx->Extensions.EXT_draw_buffers2)
1601          goto invalid_enum;
1602       v->value_int_4[0] = ctx->Color.ColorMask[index][RCOMP] ? 1 : 0;
1603       v->value_int_4[1] = ctx->Color.ColorMask[index][GCOMP] ? 1 : 0;
1604       v->value_int_4[2] = ctx->Color.ColorMask[index][BCOMP] ? 1 : 0;
1605       v->value_int_4[3] = ctx->Color.ColorMask[index][ACOMP] ? 1 : 0;
1606       return TYPE_INT_4;
1607
1608    case GL_TRANSFORM_FEEDBACK_BUFFER_START:
1609       if (index >= ctx->Const.MaxTransformFeedbackBuffers)
1610          goto invalid_value;
1611       if (!ctx->Extensions.EXT_transform_feedback)
1612          goto invalid_enum;
1613       v->value_int64 = ctx->TransformFeedback.CurrentObject->Offset[index];
1614       return TYPE_INT64;
1615
1616    case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
1617       if (index >= ctx->Const.MaxTransformFeedbackBuffers)
1618          goto invalid_value;
1619       if (!ctx->Extensions.EXT_transform_feedback)
1620          goto invalid_enum;
1621       v->value_int64
1622          = ctx->TransformFeedback.CurrentObject->RequestedSize[index];
1623       return TYPE_INT64;
1624
1625    case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
1626       if (index >= ctx->Const.MaxTransformFeedbackBuffers)
1627          goto invalid_value;
1628       if (!ctx->Extensions.EXT_transform_feedback)
1629          goto invalid_enum;
1630       v->value_int = ctx->TransformFeedback.CurrentObject->BufferNames[index];
1631       return TYPE_INT;
1632
1633    case GL_UNIFORM_BUFFER_BINDING:
1634       if (index >= ctx->Const.MaxUniformBufferBindings)
1635          goto invalid_value;
1636       if (!ctx->Extensions.ARB_uniform_buffer_object)
1637          goto invalid_enum;
1638       v->value_int = ctx->UniformBufferBindings[index].BufferObject->Name;
1639       return TYPE_INT;
1640
1641    case GL_UNIFORM_BUFFER_START:
1642       if (index >= ctx->Const.MaxUniformBufferBindings)
1643          goto invalid_value;
1644       if (!ctx->Extensions.ARB_uniform_buffer_object)
1645          goto invalid_enum;
1646       v->value_int = ctx->UniformBufferBindings[index].Offset;
1647       return TYPE_INT;
1648
1649    case GL_UNIFORM_BUFFER_SIZE:
1650       if (index >= ctx->Const.MaxUniformBufferBindings)
1651          goto invalid_value;
1652       if (!ctx->Extensions.ARB_uniform_buffer_object)
1653          goto invalid_enum;
1654       v->value_int = ctx->UniformBufferBindings[index].Size;
1655       return TYPE_INT;
1656
1657    /* ARB_texture_multisample / GL3.2 */
1658    case GL_SAMPLE_MASK_VALUE:
1659       if (index != 0)
1660          goto invalid_value;
1661       if (!ctx->Extensions.ARB_texture_multisample)
1662          goto invalid_enum;
1663       v->value_int = ctx->Multisample.SampleMaskValue;
1664       return TYPE_INT;
1665    }
1666
1667  invalid_enum:
1668    _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)", func,
1669                _mesa_lookup_enum_by_nr(pname));
1670    return TYPE_INVALID;
1671  invalid_value:
1672    _mesa_error(ctx, GL_INVALID_VALUE, "%s(pname=%s)", func,
1673                _mesa_lookup_enum_by_nr(pname));
1674    return TYPE_INVALID;
1675 }
1676
1677 void GLAPIENTRY
1678 _mesa_GetBooleani_v( GLenum pname, GLuint index, GLboolean *params )
1679 {
1680    union value v;
1681    enum value_type type =
1682       find_value_indexed("glGetBooleani_v", pname, index, &v);
1683
1684    switch (type) {
1685    case TYPE_INT:
1686       params[0] = INT_TO_BOOLEAN(v.value_int);
1687       break;
1688    case TYPE_INT_4:
1689       params[0] = INT_TO_BOOLEAN(v.value_int_4[0]);
1690       params[1] = INT_TO_BOOLEAN(v.value_int_4[1]);
1691       params[2] = INT_TO_BOOLEAN(v.value_int_4[2]);
1692       params[3] = INT_TO_BOOLEAN(v.value_int_4[3]);
1693       break;
1694    case TYPE_INT64:
1695       params[0] = INT64_TO_BOOLEAN(v.value_int);
1696       break;
1697    default:
1698       ; /* nothing - GL error was recorded */
1699    }
1700 }
1701
1702 void GLAPIENTRY
1703 _mesa_GetIntegeri_v( GLenum pname, GLuint index, GLint *params )
1704 {
1705    union value v;
1706    enum value_type type =
1707       find_value_indexed("glGetIntegeri_v", pname, index, &v);
1708
1709    switch (type) {
1710    case TYPE_INT:
1711       params[0] = v.value_int;
1712       break;
1713    case TYPE_INT_4:
1714       params[0] = v.value_int_4[0];
1715       params[1] = v.value_int_4[1];
1716       params[2] = v.value_int_4[2];
1717       params[3] = v.value_int_4[3];
1718       break;
1719    case TYPE_INT64:
1720       params[0] = INT64_TO_INT(v.value_int);
1721       break;
1722    default:
1723       ; /* nothing - GL error was recorded */
1724    }
1725 }
1726
1727 void GLAPIENTRY
1728 _mesa_GetInteger64i_v( GLenum pname, GLuint index, GLint64 *params )
1729 {
1730    union value v;
1731    enum value_type type =
1732       find_value_indexed("glGetInteger64i_v", pname, index, &v);
1733
1734    switch (type) {
1735    case TYPE_INT:
1736       params[0] = v.value_int;
1737       break;
1738    case TYPE_INT_4:
1739       params[0] = v.value_int_4[0];
1740       params[1] = v.value_int_4[1];
1741       params[2] = v.value_int_4[2];
1742       params[3] = v.value_int_4[3];
1743       break;
1744    case TYPE_INT64:
1745       params[0] = v.value_int;
1746       break;
1747    default:
1748       ; /* nothing - GL error was recorded */
1749    }
1750 }
1751
1752 void GLAPIENTRY
1753 _mesa_GetFixedv(GLenum pname, GLfixed *params)
1754 {
1755    const struct value_desc *d;
1756    union value v;
1757    GLmatrix *m;
1758    int shift, i;
1759    void *p;
1760
1761    d = find_value("glGetDoublev", pname, &p, &v);
1762    switch (d->type) {
1763    case TYPE_INVALID:
1764       break;
1765    case TYPE_CONST:
1766       params[0] = INT_TO_FIXED(d->offset);
1767       break;
1768
1769    case TYPE_FLOAT_4:
1770    case TYPE_FLOATN_4:
1771       params[3] = FLOAT_TO_FIXED(((GLfloat *) p)[3]);
1772    case TYPE_FLOAT_3:
1773    case TYPE_FLOATN_3:
1774       params[2] = FLOAT_TO_FIXED(((GLfloat *) p)[2]);
1775    case TYPE_FLOAT_2:
1776    case TYPE_FLOATN_2:
1777       params[1] = FLOAT_TO_FIXED(((GLfloat *) p)[1]);
1778    case TYPE_FLOAT:
1779    case TYPE_FLOATN:
1780       params[0] = FLOAT_TO_FIXED(((GLfloat *) p)[0]);
1781       break;
1782
1783    case TYPE_DOUBLEN:
1784       params[0] = FLOAT_TO_FIXED(((GLdouble *) p)[0]);
1785       break;
1786
1787    case TYPE_INT_4:
1788       params[3] = INT_TO_FIXED(((GLint *) p)[3]);
1789    case TYPE_INT_3:
1790       params[2] = INT_TO_FIXED(((GLint *) p)[2]);
1791    case TYPE_INT_2:
1792    case TYPE_ENUM_2:
1793       params[1] = INT_TO_FIXED(((GLint *) p)[1]);
1794    case TYPE_INT:
1795    case TYPE_ENUM:
1796       params[0] = INT_TO_FIXED(((GLint *) p)[0]);
1797       break;
1798
1799    case TYPE_INT_N:
1800       for (i = 0; i < v.value_int_n.n; i++)
1801          params[i] = INT_TO_FIXED(v.value_int_n.ints[i]);
1802       break;
1803
1804    case TYPE_INT64:
1805       params[0] = ((GLint64 *) p)[0];
1806       break;
1807
1808    case TYPE_BOOLEAN:
1809       params[0] = BOOLEAN_TO_FIXED(((GLboolean*) p)[0]);
1810       break;            
1811
1812    case TYPE_MATRIX:
1813       m = *(GLmatrix **) p;
1814       for (i = 0; i < 16; i++)
1815          params[i] = FLOAT_TO_FIXED(m->m[i]);
1816       break;
1817
1818    case TYPE_MATRIX_T:
1819       m = *(GLmatrix **) p;
1820       for (i = 0; i < 16; i++)
1821          params[i] = FLOAT_TO_FIXED(m->m[transpose[i]]);
1822       break;
1823
1824    case TYPE_BIT_0:
1825    case TYPE_BIT_1:
1826    case TYPE_BIT_2:
1827    case TYPE_BIT_3:
1828    case TYPE_BIT_4:
1829    case TYPE_BIT_5:
1830    case TYPE_BIT_6:
1831    case TYPE_BIT_7:
1832       shift = d->type - TYPE_BIT_0;
1833       params[0] = BOOLEAN_TO_FIXED((*(GLbitfield *) p >> shift) & 1);
1834       break;
1835    }
1836 }