OSDN Git Service

mesa: add missing queries for ARB_direct_state_access
[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  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21  * OTHER DEALINGS IN THE SOFTWARE.
22  *
23  * Author: Kristian Høgsberg <krh@bitplanet.net>
24  */
25
26 #include "glheader.h"
27 #include "context.h"
28 #include "blend.h"
29 #include "enable.h"
30 #include "enums.h"
31 #include "errors.h"
32 #include "extensions.h"
33 #include "get.h"
34 #include "macros.h"
35 #include "mtypes.h"
36 #include "state.h"
37 #include "texcompress.h"
38 #include "texstate.h"
39 #include "framebuffer.h"
40 #include "samplerobj.h"
41 #include "stencil.h"
42
43 /* This is a table driven implemetation of the glGet*v() functions.
44  * The basic idea is that most getters just look up an int somewhere
45  * in struct gl_context and then convert it to a bool or float according to
46  * which of glGetIntegerv() glGetBooleanv() etc is being called.
47  * Instead of generating code to do this, we can just record the enum
48  * value and the offset into struct gl_context in an array of structs.  Then
49  * in glGet*(), we lookup the struct for the enum in question, and use
50  * the offset to get the int we need.
51  *
52  * Sometimes we need to look up a float, a boolean, a bit in a
53  * bitfield, a matrix or other types instead, so we need to track the
54  * type of the value in struct gl_context.  And sometimes the value isn't in
55  * struct gl_context but in the drawbuffer, the array object, current texture
56  * unit, or maybe it's a computed value.  So we need to also track
57  * where or how to find the value.  Finally, we sometimes need to
58  * check that one of a number of extensions are enabled, the GL
59  * version or flush or call _mesa_update_state().  This is done by
60  * attaching optional extra information to the value description
61  * struct, it's sort of like an array of opcodes that describe extra
62  * checks or actions.
63  *
64  * Putting all this together we end up with struct value_desc below,
65  * and with a couple of macros to help, the table of struct value_desc
66  * is about as concise as the specification in the old python script.
67  */
68
69 #define FLOAT_TO_BOOLEAN(X)   ( (X) ? GL_TRUE : GL_FALSE )
70 #define FLOAT_TO_FIXED(F)     ( ((F) * 65536.0f > INT_MAX) ? INT_MAX : \
71                                 ((F) * 65536.0f < INT_MIN) ? INT_MIN : \
72                                 (GLint) ((F) * 65536.0f) )
73
74 #define INT_TO_BOOLEAN(I)     ( (I) ? GL_TRUE : GL_FALSE )
75 #define INT_TO_FIXED(I)       ( ((I) > SHRT_MAX) ? INT_MAX : \
76                                 ((I) < SHRT_MIN) ? INT_MIN : \
77                                 (GLint) ((I) * 65536) )
78
79 #define INT64_TO_BOOLEAN(I)   ( (I) ? GL_TRUE : GL_FALSE )
80 #define INT64_TO_INT(I)       ( (GLint)((I > INT_MAX) ? INT_MAX : ((I < INT_MIN) ? INT_MIN : (I))) )
81
82 #define BOOLEAN_TO_INT(B)     ( (GLint) (B) )
83 #define BOOLEAN_TO_INT64(B)   ( (GLint64) (B) )
84 #define BOOLEAN_TO_FLOAT(B)   ( (B) ? 1.0F : 0.0F )
85 #define BOOLEAN_TO_FIXED(B)   ( (GLint) ((B) ? 1 : 0) << 16 )
86
87 #define ENUM_TO_INT64(E)      ( (GLint64) (E) )
88 #define ENUM_TO_FIXED(E)      (E)
89
90 enum value_type {
91    TYPE_INVALID,
92    TYPE_INT,
93    TYPE_INT_2,
94    TYPE_INT_3,
95    TYPE_INT_4,
96    TYPE_INT_N,
97    TYPE_INT64,
98    TYPE_ENUM,
99    TYPE_ENUM_2,
100    TYPE_BOOLEAN,
101    TYPE_BIT_0,
102    TYPE_BIT_1,
103    TYPE_BIT_2,
104    TYPE_BIT_3,
105    TYPE_BIT_4,
106    TYPE_BIT_5,
107    TYPE_BIT_6,
108    TYPE_BIT_7,
109    TYPE_FLOAT,
110    TYPE_FLOAT_2,
111    TYPE_FLOAT_3,
112    TYPE_FLOAT_4,
113    TYPE_FLOATN,
114    TYPE_FLOATN_2,
115    TYPE_FLOATN_3,
116    TYPE_FLOATN_4,
117    TYPE_DOUBLEN,
118    TYPE_DOUBLEN_2,
119    TYPE_MATRIX,
120    TYPE_MATRIX_T,
121    TYPE_CONST
122 };
123
124 enum value_location {
125    LOC_BUFFER,
126    LOC_CONTEXT,
127    LOC_ARRAY,
128    LOC_TEXUNIT,
129    LOC_CUSTOM
130 };
131
132 enum value_extra {
133    EXTRA_END = 0x8000,
134    EXTRA_VERSION_30,
135    EXTRA_VERSION_31,
136    EXTRA_VERSION_32,
137    EXTRA_VERSION_40,
138    EXTRA_API_GL,
139    EXTRA_API_GL_CORE,
140    EXTRA_API_ES2,
141    EXTRA_API_ES3,
142    EXTRA_API_ES31,
143    EXTRA_NEW_BUFFERS, 
144    EXTRA_NEW_FRAG_CLAMP,
145    EXTRA_VALID_DRAW_BUFFER,
146    EXTRA_VALID_TEXTURE_UNIT,
147    EXTRA_VALID_CLIP_DISTANCE,
148    EXTRA_FLUSH_CURRENT,
149    EXTRA_GLSL_130,
150    EXTRA_EXT_UBO_GS4,
151    EXTRA_EXT_ATOMICS_GS4,
152    EXTRA_EXT_SHADER_IMAGE_GS4,
153    EXTRA_EXT_ATOMICS_TESS,
154    EXTRA_EXT_SHADER_IMAGE_TESS,
155 };
156
157 #define NO_EXTRA NULL
158 #define NO_OFFSET 0
159
160 struct value_desc {
161    GLenum pname;
162    GLubyte location;  /**< enum value_location */
163    GLubyte type;      /**< enum value_type */
164    int offset;
165    const int *extra;
166 };
167
168 union value {
169    GLfloat value_float;
170    GLfloat value_float_4[4];
171    GLdouble value_double_2[2];
172    GLmatrix *value_matrix;
173    GLint value_int;
174    GLint value_int_4[4];
175    GLint64 value_int64;
176    GLenum value_enum;
177
178    /* Sigh, see GL_COMPRESSED_TEXTURE_FORMATS_ARB handling */
179    struct {
180       GLint n, ints[100];
181    } value_int_n;
182    GLboolean value_bool;
183 };
184
185 #define BUFFER_FIELD(field, type) \
186    LOC_BUFFER, type, offsetof(struct gl_framebuffer, field)
187 #define CONTEXT_FIELD(field, type) \
188    LOC_CONTEXT, type, offsetof(struct gl_context, field)
189 #define ARRAY_FIELD(field, type) \
190    LOC_ARRAY, type, offsetof(struct gl_vertex_array_object, field)
191 #undef CONST /* already defined through windows.h */
192 #define CONST(value) \
193    LOC_CONTEXT, TYPE_CONST, value
194
195 #define BUFFER_INT(field) BUFFER_FIELD(field, TYPE_INT)
196 #define BUFFER_ENUM(field) BUFFER_FIELD(field, TYPE_ENUM)
197 #define BUFFER_BOOL(field) BUFFER_FIELD(field, TYPE_BOOLEAN)
198
199 #define CONTEXT_INT(field) CONTEXT_FIELD(field, TYPE_INT)
200 #define CONTEXT_INT2(field) CONTEXT_FIELD(field, TYPE_INT_2)
201 #define CONTEXT_INT64(field) CONTEXT_FIELD(field, TYPE_INT64)
202 #define CONTEXT_ENUM(field) CONTEXT_FIELD(field, TYPE_ENUM)
203 #define CONTEXT_ENUM2(field) CONTEXT_FIELD(field, TYPE_ENUM_2)
204 #define CONTEXT_BOOL(field) CONTEXT_FIELD(field, TYPE_BOOLEAN)
205 #define CONTEXT_BIT0(field) CONTEXT_FIELD(field, TYPE_BIT_0)
206 #define CONTEXT_BIT1(field) CONTEXT_FIELD(field, TYPE_BIT_1)
207 #define CONTEXT_BIT2(field) CONTEXT_FIELD(field, TYPE_BIT_2)
208 #define CONTEXT_BIT3(field) CONTEXT_FIELD(field, TYPE_BIT_3)
209 #define CONTEXT_BIT4(field) CONTEXT_FIELD(field, TYPE_BIT_4)
210 #define CONTEXT_BIT5(field) CONTEXT_FIELD(field, TYPE_BIT_5)
211 #define CONTEXT_BIT6(field) CONTEXT_FIELD(field, TYPE_BIT_6)
212 #define CONTEXT_BIT7(field) CONTEXT_FIELD(field, TYPE_BIT_7)
213 #define CONTEXT_FLOAT(field) CONTEXT_FIELD(field, TYPE_FLOAT)
214 #define CONTEXT_FLOAT2(field) CONTEXT_FIELD(field, TYPE_FLOAT_2)
215 #define CONTEXT_FLOAT3(field) CONTEXT_FIELD(field, TYPE_FLOAT_3)
216 #define CONTEXT_FLOAT4(field) CONTEXT_FIELD(field, TYPE_FLOAT_4)
217 #define CONTEXT_MATRIX(field) CONTEXT_FIELD(field, TYPE_MATRIX)
218 #define CONTEXT_MATRIX_T(field) CONTEXT_FIELD(field, TYPE_MATRIX_T)
219
220 #define ARRAY_INT(field) ARRAY_FIELD(field, TYPE_INT)
221 #define ARRAY_ENUM(field) ARRAY_FIELD(field, TYPE_ENUM)
222 #define ARRAY_BOOL(field) ARRAY_FIELD(field, TYPE_BOOLEAN)
223
224 #define EXT(f)                                  \
225    offsetof(struct gl_extensions, f)
226
227 #define EXTRA_EXT(e)                            \
228    static const int extra_##e[] = {             \
229       EXT(e), EXTRA_END                         \
230    }
231
232 #define EXTRA_EXT2(e1, e2)                      \
233    static const int extra_##e1##_##e2[] = {     \
234       EXT(e1), EXT(e2), EXTRA_END               \
235    }
236
237 /* The 'extra' mechanism is a way to specify extra checks (such as
238  * extensions or specific gl versions) or actions (flush current, new
239  * buffers) that we need to do before looking up an enum.  We need to
240  * declare them all up front so we can refer to them in the value_desc
241  * structs below.
242  *
243  * Each EXTRA_ will be executed.  For EXTRA_* enums of extensions and API
244  * versions, listing multiple ones in an array means an error will be thrown
245  * only if none of them are available.  If you need to check for "AND"
246  * behavior, you would need to make a custom EXTRA_ enum.
247  */
248
249 static const int extra_new_buffers[] = {
250    EXTRA_NEW_BUFFERS,
251    EXTRA_END
252 };
253
254 static const int extra_new_frag_clamp[] = {
255    EXTRA_NEW_FRAG_CLAMP,
256    EXTRA_END
257 };
258
259 static const int extra_valid_draw_buffer[] = {
260    EXTRA_VALID_DRAW_BUFFER,
261    EXTRA_END
262 };
263
264 static const int extra_valid_texture_unit[] = {
265    EXTRA_VALID_TEXTURE_UNIT,
266    EXTRA_END
267 };
268
269 static const int extra_valid_clip_distance[] = {
270    EXTRA_VALID_CLIP_DISTANCE,
271    EXTRA_END
272 };
273
274 static const int extra_flush_current_valid_texture_unit[] = {
275    EXTRA_FLUSH_CURRENT,
276    EXTRA_VALID_TEXTURE_UNIT,
277    EXTRA_END
278 };
279
280 static const int extra_flush_current[] = {
281    EXTRA_FLUSH_CURRENT,
282    EXTRA_END
283 };
284
285 static const int extra_EXT_texture_integer_and_new_buffers[] = {
286    EXT(EXT_texture_integer),
287    EXTRA_NEW_BUFFERS,
288    EXTRA_END
289 };
290
291 static const int extra_GLSL_130_es3[] = {
292    EXTRA_GLSL_130,
293    EXTRA_API_ES3,
294    EXTRA_END
295 };
296
297 static const int extra_texture_buffer_object[] = {
298    EXTRA_API_GL_CORE,
299    EXTRA_VERSION_31,
300    EXT(ARB_texture_buffer_object),
301    EXTRA_END
302 };
303
304 static const int extra_ARB_transform_feedback2_api_es3[] = {
305    EXT(ARB_transform_feedback2),
306    EXTRA_API_ES3,
307    EXTRA_END
308 };
309
310 static const int extra_ARB_uniform_buffer_object_and_geometry_shader[] = {
311    EXTRA_EXT_UBO_GS4,
312    EXTRA_END
313 };
314
315 static const int extra_ARB_ES2_compatibility_api_es2[] = {
316    EXT(ARB_ES2_compatibility),
317    EXTRA_API_ES2,
318    EXTRA_END
319 };
320
321 static const int extra_ARB_ES3_compatibility_api_es3[] = {
322    EXT(ARB_ES3_compatibility),
323    EXTRA_API_ES3,
324    EXTRA_END
325 };
326
327 static const int extra_EXT_framebuffer_sRGB_and_new_buffers[] = {
328    EXT(EXT_framebuffer_sRGB),
329    EXTRA_NEW_BUFFERS,
330    EXTRA_END
331 };
332
333 static const int extra_EXT_packed_float[] = {
334    EXT(EXT_packed_float),
335    EXTRA_NEW_BUFFERS,
336    EXTRA_END
337 };
338
339 static const int extra_EXT_texture_array_es3[] = {
340    EXT(EXT_texture_array),
341    EXTRA_API_ES3,
342    EXTRA_END
343 };
344
345 static const int extra_ARB_shader_atomic_counters_and_geometry_shader[] = {
346    EXTRA_EXT_ATOMICS_GS4,
347    EXTRA_END
348 };
349
350 static const int extra_ARB_shader_image_load_store_and_geometry_shader[] = {
351    EXTRA_EXT_SHADER_IMAGE_GS4,
352    EXTRA_END
353 };
354
355 static const int extra_ARB_shader_atomic_counters_and_tessellation[] = {
356    EXTRA_EXT_ATOMICS_TESS,
357    EXTRA_END
358 };
359
360 static const int extra_ARB_shader_image_load_store_and_tessellation[] = {
361    EXTRA_EXT_SHADER_IMAGE_TESS,
362    EXTRA_END
363 };
364
365 /* HACK: remove when ARB_compute_shader is actually supported */
366 static const int extra_ARB_compute_shader_es31[] = {
367    EXT(ARB_compute_shader),
368    EXTRA_API_ES31,
369    EXTRA_END
370 };
371
372 EXTRA_EXT(ARB_texture_cube_map);
373 EXTRA_EXT(EXT_texture_array);
374 EXTRA_EXT(NV_fog_distance);
375 EXTRA_EXT(EXT_texture_filter_anisotropic);
376 EXTRA_EXT(NV_point_sprite);
377 EXTRA_EXT(NV_texture_rectangle);
378 EXTRA_EXT(EXT_stencil_two_side);
379 EXTRA_EXT(EXT_depth_bounds_test);
380 EXTRA_EXT(ARB_depth_clamp);
381 EXTRA_EXT(ATI_fragment_shader);
382 EXTRA_EXT(EXT_provoking_vertex);
383 EXTRA_EXT(ARB_fragment_shader);
384 EXTRA_EXT(ARB_fragment_program);
385 EXTRA_EXT2(ARB_framebuffer_object, EXT_framebuffer_multisample);
386 EXTRA_EXT(ARB_seamless_cube_map);
387 EXTRA_EXT(ARB_sync);
388 EXTRA_EXT(ARB_vertex_shader);
389 EXTRA_EXT(EXT_transform_feedback);
390 EXTRA_EXT(ARB_transform_feedback3);
391 EXTRA_EXT(EXT_pixel_buffer_object);
392 EXTRA_EXT(ARB_vertex_program);
393 EXTRA_EXT2(NV_point_sprite, ARB_point_sprite);
394 EXTRA_EXT2(ARB_vertex_program, ARB_fragment_program);
395 EXTRA_EXT(ARB_geometry_shader4);
396 EXTRA_EXT(ARB_color_buffer_float);
397 EXTRA_EXT(EXT_framebuffer_sRGB);
398 EXTRA_EXT(OES_EGL_image_external);
399 EXTRA_EXT(ARB_blend_func_extended);
400 EXTRA_EXT(ARB_uniform_buffer_object);
401 EXTRA_EXT(ARB_timer_query);
402 EXTRA_EXT(ARB_texture_cube_map_array);
403 EXTRA_EXT(ARB_texture_buffer_range);
404 EXTRA_EXT(ARB_texture_multisample);
405 EXTRA_EXT(ARB_texture_gather);
406 EXTRA_EXT(ARB_shader_atomic_counters);
407 EXTRA_EXT(ARB_draw_indirect);
408 EXTRA_EXT(ARB_shader_image_load_store);
409 EXTRA_EXT(ARB_viewport_array);
410 EXTRA_EXT(ARB_compute_shader);
411 EXTRA_EXT(ARB_gpu_shader5);
412 EXTRA_EXT2(ARB_transform_feedback3, ARB_gpu_shader5);
413 EXTRA_EXT(INTEL_performance_query);
414 EXTRA_EXT(ARB_explicit_uniform_location);
415 EXTRA_EXT(ARB_clip_control);
416 EXTRA_EXT(EXT_polygon_offset_clamp);
417 EXTRA_EXT(ARB_framebuffer_no_attachments);
418 EXTRA_EXT(ARB_tessellation_shader);
419 EXTRA_EXT(ARB_shader_subroutine);
420
421 static const int
422 extra_ARB_color_buffer_float_or_glcore[] = {
423    EXT(ARB_color_buffer_float),
424    EXTRA_API_GL_CORE,
425    EXTRA_END
426 };
427
428 static const int
429 extra_NV_primitive_restart[] = {
430    EXT(NV_primitive_restart),
431    EXTRA_END
432 };
433
434 static const int extra_version_30[] = { EXTRA_VERSION_30, EXTRA_END };
435 static const int extra_version_31[] = { EXTRA_VERSION_31, EXTRA_END };
436 static const int extra_version_32[] = { EXTRA_VERSION_32, EXTRA_END };
437 static const int extra_version_40[] = { EXTRA_VERSION_40, EXTRA_END };
438
439 static const int extra_gl30_es3[] = {
440     EXTRA_VERSION_30,
441     EXTRA_API_ES3,
442     EXTRA_END,
443 };
444
445 static const int extra_gl32_es3[] = {
446     EXTRA_VERSION_32,
447     EXTRA_API_ES3,
448     EXTRA_END,
449 };
450
451 static const int extra_gl32_ARB_geometry_shader4[] = {
452     EXTRA_VERSION_32,
453     EXT(ARB_geometry_shader4),
454     EXTRA_END
455 };
456
457 static const int extra_gl40_ARB_sample_shading[] = {
458    EXTRA_VERSION_40,
459    EXT(ARB_sample_shading),
460    EXTRA_END
461 };
462
463 static const int
464 extra_ARB_vertex_program_api_es2[] = {
465    EXT(ARB_vertex_program),
466    EXTRA_API_ES2,
467    EXTRA_END
468 };
469
470 /* The ReadBuffer get token is valid under either full GL or under
471  * GLES2 if the NV_read_buffer extension is available. */
472 static const int
473 extra_NV_read_buffer_api_gl[] = {
474    EXTRA_API_ES2,
475    EXTRA_API_GL,
476    EXTRA_END
477 };
478
479 static const int extra_core_ARB_color_buffer_float_and_new_buffers[] = {
480    EXTRA_API_GL_CORE,
481    EXT(ARB_color_buffer_float),
482    EXTRA_NEW_BUFFERS,
483    EXTRA_END
484 };
485
486 /* This is the big table describing all the enums we accept in
487  * glGet*v().  The table is partitioned into six parts: enums
488  * understood by all GL APIs (OpenGL, GLES and GLES2), enums shared
489  * between OpenGL and GLES, enums exclusive to GLES, etc for the
490  * remaining combinations. To look up the enums valid in a given API
491  * we will use a hash table specific to that API. These tables are in
492  * turn generated at build time and included through get_hash.h.
493  */
494
495 #include "get_hash.h"
496
497 /* All we need now is a way to look up the value struct from the enum.
498  * The code generated by gcc for the old generated big switch
499  * statement is a big, balanced, open coded if/else tree, essentially
500  * an unrolled binary search.  It would be natural to sort the new
501  * enum table and use bsearch(), but we will use a read-only hash
502  * table instead.  bsearch() has a nice guaranteed worst case
503  * performance, but we're also guaranteed to hit that worst case
504  * (log2(n) iterations) for about half the enums.  Instead, using an
505  * open addressing hash table, we can find the enum on the first try
506  * for 80% of the enums, 1 collision for 10% and never more than 5
507  * collisions for any enum (typical numbers).  And the code is very
508  * simple, even though it feels a little magic. */
509
510 #ifdef GET_DEBUG
511 static void
512 print_table_stats(int api)
513 {
514    int i, j, collisions[11], count, hash, mask;
515    const struct value_desc *d;
516    const char *api_names[] = {
517       [API_OPENGL_COMPAT] = "GL",
518       [API_OPENGL_CORE] = "GL_CORE",
519       [API_OPENGLES] = "GLES",
520       [API_OPENGLES2] = "GLES2",
521    };
522    const char *api_name;
523
524    api_name = api < ARRAY_SIZE(api_names) ? api_names[api] : "N/A";
525    count = 0;
526    mask = ARRAY_SIZE(table(api)) - 1;
527    memset(collisions, 0, sizeof collisions);
528
529    for (i = 0; i < ARRAY_SIZE(table(api)); i++) {
530       if (!table(api)[i])
531          continue;
532       count++;
533       d = &values[table(api)[i]];
534       hash = (d->pname * prime_factor);
535       j = 0;
536       while (1) {
537          if (values[table(api)[hash & mask]].pname == d->pname)
538             break;
539          hash += prime_step;
540          j++;
541       }
542
543       if (j < 10)
544          collisions[j]++;
545       else
546          collisions[10]++;
547    }
548
549    printf("number of enums for %s: %d (total %ld)\n",
550          api_name, count, ARRAY_SIZE(values));
551    for (i = 0; i < ARRAY_SIZE(collisions) - 1; i++)
552       if (collisions[i] > 0)
553          printf("  %d enums with %d %scollisions\n",
554                collisions[i], i, i == 10 ? "or more " : "");
555 }
556 #endif
557
558 /**
559  * Initialize the enum hash for a given API 
560  *
561  * This is called from one_time_init() to insert the enum values that
562  * are valid for the API in question into the enum hash table.
563  *
564  * \param the current context, for determining the API in question
565  */
566 void _mesa_init_get_hash(struct gl_context *ctx)
567 {
568 #ifdef GET_DEBUG
569    print_table_stats(ctx->API);
570 #else
571    (void) ctx;
572 #endif
573 }
574
575 /**
576  * Handle irregular enums
577  *
578  * Some values don't conform to the "well-known type at context
579  * pointer + offset" pattern, so we have this function to catch all
580  * the corner cases.  Typically, it's a computed value or a one-off
581  * pointer to a custom struct or something.
582  *
583  * In this case we can't return a pointer to the value, so we'll have
584  * to use the temporary variable 'v' declared back in the calling
585  * glGet*v() function to store the result.
586  *
587  * \param ctx the current context
588  * \param d the struct value_desc that describes the enum
589  * \param v pointer to the tmp declared in the calling glGet*v() function
590  */
591 static void
592 find_custom_value(struct gl_context *ctx, const struct value_desc *d, union value *v)
593 {
594    struct gl_buffer_object **buffer_obj;
595    struct gl_vertex_attrib_array *array;
596    GLuint unit, *p;
597
598    switch (d->pname) {
599    case GL_MAJOR_VERSION:
600       v->value_int = ctx->Version / 10;
601       break;
602    case GL_MINOR_VERSION:
603       v->value_int = ctx->Version % 10;
604       break;
605
606    case GL_TEXTURE_1D:
607    case GL_TEXTURE_2D:
608    case GL_TEXTURE_3D:
609    case GL_TEXTURE_CUBE_MAP_ARB:
610    case GL_TEXTURE_RECTANGLE_NV:
611    case GL_TEXTURE_EXTERNAL_OES:
612       v->value_bool = _mesa_IsEnabled(d->pname);
613       break;
614
615    case GL_LINE_STIPPLE_PATTERN:
616       /* This is the only GLushort, special case it here by promoting
617        * to an int rather than introducing a new type. */
618       v->value_int = ctx->Line.StipplePattern;
619       break;
620
621    case GL_CURRENT_RASTER_TEXTURE_COORDS:
622       unit = ctx->Texture.CurrentUnit;
623       v->value_float_4[0] = ctx->Current.RasterTexCoords[unit][0];
624       v->value_float_4[1] = ctx->Current.RasterTexCoords[unit][1];
625       v->value_float_4[2] = ctx->Current.RasterTexCoords[unit][2];
626       v->value_float_4[3] = ctx->Current.RasterTexCoords[unit][3];
627       break;
628
629    case GL_CURRENT_TEXTURE_COORDS:
630       unit = ctx->Texture.CurrentUnit;
631       v->value_float_4[0] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][0];
632       v->value_float_4[1] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][1];
633       v->value_float_4[2] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][2];
634       v->value_float_4[3] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][3];
635       break;
636
637    case GL_COLOR_WRITEMASK:
638       v->value_int_4[0] = ctx->Color.ColorMask[0][RCOMP] ? 1 : 0;
639       v->value_int_4[1] = ctx->Color.ColorMask[0][GCOMP] ? 1 : 0;
640       v->value_int_4[2] = ctx->Color.ColorMask[0][BCOMP] ? 1 : 0;
641       v->value_int_4[3] = ctx->Color.ColorMask[0][ACOMP] ? 1 : 0;
642       break;
643
644    case GL_EDGE_FLAG:
645       v->value_bool = ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG][0] == 1.0F;
646       break;
647
648    case GL_READ_BUFFER:
649       v->value_enum = ctx->ReadBuffer->ColorReadBuffer;
650       break;
651
652    case GL_MAP2_GRID_DOMAIN:
653       v->value_float_4[0] = ctx->Eval.MapGrid2u1;
654       v->value_float_4[1] = ctx->Eval.MapGrid2u2;
655       v->value_float_4[2] = ctx->Eval.MapGrid2v1;
656       v->value_float_4[3] = ctx->Eval.MapGrid2v2;
657       break;
658
659    case GL_TEXTURE_STACK_DEPTH:
660       unit = ctx->Texture.CurrentUnit;
661       v->value_int = ctx->TextureMatrixStack[unit].Depth + 1;
662       break;
663    case GL_TEXTURE_MATRIX:
664       unit = ctx->Texture.CurrentUnit;
665       v->value_matrix = ctx->TextureMatrixStack[unit].Top;
666       break;
667
668    case GL_TEXTURE_COORD_ARRAY:
669    case GL_TEXTURE_COORD_ARRAY_SIZE:
670    case GL_TEXTURE_COORD_ARRAY_TYPE:
671    case GL_TEXTURE_COORD_ARRAY_STRIDE:
672       array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)];
673       v->value_int = *(GLuint *) ((char *) array + d->offset);
674       break;
675
676    case GL_ACTIVE_TEXTURE_ARB:
677       v->value_int = GL_TEXTURE0_ARB + ctx->Texture.CurrentUnit;
678       break;
679    case GL_CLIENT_ACTIVE_TEXTURE_ARB:
680       v->value_int = GL_TEXTURE0_ARB + ctx->Array.ActiveTexture;
681       break;
682
683    case GL_MODELVIEW_STACK_DEPTH:
684    case GL_PROJECTION_STACK_DEPTH:
685       v->value_int = *(GLint *) ((char *) ctx + d->offset) + 1;
686       break;
687
688    case GL_MAX_TEXTURE_SIZE:
689    case GL_MAX_3D_TEXTURE_SIZE:
690    case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:
691       p = (GLuint *) ((char *) ctx + d->offset);
692       v->value_int = 1 << (*p - 1);
693       break;
694
695    case GL_SCISSOR_BOX:
696       v->value_int_4[0] = ctx->Scissor.ScissorArray[0].X;
697       v->value_int_4[1] = ctx->Scissor.ScissorArray[0].Y;
698       v->value_int_4[2] = ctx->Scissor.ScissorArray[0].Width;
699       v->value_int_4[3] = ctx->Scissor.ScissorArray[0].Height;
700       break;
701
702    case GL_SCISSOR_TEST:
703       v->value_bool = ctx->Scissor.EnableFlags & 1;
704       break;
705
706    case GL_LIST_INDEX:
707       v->value_int =
708          ctx->ListState.CurrentList ? ctx->ListState.CurrentList->Name : 0;
709       break;
710    case GL_LIST_MODE:
711       if (!ctx->CompileFlag)
712          v->value_enum = 0;
713       else if (ctx->ExecuteFlag)
714          v->value_enum = GL_COMPILE_AND_EXECUTE;
715       else
716          v->value_enum = GL_COMPILE;
717       break;
718
719    case GL_VIEWPORT:
720       v->value_float_4[0] = ctx->ViewportArray[0].X;
721       v->value_float_4[1] = ctx->ViewportArray[0].Y;
722       v->value_float_4[2] = ctx->ViewportArray[0].Width;
723       v->value_float_4[3] = ctx->ViewportArray[0].Height;
724       break;
725
726    case GL_DEPTH_RANGE:
727       v->value_double_2[0] = ctx->ViewportArray[0].Near;
728       v->value_double_2[1] = ctx->ViewportArray[0].Far;
729       break;
730
731    case GL_ACTIVE_STENCIL_FACE_EXT:
732       v->value_enum = ctx->Stencil.ActiveFace ? GL_BACK : GL_FRONT;
733       break;
734
735    case GL_STENCIL_FAIL:
736       v->value_enum = ctx->Stencil.FailFunc[ctx->Stencil.ActiveFace];
737       break;
738    case GL_STENCIL_FUNC:
739       v->value_enum = ctx->Stencil.Function[ctx->Stencil.ActiveFace];
740       break;
741    case GL_STENCIL_PASS_DEPTH_FAIL:
742       v->value_enum = ctx->Stencil.ZFailFunc[ctx->Stencil.ActiveFace];
743       break;
744    case GL_STENCIL_PASS_DEPTH_PASS:
745       v->value_enum = ctx->Stencil.ZPassFunc[ctx->Stencil.ActiveFace];
746       break;
747    case GL_STENCIL_REF:
748       v->value_int = _mesa_get_stencil_ref(ctx, ctx->Stencil.ActiveFace);
749       break;
750    case GL_STENCIL_BACK_REF:
751       v->value_int = _mesa_get_stencil_ref(ctx, 1);
752       break;
753    case GL_STENCIL_VALUE_MASK:
754       v->value_int = ctx->Stencil.ValueMask[ctx->Stencil.ActiveFace];
755       break;
756    case GL_STENCIL_WRITEMASK:
757       v->value_int = ctx->Stencil.WriteMask[ctx->Stencil.ActiveFace];
758       break;
759
760    case GL_NUM_EXTENSIONS:
761       v->value_int = _mesa_get_extension_count(ctx);
762       break;
763
764    case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
765       v->value_int = _mesa_get_color_read_type(ctx);
766       break;
767    case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
768       v->value_int = _mesa_get_color_read_format(ctx);
769       break;
770
771    case GL_CURRENT_MATRIX_STACK_DEPTH_ARB:
772       v->value_int = ctx->CurrentStack->Depth + 1;
773       break;
774    case GL_CURRENT_MATRIX_ARB:
775    case GL_TRANSPOSE_CURRENT_MATRIX_ARB:
776       v->value_matrix = ctx->CurrentStack->Top;
777       break;
778
779    case GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB:
780       v->value_int = _mesa_get_compressed_formats(ctx, NULL);
781       break;
782    case GL_COMPRESSED_TEXTURE_FORMATS_ARB:
783       v->value_int_n.n = 
784          _mesa_get_compressed_formats(ctx, v->value_int_n.ints);
785       assert(v->value_int_n.n <= (int) ARRAY_SIZE(v->value_int_n.ints));
786       break;
787
788    case GL_MAX_VARYING_FLOATS_ARB:
789       v->value_int = ctx->Const.MaxVarying * 4;
790       break;
791
792    /* Various object names */
793
794    case GL_TEXTURE_BINDING_1D:
795    case GL_TEXTURE_BINDING_2D:
796    case GL_TEXTURE_BINDING_3D:
797    case GL_TEXTURE_BINDING_1D_ARRAY_EXT:
798    case GL_TEXTURE_BINDING_2D_ARRAY_EXT:
799    case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
800    case GL_TEXTURE_BINDING_RECTANGLE_NV:
801    case GL_TEXTURE_BINDING_EXTERNAL_OES:
802    case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
803    case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
804    case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
805       unit = ctx->Texture.CurrentUnit;
806       v->value_int =
807          ctx->Texture.Unit[unit].CurrentTex[d->offset]->Name;
808       break;
809
810    /* GL_EXT_packed_float */
811    case GL_RGBA_SIGNED_COMPONENTS_EXT:
812       {
813          /* Note: we only check the 0th color attachment. */
814          const struct gl_renderbuffer *rb =
815             ctx->DrawBuffer->_ColorDrawBuffers[0];
816          if (rb && _mesa_is_format_signed(rb->Format)) {
817             /* Issue 17 of GL_EXT_packed_float:  If a component (such as
818              * alpha) has zero bits, the component should not be considered
819              * signed and so the bit for the respective component should be
820              * zeroed.
821              */
822             GLint r_bits =
823                _mesa_get_format_bits(rb->Format, GL_RED_BITS);
824             GLint g_bits =
825                _mesa_get_format_bits(rb->Format, GL_GREEN_BITS);
826             GLint b_bits =
827                _mesa_get_format_bits(rb->Format, GL_BLUE_BITS);
828             GLint a_bits =
829                _mesa_get_format_bits(rb->Format, GL_ALPHA_BITS);
830             GLint l_bits =
831                _mesa_get_format_bits(rb->Format, GL_TEXTURE_LUMINANCE_SIZE);
832             GLint i_bits =
833                _mesa_get_format_bits(rb->Format, GL_TEXTURE_INTENSITY_SIZE);
834
835             v->value_int_4[0] = r_bits + l_bits + i_bits > 0;
836             v->value_int_4[1] = g_bits + l_bits + i_bits > 0;
837             v->value_int_4[2] = b_bits + l_bits + i_bits > 0;
838             v->value_int_4[3] = a_bits + i_bits > 0;
839          }
840          else {
841             v->value_int_4[0] =
842             v->value_int_4[1] =
843             v->value_int_4[2] =
844             v->value_int_4[3] = 0;
845          }
846       }
847       break;
848
849    /* GL_ARB_vertex_buffer_object */
850    case GL_VERTEX_ARRAY_BUFFER_BINDING_ARB:
851    case GL_NORMAL_ARRAY_BUFFER_BINDING_ARB:
852    case GL_COLOR_ARRAY_BUFFER_BINDING_ARB:
853    case GL_INDEX_ARRAY_BUFFER_BINDING_ARB:
854    case GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB:
855    case GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB:
856    case GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB:
857       buffer_obj = (struct gl_buffer_object **)
858          ((char *) ctx->Array.VAO + d->offset);
859       v->value_int = (*buffer_obj)->Name;
860       break;
861    case GL_ARRAY_BUFFER_BINDING_ARB:
862       v->value_int = ctx->Array.ArrayBufferObj->Name;
863       break;
864    case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB:
865       v->value_int =
866          ctx->Array.VAO->VertexBinding[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].BufferObj->Name;
867       break;
868    case GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB:
869       v->value_int = ctx->Array.VAO->IndexBufferObj->Name;
870       break;
871
872    /* ARB_vertex_array_bgra */
873    case GL_COLOR_ARRAY_SIZE:
874       array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR0];
875       v->value_int = array->Format == GL_BGRA ? GL_BGRA : array->Size;
876       break;
877    case GL_SECONDARY_COLOR_ARRAY_SIZE:
878       array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR1];
879       v->value_int = array->Format == GL_BGRA ? GL_BGRA : array->Size;
880       break;
881
882    /* ARB_copy_buffer */
883    case GL_COPY_READ_BUFFER:
884       v->value_int = ctx->CopyReadBuffer->Name;
885       break;
886    case GL_COPY_WRITE_BUFFER:
887       v->value_int = ctx->CopyWriteBuffer->Name;
888       break;
889
890    case GL_PIXEL_PACK_BUFFER_BINDING_EXT:
891       v->value_int = ctx->Pack.BufferObj->Name;
892       break;
893    case GL_PIXEL_UNPACK_BUFFER_BINDING_EXT:
894       v->value_int = ctx->Unpack.BufferObj->Name;
895       break;
896    case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
897       v->value_int = ctx->TransformFeedback.CurrentBuffer->Name;
898       break;
899    case GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED:
900       v->value_int = ctx->TransformFeedback.CurrentObject->Paused;
901       break;
902    case GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE:
903       v->value_int = ctx->TransformFeedback.CurrentObject->Active;
904       break;
905    case GL_TRANSFORM_FEEDBACK_BINDING:
906       v->value_int = ctx->TransformFeedback.CurrentObject->Name;
907       break;
908    case GL_CURRENT_PROGRAM:
909       /* The Changelog of the ARB_separate_shader_objects spec says:
910        *
911        * 24 25 Jul 2011  pbrown  Remove the language erroneously deleting
912        *                         CURRENT_PROGRAM.  In the EXT extension, this
913        *                         token was aliased to ACTIVE_PROGRAM_EXT, and
914        *                         was used to indicate the last program set by
915        *                         either ActiveProgramEXT or UseProgram.  In
916        *                         the ARB extension, the SSO active programs
917        *                         are now program pipeline object state and
918        *                         CURRENT_PROGRAM should still be used to query
919        *                         the last program set by UseProgram (bug 7822).
920        */
921       v->value_int =
922          ctx->Shader.ActiveProgram ? ctx->Shader.ActiveProgram->Name : 0;
923       break;
924    case GL_READ_FRAMEBUFFER_BINDING_EXT:
925       v->value_int = ctx->ReadBuffer->Name;
926       break;
927    case GL_RENDERBUFFER_BINDING_EXT:
928       v->value_int =
929          ctx->CurrentRenderbuffer ? ctx->CurrentRenderbuffer->Name : 0;
930       break;
931    case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
932       v->value_int = ctx->Array.VAO->VertexBinding[VERT_ATTRIB_POINT_SIZE].BufferObj->Name;
933       break;
934
935    case GL_FOG_COLOR:
936       if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer))
937          COPY_4FV(v->value_float_4, ctx->Fog.Color);
938       else
939          COPY_4FV(v->value_float_4, ctx->Fog.ColorUnclamped);
940       break;
941    case GL_COLOR_CLEAR_VALUE:
942       if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer)) {
943          v->value_float_4[0] = CLAMP(ctx->Color.ClearColor.f[0], 0.0F, 1.0F);
944          v->value_float_4[1] = CLAMP(ctx->Color.ClearColor.f[1], 0.0F, 1.0F);
945          v->value_float_4[2] = CLAMP(ctx->Color.ClearColor.f[2], 0.0F, 1.0F);
946          v->value_float_4[3] = CLAMP(ctx->Color.ClearColor.f[3], 0.0F, 1.0F);
947       } else
948          COPY_4FV(v->value_float_4, ctx->Color.ClearColor.f);
949       break;
950    case GL_BLEND_COLOR_EXT:
951       if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer))
952          COPY_4FV(v->value_float_4, ctx->Color.BlendColor);
953       else
954          COPY_4FV(v->value_float_4, ctx->Color.BlendColorUnclamped);
955       break;
956    case GL_ALPHA_TEST_REF:
957       if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer))
958          v->value_float = ctx->Color.AlphaRef;
959       else
960          v->value_float = ctx->Color.AlphaRefUnclamped;
961       break;
962    case GL_MAX_VERTEX_UNIFORM_VECTORS:
963       v->value_int = ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents / 4;
964       break;
965
966    case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
967       v->value_int = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents / 4;
968       break;
969
970    /* GL_ARB_texture_buffer_object */
971    case GL_TEXTURE_BUFFER_ARB:
972       v->value_int = ctx->Texture.BufferObject->Name;
973       break;
974    case GL_TEXTURE_BINDING_BUFFER_ARB:
975       unit = ctx->Texture.CurrentUnit;
976       v->value_int =
977          ctx->Texture.Unit[unit].CurrentTex[TEXTURE_BUFFER_INDEX]->Name;
978       break;
979    case GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB:
980       {
981          struct gl_buffer_object *buf =
982             ctx->Texture.Unit[ctx->Texture.CurrentUnit]
983             .CurrentTex[TEXTURE_BUFFER_INDEX]->BufferObject;
984          v->value_int = buf ? buf->Name : 0;
985       }
986       break;
987    case GL_TEXTURE_BUFFER_FORMAT_ARB:
988       v->value_int = ctx->Texture.Unit[ctx->Texture.CurrentUnit]
989          .CurrentTex[TEXTURE_BUFFER_INDEX]->BufferObjectFormat;
990       break;
991
992    /* GL_ARB_sampler_objects */
993    case GL_SAMPLER_BINDING:
994       {
995          struct gl_sampler_object *samp =
996             ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler;
997
998          /*
999           * The sampler object may have been deleted on another context,
1000           * so we try to lookup the sampler object before returning its Name.
1001           */
1002          if (samp && _mesa_lookup_samplerobj(ctx, samp->Name)) {
1003             v->value_int = samp->Name;
1004          } else {
1005             v->value_int = 0;
1006          }
1007       }
1008       break;
1009    /* GL_ARB_uniform_buffer_object */
1010    case GL_UNIFORM_BUFFER_BINDING:
1011       v->value_int = ctx->UniformBuffer->Name;
1012       break;
1013    /* GL_ARB_timer_query */
1014    case GL_TIMESTAMP:
1015       if (ctx->Driver.GetTimestamp) {
1016          v->value_int64 = ctx->Driver.GetTimestamp(ctx);
1017       }
1018       else {
1019          _mesa_problem(ctx, "driver doesn't implement GetTimestamp");
1020       }
1021       break;
1022    /* GL_KHR_DEBUG */
1023    case GL_DEBUG_LOGGED_MESSAGES:
1024    case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
1025    case GL_DEBUG_GROUP_STACK_DEPTH:
1026       v->value_int = _mesa_get_debug_state_int(ctx, d->pname);
1027       break;
1028    /* GL_ARB_shader_atomic_counters */
1029    case GL_ATOMIC_COUNTER_BUFFER_BINDING:
1030       if (ctx->AtomicBuffer) {
1031          v->value_int = ctx->AtomicBuffer->Name;
1032       } else {
1033          v->value_int = 0;
1034       }
1035       break;
1036    /* GL_ARB_draw_indirect */
1037    case GL_DRAW_INDIRECT_BUFFER_BINDING:
1038       v->value_int = ctx->DrawIndirectBuffer->Name;
1039       break;
1040    /* GL_ARB_separate_shader_objects */
1041    case GL_PROGRAM_PIPELINE_BINDING:
1042       if (ctx->Pipeline.Current) {
1043          v->value_int = ctx->Pipeline.Current->Name;
1044       } else {
1045          v->value_int = 0;
1046       }
1047       break;
1048    }
1049 }
1050
1051 /**
1052  * Check extra constraints on a struct value_desc descriptor
1053  *
1054  * If a struct value_desc has a non-NULL extra pointer, it means that
1055  * there are a number of extra constraints to check or actions to
1056  * perform.  The extras is just an integer array where each integer
1057  * encode different constraints or actions.
1058  *
1059  * \param ctx current context
1060  * \param func name of calling glGet*v() function for error reporting
1061  * \param d the struct value_desc that has the extra constraints
1062  *
1063  * \return GL_FALSE if all of the constraints were not satisfied,
1064  *     otherwise GL_TRUE.
1065  */
1066 static GLboolean
1067 check_extra(struct gl_context *ctx, const char *func, const struct value_desc *d)
1068 {
1069    const GLuint version = ctx->Version;
1070    GLboolean api_check = GL_FALSE;
1071    GLboolean api_found = GL_FALSE;
1072    const int *e;
1073
1074    for (e = d->extra; *e != EXTRA_END; e++) {
1075       switch (*e) {
1076       case EXTRA_VERSION_30:
1077          api_check = GL_TRUE;
1078          if (version >= 30)
1079             api_found = GL_TRUE;
1080          break;
1081       case EXTRA_VERSION_31:
1082          api_check = GL_TRUE;
1083          if (version >= 31)
1084             api_found = GL_TRUE;
1085          break;
1086       case EXTRA_VERSION_32:
1087          api_check = GL_TRUE;
1088          if (version >= 32)
1089             api_found = GL_TRUE;
1090          break;
1091       case EXTRA_NEW_FRAG_CLAMP:
1092          if (ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
1093             _mesa_update_state(ctx);
1094          break;
1095       case EXTRA_API_ES2:
1096          api_check = GL_TRUE;
1097          if (ctx->API == API_OPENGLES2)
1098             api_found = GL_TRUE;
1099          break;
1100       case EXTRA_API_ES3:
1101          api_check = GL_TRUE;
1102          if (_mesa_is_gles3(ctx))
1103             api_found = GL_TRUE;
1104          break;
1105       case EXTRA_API_ES31:
1106          api_check = GL_TRUE;
1107          if (_mesa_is_gles31(ctx))
1108             api_found = GL_TRUE;
1109          break;
1110       case EXTRA_API_GL:
1111          api_check = GL_TRUE;
1112          if (_mesa_is_desktop_gl(ctx))
1113             api_found = GL_TRUE;
1114          break;
1115       case EXTRA_API_GL_CORE:
1116          api_check = GL_TRUE;
1117          if (ctx->API == API_OPENGL_CORE)
1118             api_found = GL_TRUE;
1119          break;
1120       case EXTRA_NEW_BUFFERS:
1121          if (ctx->NewState & _NEW_BUFFERS)
1122             _mesa_update_state(ctx);
1123          break;
1124       case EXTRA_FLUSH_CURRENT:
1125          FLUSH_CURRENT(ctx, 0);
1126          break;
1127       case EXTRA_VALID_DRAW_BUFFER:
1128          if (d->pname - GL_DRAW_BUFFER0_ARB >= ctx->Const.MaxDrawBuffers) {
1129             _mesa_error(ctx, GL_INVALID_OPERATION, "%s(draw buffer %u)",
1130                         func, d->pname - GL_DRAW_BUFFER0_ARB);
1131             return GL_FALSE;
1132          }
1133          break;
1134       case EXTRA_VALID_TEXTURE_UNIT:
1135          if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
1136             _mesa_error(ctx, GL_INVALID_OPERATION, "%s(texture %u)",
1137                         func, ctx->Texture.CurrentUnit);
1138             return GL_FALSE;
1139          }
1140          break;
1141       case EXTRA_VALID_CLIP_DISTANCE:
1142          if (d->pname - GL_CLIP_DISTANCE0 >= ctx->Const.MaxClipPlanes) {
1143             _mesa_error(ctx, GL_INVALID_ENUM, "%s(clip distance %u)",
1144                         func, d->pname - GL_CLIP_DISTANCE0);
1145             return GL_FALSE;
1146          }
1147          break;
1148       case EXTRA_GLSL_130:
1149          api_check = GL_TRUE;
1150          if (ctx->Const.GLSLVersion >= 130)
1151             api_found = GL_TRUE;
1152          break;
1153       case EXTRA_EXT_UBO_GS4:
1154          api_check = GL_TRUE;
1155          api_found = (ctx->Extensions.ARB_uniform_buffer_object &&
1156                       _mesa_has_geometry_shaders(ctx));
1157          break;
1158       case EXTRA_EXT_ATOMICS_GS4:
1159          api_check = GL_TRUE;
1160          api_found = (ctx->Extensions.ARB_shader_atomic_counters &&
1161                       _mesa_has_geometry_shaders(ctx));
1162          break;
1163       case EXTRA_EXT_SHADER_IMAGE_GS4:
1164          api_check = GL_TRUE;
1165          api_found = (ctx->Extensions.ARB_shader_image_load_store &&
1166                       _mesa_has_geometry_shaders(ctx));
1167          break;
1168       case EXTRA_EXT_ATOMICS_TESS:
1169          api_check = GL_TRUE;
1170          api_found = ctx->Extensions.ARB_shader_atomic_counters &&
1171                      _mesa_has_tessellation(ctx);
1172          break;
1173       case EXTRA_EXT_SHADER_IMAGE_TESS:
1174          api_check = GL_TRUE;
1175          api_found = ctx->Extensions.ARB_shader_image_load_store &&
1176                      _mesa_has_tessellation(ctx);
1177          break;
1178       case EXTRA_END:
1179          break;
1180       default: /* *e is a offset into the extension struct */
1181          api_check = GL_TRUE;
1182          if (*(GLboolean *) ((char *) &ctx->Extensions + *e))
1183             api_found = GL_TRUE;
1184          break;
1185       }
1186    }
1187
1188    if (api_check && !api_found) {
1189       _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)", func,
1190                   _mesa_enum_to_string(d->pname));
1191       return GL_FALSE;
1192    }
1193
1194    return GL_TRUE;
1195 }
1196
1197 static const struct value_desc error_value =
1198    { 0, 0, TYPE_INVALID, NO_OFFSET, NO_EXTRA };
1199
1200 /**
1201  * Find the struct value_desc corresponding to the enum 'pname'.
1202  * 
1203  * We hash the enum value to get an index into the 'table' array,
1204  * which holds the index in the 'values' array of struct value_desc.
1205  * Once we've found the entry, we do the extra checks, if any, then
1206  * look up the value and return a pointer to it.
1207  *
1208  * If the value has to be computed (for example, it's the result of a
1209  * function call or we need to add 1 to it), we use the tmp 'v' to
1210  * store the result.
1211  * 
1212  * \param func name of glGet*v() func for error reporting
1213  * \param pname the enum value we're looking up
1214  * \param p is were we return the pointer to the value
1215  * \param v a tmp union value variable in the calling glGet*v() function
1216  *
1217  * \return the struct value_desc corresponding to the enum or a struct
1218  *     value_desc of TYPE_INVALID if not found.  This lets the calling
1219  *     glGet*v() function jump right into a switch statement and
1220  *     handle errors there instead of having to check for NULL.
1221  */
1222 static const struct value_desc *
1223 find_value(const char *func, GLenum pname, void **p, union value *v)
1224 {
1225    GET_CURRENT_CONTEXT(ctx);
1226    struct gl_texture_unit *unit;
1227    int mask, hash;
1228    const struct value_desc *d;
1229    int api;
1230
1231    api = ctx->API;
1232    /* We index into the table_set[] list of per-API hash tables using the API's
1233     * value in the gl_api enum. Since GLES 3 doesn't have an API_OPENGL* enum
1234     * value since it's compatible with GLES2 its entry in table_set[] is at the
1235     * end.
1236     */
1237    STATIC_ASSERT(ARRAY_SIZE(table_set) == API_OPENGL_LAST + 3);
1238    if (_mesa_is_gles3(ctx)) {
1239       api = API_OPENGL_LAST + 1;
1240    }
1241    if (_mesa_is_gles31(ctx)) {
1242       api = API_OPENGL_LAST + 2;
1243    }
1244    mask = ARRAY_SIZE(table(api)) - 1;
1245    hash = (pname * prime_factor);
1246    while (1) {
1247       int idx = table(api)[hash & mask];
1248
1249       /* If the enum isn't valid, the hash walk ends with index 0,
1250        * pointing to the first entry of values[] which doesn't hold
1251        * any valid enum. */
1252       if (unlikely(idx == 0)) {
1253          _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)", func,
1254                _mesa_enum_to_string(pname));
1255          return &error_value;
1256       }
1257
1258       d = &values[idx];
1259       if (likely(d->pname == pname))
1260          break;
1261
1262       hash += prime_step;
1263    }
1264
1265    if (unlikely(d->extra && !check_extra(ctx, func, d)))
1266       return &error_value;
1267
1268    switch (d->location) {
1269    case LOC_BUFFER:
1270       *p = ((char *) ctx->DrawBuffer + d->offset);
1271       return d;
1272    case LOC_CONTEXT:
1273       *p = ((char *) ctx + d->offset);
1274       return d;
1275    case LOC_ARRAY:
1276       *p = ((char *) ctx->Array.VAO + d->offset);
1277       return d;
1278    case LOC_TEXUNIT:
1279       unit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit];
1280       *p = ((char *) unit + d->offset);
1281       return d;
1282    case LOC_CUSTOM:
1283       find_custom_value(ctx, d, v);
1284       *p = v;
1285       return d;
1286    default:
1287       assert(0);
1288       break;
1289    }
1290
1291    /* silence warning */
1292    return &error_value;
1293 }
1294
1295 static const int transpose[] = {
1296    0, 4,  8, 12,
1297    1, 5,  9, 13,
1298    2, 6, 10, 14,
1299    3, 7, 11, 15
1300 };
1301
1302 void GLAPIENTRY
1303 _mesa_GetBooleanv(GLenum pname, GLboolean *params)
1304 {
1305    const struct value_desc *d;
1306    union value v;
1307    GLmatrix *m;
1308    int shift, i;
1309    void *p;
1310
1311    d = find_value("glGetBooleanv", pname, &p, &v);
1312    switch (d->type) {
1313    case TYPE_INVALID:
1314       break;
1315    case TYPE_CONST:
1316       params[0] = INT_TO_BOOLEAN(d->offset);
1317       break;
1318
1319    case TYPE_FLOAT_4:
1320    case TYPE_FLOATN_4:
1321       params[3] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[3]);
1322    case TYPE_FLOAT_3:
1323    case TYPE_FLOATN_3:
1324       params[2] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[2]);
1325    case TYPE_FLOAT_2:
1326    case TYPE_FLOATN_2:
1327       params[1] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[1]);
1328    case TYPE_FLOAT:
1329    case TYPE_FLOATN:
1330       params[0] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[0]);
1331       break;
1332
1333    case TYPE_DOUBLEN_2:
1334       params[1] = FLOAT_TO_BOOLEAN(((GLdouble *) p)[1]);
1335    case TYPE_DOUBLEN:
1336       params[0] = FLOAT_TO_BOOLEAN(((GLdouble *) p)[0]);
1337       break;
1338
1339    case TYPE_INT_4:
1340       params[3] = INT_TO_BOOLEAN(((GLint *) p)[3]);
1341    case TYPE_INT_3:
1342       params[2] = INT_TO_BOOLEAN(((GLint *) p)[2]);
1343    case TYPE_INT_2:
1344    case TYPE_ENUM_2:
1345       params[1] = INT_TO_BOOLEAN(((GLint *) p)[1]);
1346    case TYPE_INT:
1347    case TYPE_ENUM:
1348       params[0] = INT_TO_BOOLEAN(((GLint *) p)[0]);
1349       break;
1350
1351    case TYPE_INT_N:
1352       for (i = 0; i < v.value_int_n.n; i++)
1353          params[i] = INT_TO_BOOLEAN(v.value_int_n.ints[i]);
1354       break;
1355
1356    case TYPE_INT64:
1357       params[0] = INT64_TO_BOOLEAN(((GLint64 *) p)[0]);
1358       break;
1359
1360    case TYPE_BOOLEAN:
1361       params[0] = ((GLboolean*) p)[0];
1362       break;            
1363
1364    case TYPE_MATRIX:
1365       m = *(GLmatrix **) p;
1366       for (i = 0; i < 16; i++)
1367          params[i] = FLOAT_TO_BOOLEAN(m->m[i]);
1368       break;
1369
1370    case TYPE_MATRIX_T:
1371       m = *(GLmatrix **) p;
1372       for (i = 0; i < 16; i++)
1373          params[i] = FLOAT_TO_BOOLEAN(m->m[transpose[i]]);
1374       break;
1375
1376    case TYPE_BIT_0:
1377    case TYPE_BIT_1:
1378    case TYPE_BIT_2:
1379    case TYPE_BIT_3:
1380    case TYPE_BIT_4:
1381    case TYPE_BIT_5:
1382    case TYPE_BIT_6:
1383    case TYPE_BIT_7:
1384       shift = d->type - TYPE_BIT_0;
1385       params[0] = (*(GLbitfield *) p >> shift) & 1;
1386       break;
1387    }
1388 }
1389
1390 void GLAPIENTRY
1391 _mesa_GetFloatv(GLenum pname, GLfloat *params)
1392 {
1393    const struct value_desc *d;
1394    union value v;
1395    GLmatrix *m;
1396    int shift, i;
1397    void *p;
1398
1399    d = find_value("glGetFloatv", pname, &p, &v);
1400    switch (d->type) {
1401    case TYPE_INVALID:
1402       break;
1403    case TYPE_CONST:
1404       params[0] = (GLfloat) d->offset;
1405       break;
1406
1407    case TYPE_FLOAT_4:
1408    case TYPE_FLOATN_4:
1409       params[3] = ((GLfloat *) p)[3];
1410    case TYPE_FLOAT_3:
1411    case TYPE_FLOATN_3:
1412       params[2] = ((GLfloat *) p)[2];
1413    case TYPE_FLOAT_2:
1414    case TYPE_FLOATN_2:
1415       params[1] = ((GLfloat *) p)[1];
1416    case TYPE_FLOAT:
1417    case TYPE_FLOATN:
1418       params[0] = ((GLfloat *) p)[0];
1419       break;
1420
1421    case TYPE_DOUBLEN_2:
1422       params[1] = (GLfloat) (((GLdouble *) p)[1]);
1423    case TYPE_DOUBLEN:
1424       params[0] = (GLfloat) (((GLdouble *) p)[0]);
1425       break;
1426
1427    case TYPE_INT_4:
1428       params[3] = (GLfloat) (((GLint *) p)[3]);
1429    case TYPE_INT_3:
1430       params[2] = (GLfloat) (((GLint *) p)[2]);
1431    case TYPE_INT_2:
1432    case TYPE_ENUM_2:
1433       params[1] = (GLfloat) (((GLint *) p)[1]);
1434    case TYPE_INT:
1435    case TYPE_ENUM:
1436       params[0] = (GLfloat) (((GLint *) p)[0]);
1437       break;
1438
1439    case TYPE_INT_N:
1440       for (i = 0; i < v.value_int_n.n; i++)
1441          params[i] = INT_TO_FLOAT(v.value_int_n.ints[i]);
1442       break;
1443
1444    case TYPE_INT64:
1445       params[0] = (GLfloat) (((GLint64 *) p)[0]);
1446       break;
1447
1448    case TYPE_BOOLEAN:
1449       params[0] = BOOLEAN_TO_FLOAT(*(GLboolean*) p);
1450       break;            
1451
1452    case TYPE_MATRIX:
1453       m = *(GLmatrix **) p;
1454       for (i = 0; i < 16; i++)
1455          params[i] = m->m[i];
1456       break;
1457
1458    case TYPE_MATRIX_T:
1459       m = *(GLmatrix **) p;
1460       for (i = 0; i < 16; i++)
1461          params[i] = m->m[transpose[i]];
1462       break;
1463
1464    case TYPE_BIT_0:
1465    case TYPE_BIT_1:
1466    case TYPE_BIT_2:
1467    case TYPE_BIT_3:
1468    case TYPE_BIT_4:
1469    case TYPE_BIT_5:
1470    case TYPE_BIT_6:
1471    case TYPE_BIT_7:
1472       shift = d->type - TYPE_BIT_0;
1473       params[0] = BOOLEAN_TO_FLOAT((*(GLbitfield *) p >> shift) & 1);
1474       break;
1475    }
1476 }
1477
1478 void GLAPIENTRY
1479 _mesa_GetIntegerv(GLenum pname, GLint *params)
1480 {
1481    const struct value_desc *d;
1482    union value v;
1483    GLmatrix *m;
1484    int shift, i;
1485    void *p;
1486
1487    d = find_value("glGetIntegerv", pname, &p, &v);
1488    switch (d->type) {
1489    case TYPE_INVALID:
1490       break;
1491    case TYPE_CONST:
1492       params[0] = d->offset;
1493       break;
1494
1495    case TYPE_FLOAT_4:
1496       params[3] = IROUND(((GLfloat *) p)[3]);
1497    case TYPE_FLOAT_3:
1498       params[2] = IROUND(((GLfloat *) p)[2]);
1499    case TYPE_FLOAT_2:
1500       params[1] = IROUND(((GLfloat *) p)[1]);
1501    case TYPE_FLOAT:
1502       params[0] = IROUND(((GLfloat *) p)[0]);
1503       break;
1504
1505    case TYPE_FLOATN_4:
1506       params[3] = FLOAT_TO_INT(((GLfloat *) p)[3]);
1507    case TYPE_FLOATN_3:
1508       params[2] = FLOAT_TO_INT(((GLfloat *) p)[2]);
1509    case TYPE_FLOATN_2:
1510       params[1] = FLOAT_TO_INT(((GLfloat *) p)[1]);
1511    case TYPE_FLOATN:
1512       params[0] = FLOAT_TO_INT(((GLfloat *) p)[0]);
1513       break;
1514
1515    case TYPE_DOUBLEN_2:
1516       params[1] = FLOAT_TO_INT(((GLdouble *) p)[1]);
1517    case TYPE_DOUBLEN:
1518       params[0] = FLOAT_TO_INT(((GLdouble *) p)[0]);
1519       break;
1520
1521    case TYPE_INT_4:
1522       params[3] = ((GLint *) p)[3];
1523    case TYPE_INT_3:
1524       params[2] = ((GLint *) p)[2];
1525    case TYPE_INT_2:
1526    case TYPE_ENUM_2:
1527       params[1] = ((GLint *) p)[1];
1528    case TYPE_INT:
1529    case TYPE_ENUM:
1530       params[0] = ((GLint *) p)[0];
1531       break;
1532
1533    case TYPE_INT_N:
1534       for (i = 0; i < v.value_int_n.n; i++)
1535          params[i] = v.value_int_n.ints[i];
1536       break;
1537
1538    case TYPE_INT64:
1539       params[0] = INT64_TO_INT(((GLint64 *) p)[0]);
1540       break;
1541
1542    case TYPE_BOOLEAN:
1543       params[0] = BOOLEAN_TO_INT(*(GLboolean*) p);
1544       break;            
1545
1546    case TYPE_MATRIX:
1547       m = *(GLmatrix **) p;
1548       for (i = 0; i < 16; i++)
1549          params[i] = FLOAT_TO_INT(m->m[i]);
1550       break;
1551
1552    case TYPE_MATRIX_T:
1553       m = *(GLmatrix **) p;
1554       for (i = 0; i < 16; i++)
1555          params[i] = FLOAT_TO_INT(m->m[transpose[i]]);
1556       break;
1557
1558    case TYPE_BIT_0:
1559    case TYPE_BIT_1:
1560    case TYPE_BIT_2:
1561    case TYPE_BIT_3:
1562    case TYPE_BIT_4:
1563    case TYPE_BIT_5:
1564    case TYPE_BIT_6:
1565    case TYPE_BIT_7:
1566       shift = d->type - TYPE_BIT_0;
1567       params[0] = (*(GLbitfield *) p >> shift) & 1;
1568       break;
1569    }
1570 }
1571
1572 void GLAPIENTRY
1573 _mesa_GetInteger64v(GLenum pname, GLint64 *params)
1574 {
1575    const struct value_desc *d;
1576    union value v;
1577    GLmatrix *m;
1578    int shift, i;
1579    void *p;
1580
1581    d = find_value("glGetInteger64v", pname, &p, &v);
1582    switch (d->type) {
1583    case TYPE_INVALID:
1584       break;
1585    case TYPE_CONST:
1586       params[0] = d->offset;
1587       break;
1588
1589    case TYPE_FLOAT_4:
1590       params[3] = IROUND64(((GLfloat *) p)[3]);
1591    case TYPE_FLOAT_3:
1592       params[2] = IROUND64(((GLfloat *) p)[2]);
1593    case TYPE_FLOAT_2:
1594       params[1] = IROUND64(((GLfloat *) p)[1]);
1595    case TYPE_FLOAT:
1596       params[0] = IROUND64(((GLfloat *) p)[0]);
1597       break;
1598
1599    case TYPE_FLOATN_4:
1600       params[3] = FLOAT_TO_INT64(((GLfloat *) p)[3]);
1601    case TYPE_FLOATN_3:
1602       params[2] = FLOAT_TO_INT64(((GLfloat *) p)[2]);
1603    case TYPE_FLOATN_2:
1604       params[1] = FLOAT_TO_INT64(((GLfloat *) p)[1]);
1605    case TYPE_FLOATN:
1606       params[0] = FLOAT_TO_INT64(((GLfloat *) p)[0]);
1607       break;
1608
1609    case TYPE_DOUBLEN_2:
1610       params[1] = FLOAT_TO_INT64(((GLdouble *) p)[1]);
1611    case TYPE_DOUBLEN:
1612       params[0] = FLOAT_TO_INT64(((GLdouble *) p)[0]);
1613       break;
1614
1615    case TYPE_INT_4:
1616       params[3] = ((GLint *) p)[3];
1617    case TYPE_INT_3:
1618       params[2] = ((GLint *) p)[2];
1619    case TYPE_INT_2:
1620    case TYPE_ENUM_2:
1621       params[1] = ((GLint *) p)[1];
1622    case TYPE_INT:
1623    case TYPE_ENUM:
1624       params[0] = ((GLint *) p)[0];
1625       break;
1626
1627    case TYPE_INT_N:
1628       for (i = 0; i < v.value_int_n.n; i++)
1629          params[i] = INT_TO_BOOLEAN(v.value_int_n.ints[i]);
1630       break;
1631
1632    case TYPE_INT64:
1633       params[0] = ((GLint64 *) p)[0];
1634       break;
1635
1636    case TYPE_BOOLEAN:
1637       params[0] = ((GLboolean*) p)[0];
1638       break;            
1639
1640    case TYPE_MATRIX:
1641       m = *(GLmatrix **) p;
1642       for (i = 0; i < 16; i++)
1643          params[i] = FLOAT_TO_INT64(m->m[i]);
1644       break;
1645
1646    case TYPE_MATRIX_T:
1647       m = *(GLmatrix **) p;
1648       for (i = 0; i < 16; i++)
1649          params[i] = FLOAT_TO_INT64(m->m[transpose[i]]);
1650       break;
1651
1652    case TYPE_BIT_0:
1653    case TYPE_BIT_1:
1654    case TYPE_BIT_2:
1655    case TYPE_BIT_3:
1656    case TYPE_BIT_4:
1657    case TYPE_BIT_5:
1658    case TYPE_BIT_6:
1659    case TYPE_BIT_7:
1660       shift = d->type - TYPE_BIT_0;
1661       params[0] = (*(GLbitfield *) p >> shift) & 1;
1662       break;
1663    }
1664 }
1665
1666 void GLAPIENTRY
1667 _mesa_GetDoublev(GLenum pname, GLdouble *params)
1668 {
1669    const struct value_desc *d;
1670    union value v;
1671    GLmatrix *m;
1672    int shift, i;
1673    void *p;
1674
1675    d = find_value("glGetDoublev", pname, &p, &v);
1676    switch (d->type) {
1677    case TYPE_INVALID:
1678       break;
1679    case TYPE_CONST:
1680       params[0] = d->offset;
1681       break;
1682
1683    case TYPE_FLOAT_4:
1684    case TYPE_FLOATN_4:
1685       params[3] = ((GLfloat *) p)[3];
1686    case TYPE_FLOAT_3:
1687    case TYPE_FLOATN_3:
1688       params[2] = ((GLfloat *) p)[2];
1689    case TYPE_FLOAT_2:
1690    case TYPE_FLOATN_2:
1691       params[1] = ((GLfloat *) p)[1];
1692    case TYPE_FLOAT:
1693    case TYPE_FLOATN:
1694       params[0] = ((GLfloat *) p)[0];
1695       break;
1696
1697    case TYPE_DOUBLEN_2:
1698       params[1] = ((GLdouble *) p)[1];
1699    case TYPE_DOUBLEN:
1700       params[0] = ((GLdouble *) p)[0];
1701       break;
1702
1703    case TYPE_INT_4:
1704       params[3] = ((GLint *) p)[3];
1705    case TYPE_INT_3:
1706       params[2] = ((GLint *) p)[2];
1707    case TYPE_INT_2:
1708    case TYPE_ENUM_2:
1709       params[1] = ((GLint *) p)[1];
1710    case TYPE_INT:
1711    case TYPE_ENUM:
1712       params[0] = ((GLint *) p)[0];
1713       break;
1714
1715    case TYPE_INT_N:
1716       for (i = 0; i < v.value_int_n.n; i++)
1717          params[i] = v.value_int_n.ints[i];
1718       break;
1719
1720    case TYPE_INT64:
1721       params[0] = (GLdouble) (((GLint64 *) p)[0]);
1722       break;
1723
1724    case TYPE_BOOLEAN:
1725       params[0] = *(GLboolean*) p;
1726       break;            
1727
1728    case TYPE_MATRIX:
1729       m = *(GLmatrix **) p;
1730       for (i = 0; i < 16; i++)
1731          params[i] = m->m[i];
1732       break;
1733
1734    case TYPE_MATRIX_T:
1735       m = *(GLmatrix **) p;
1736       for (i = 0; i < 16; i++)
1737          params[i] = m->m[transpose[i]];
1738       break;
1739
1740    case TYPE_BIT_0:
1741    case TYPE_BIT_1:
1742    case TYPE_BIT_2:
1743    case TYPE_BIT_3:
1744    case TYPE_BIT_4:
1745    case TYPE_BIT_5:
1746    case TYPE_BIT_6:
1747    case TYPE_BIT_7:
1748       shift = d->type - TYPE_BIT_0;
1749       params[0] = (*(GLbitfield *) p >> shift) & 1;
1750       break;
1751    }
1752 }
1753
1754 /**
1755  * Convert a GL texture binding enum such as GL_TEXTURE_BINDING_2D
1756  * into the corresponding Mesa texture target index.
1757  * \return TEXTURE_x_INDEX or -1 if binding is invalid
1758  */
1759 static int
1760 tex_binding_to_index(const struct gl_context *ctx, GLenum binding)
1761 {
1762    switch (binding) {
1763    case GL_TEXTURE_BINDING_1D:
1764       return _mesa_is_desktop_gl(ctx) ? TEXTURE_1D_INDEX : -1;
1765    case GL_TEXTURE_BINDING_2D:
1766       return TEXTURE_2D_INDEX;
1767    case GL_TEXTURE_BINDING_3D:
1768       return ctx->API != API_OPENGLES ? TEXTURE_3D_INDEX : -1;
1769    case GL_TEXTURE_BINDING_CUBE_MAP:
1770       return ctx->Extensions.ARB_texture_cube_map
1771          ? TEXTURE_CUBE_INDEX : -1;
1772    case GL_TEXTURE_BINDING_RECTANGLE:
1773       return _mesa_is_desktop_gl(ctx) && ctx->Extensions.NV_texture_rectangle
1774          ? TEXTURE_RECT_INDEX : -1;
1775    case GL_TEXTURE_BINDING_1D_ARRAY:
1776       return _mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_array
1777          ? TEXTURE_1D_ARRAY_INDEX : -1;
1778    case GL_TEXTURE_BINDING_2D_ARRAY:
1779       return (_mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_array)
1780          || _mesa_is_gles3(ctx)
1781          ? TEXTURE_2D_ARRAY_INDEX : -1;
1782    case GL_TEXTURE_BINDING_BUFFER:
1783       return ctx->API == API_OPENGL_CORE &&
1784              ctx->Extensions.ARB_texture_buffer_object ?
1785              TEXTURE_BUFFER_INDEX : -1;
1786    case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
1787       return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_cube_map_array
1788          ? TEXTURE_CUBE_ARRAY_INDEX : -1;
1789    case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
1790       return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample
1791          ? TEXTURE_2D_MULTISAMPLE_INDEX : -1;
1792    case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
1793       return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample
1794          ? TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX : -1;
1795    default:
1796       return -1;
1797    }
1798 }
1799
1800 static enum value_type
1801 find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
1802 {
1803    GET_CURRENT_CONTEXT(ctx);
1804
1805    switch (pname) {
1806
1807    case GL_BLEND:
1808       if (index >= ctx->Const.MaxDrawBuffers)
1809          goto invalid_value;
1810       if (!ctx->Extensions.EXT_draw_buffers2)
1811          goto invalid_enum;
1812       v->value_int = (ctx->Color.BlendEnabled >> index) & 1;
1813       return TYPE_INT;
1814
1815    case GL_BLEND_SRC:
1816       /* fall-through */
1817    case GL_BLEND_SRC_RGB:
1818       if (index >= ctx->Const.MaxDrawBuffers)
1819          goto invalid_value;
1820       if (!ctx->Extensions.ARB_draw_buffers_blend)
1821          goto invalid_enum;
1822       v->value_int = ctx->Color.Blend[index].SrcRGB;
1823       return TYPE_INT;
1824    case GL_BLEND_SRC_ALPHA:
1825       if (index >= ctx->Const.MaxDrawBuffers)
1826          goto invalid_value;
1827       if (!ctx->Extensions.ARB_draw_buffers_blend)
1828          goto invalid_enum;
1829       v->value_int = ctx->Color.Blend[index].SrcA;
1830       return TYPE_INT;
1831    case GL_BLEND_DST:
1832       /* fall-through */
1833    case GL_BLEND_DST_RGB:
1834       if (index >= ctx->Const.MaxDrawBuffers)
1835          goto invalid_value;
1836       if (!ctx->Extensions.ARB_draw_buffers_blend)
1837          goto invalid_enum;
1838       v->value_int = ctx->Color.Blend[index].DstRGB;
1839       return TYPE_INT;
1840    case GL_BLEND_DST_ALPHA:
1841       if (index >= ctx->Const.MaxDrawBuffers)
1842          goto invalid_value;
1843       if (!ctx->Extensions.ARB_draw_buffers_blend)
1844          goto invalid_enum;
1845       v->value_int = ctx->Color.Blend[index].DstA;
1846       return TYPE_INT;
1847    case GL_BLEND_EQUATION_RGB:
1848       if (index >= ctx->Const.MaxDrawBuffers)
1849          goto invalid_value;
1850       if (!ctx->Extensions.ARB_draw_buffers_blend)
1851          goto invalid_enum;
1852       v->value_int = ctx->Color.Blend[index].EquationRGB;
1853       return TYPE_INT;
1854    case GL_BLEND_EQUATION_ALPHA:
1855       if (index >= ctx->Const.MaxDrawBuffers)
1856          goto invalid_value;
1857       if (!ctx->Extensions.ARB_draw_buffers_blend)
1858          goto invalid_enum;
1859       v->value_int = ctx->Color.Blend[index].EquationA;
1860       return TYPE_INT;
1861
1862    case GL_COLOR_WRITEMASK:
1863       if (index >= ctx->Const.MaxDrawBuffers)
1864          goto invalid_value;
1865       if (!ctx->Extensions.EXT_draw_buffers2)
1866          goto invalid_enum;
1867       v->value_int_4[0] = ctx->Color.ColorMask[index][RCOMP] ? 1 : 0;
1868       v->value_int_4[1] = ctx->Color.ColorMask[index][GCOMP] ? 1 : 0;
1869       v->value_int_4[2] = ctx->Color.ColorMask[index][BCOMP] ? 1 : 0;
1870       v->value_int_4[3] = ctx->Color.ColorMask[index][ACOMP] ? 1 : 0;
1871       return TYPE_INT_4;
1872
1873    case GL_SCISSOR_BOX:
1874       if (index >= ctx->Const.MaxViewports)
1875          goto invalid_value;
1876       v->value_int_4[0] = ctx->Scissor.ScissorArray[index].X;
1877       v->value_int_4[1] = ctx->Scissor.ScissorArray[index].Y;
1878       v->value_int_4[2] = ctx->Scissor.ScissorArray[index].Width;
1879       v->value_int_4[3] = ctx->Scissor.ScissorArray[index].Height;
1880       return TYPE_INT_4;
1881
1882    case GL_VIEWPORT:
1883       if (index >= ctx->Const.MaxViewports)
1884          goto invalid_value;
1885       v->value_float_4[0] = ctx->ViewportArray[index].X;
1886       v->value_float_4[1] = ctx->ViewportArray[index].Y;
1887       v->value_float_4[2] = ctx->ViewportArray[index].Width;
1888       v->value_float_4[3] = ctx->ViewportArray[index].Height;
1889       return TYPE_FLOAT_4;
1890
1891    case GL_DEPTH_RANGE:
1892       if (index >= ctx->Const.MaxViewports)
1893          goto invalid_value;
1894       v->value_double_2[0] = ctx->ViewportArray[index].Near;
1895       v->value_double_2[1] = ctx->ViewportArray[index].Far;
1896       return TYPE_DOUBLEN_2;
1897
1898    case GL_TRANSFORM_FEEDBACK_BUFFER_START:
1899       if (index >= ctx->Const.MaxTransformFeedbackBuffers)
1900          goto invalid_value;
1901       if (!ctx->Extensions.EXT_transform_feedback)
1902          goto invalid_enum;
1903       v->value_int64 = ctx->TransformFeedback.CurrentObject->Offset[index];
1904       return TYPE_INT64;
1905
1906    case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
1907       if (index >= ctx->Const.MaxTransformFeedbackBuffers)
1908          goto invalid_value;
1909       if (!ctx->Extensions.EXT_transform_feedback)
1910          goto invalid_enum;
1911       v->value_int64
1912          = ctx->TransformFeedback.CurrentObject->RequestedSize[index];
1913       return TYPE_INT64;
1914
1915    case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
1916       if (index >= ctx->Const.MaxTransformFeedbackBuffers)
1917          goto invalid_value;
1918       if (!ctx->Extensions.EXT_transform_feedback)
1919          goto invalid_enum;
1920       v->value_int = ctx->TransformFeedback.CurrentObject->BufferNames[index];
1921       return TYPE_INT;
1922
1923    case GL_UNIFORM_BUFFER_BINDING:
1924       if (index >= ctx->Const.MaxUniformBufferBindings)
1925          goto invalid_value;
1926       if (!ctx->Extensions.ARB_uniform_buffer_object)
1927          goto invalid_enum;
1928       v->value_int = ctx->UniformBufferBindings[index].BufferObject->Name;
1929       return TYPE_INT;
1930
1931    case GL_UNIFORM_BUFFER_START:
1932       if (index >= ctx->Const.MaxUniformBufferBindings)
1933          goto invalid_value;
1934       if (!ctx->Extensions.ARB_uniform_buffer_object)
1935          goto invalid_enum;
1936       v->value_int = ctx->UniformBufferBindings[index].Offset;
1937       return TYPE_INT;
1938
1939    case GL_UNIFORM_BUFFER_SIZE:
1940       if (index >= ctx->Const.MaxUniformBufferBindings)
1941          goto invalid_value;
1942       if (!ctx->Extensions.ARB_uniform_buffer_object)
1943          goto invalid_enum;
1944       v->value_int = ctx->UniformBufferBindings[index].Size;
1945       return TYPE_INT;
1946
1947    /* ARB_texture_multisample / GL3.2 */
1948    case GL_SAMPLE_MASK_VALUE:
1949       if (index != 0)
1950          goto invalid_value;
1951       if (!ctx->Extensions.ARB_texture_multisample)
1952          goto invalid_enum;
1953       v->value_int = ctx->Multisample.SampleMaskValue;
1954       return TYPE_INT;
1955
1956    case GL_ATOMIC_COUNTER_BUFFER_BINDING:
1957       if (!ctx->Extensions.ARB_shader_atomic_counters)
1958          goto invalid_enum;
1959       if (index >= ctx->Const.MaxAtomicBufferBindings)
1960          goto invalid_value;
1961       v->value_int = ctx->AtomicBufferBindings[index].BufferObject->Name;
1962       return TYPE_INT;
1963
1964    case GL_ATOMIC_COUNTER_BUFFER_START:
1965       if (!ctx->Extensions.ARB_shader_atomic_counters)
1966          goto invalid_enum;
1967       if (index >= ctx->Const.MaxAtomicBufferBindings)
1968          goto invalid_value;
1969       v->value_int64 = ctx->AtomicBufferBindings[index].Offset;
1970       return TYPE_INT64;
1971
1972    case GL_ATOMIC_COUNTER_BUFFER_SIZE:
1973       if (!ctx->Extensions.ARB_shader_atomic_counters)
1974          goto invalid_enum;
1975       if (index >= ctx->Const.MaxAtomicBufferBindings)
1976          goto invalid_value;
1977       v->value_int64 = ctx->AtomicBufferBindings[index].Size;
1978       return TYPE_INT64;
1979
1980    case GL_VERTEX_BINDING_DIVISOR:
1981       if (!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_instanced_arrays)
1982           goto invalid_enum;
1983       if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs)
1984           goto invalid_value;
1985       v->value_int = ctx->Array.VAO->VertexBinding[VERT_ATTRIB_GENERIC(index)].InstanceDivisor;
1986       return TYPE_INT;
1987
1988    case GL_VERTEX_BINDING_OFFSET:
1989       if (!_mesa_is_desktop_gl(ctx))
1990           goto invalid_enum;
1991       if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs)
1992           goto invalid_value;
1993       v->value_int = ctx->Array.VAO->VertexBinding[VERT_ATTRIB_GENERIC(index)].Offset;
1994       return TYPE_INT;
1995
1996    case GL_VERTEX_BINDING_STRIDE:
1997       if (!_mesa_is_desktop_gl(ctx))
1998           goto invalid_enum;
1999       if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs)
2000           goto invalid_value;
2001       v->value_int = ctx->Array.VAO->VertexBinding[VERT_ATTRIB_GENERIC(index)].Stride;
2002       return TYPE_INT;
2003
2004    /* ARB_shader_image_load_store */
2005    case GL_IMAGE_BINDING_NAME: {
2006       struct gl_texture_object *t;
2007
2008       if (!ctx->Extensions.ARB_shader_image_load_store)
2009          goto invalid_enum;
2010       if (index >= ctx->Const.MaxImageUnits)
2011          goto invalid_value;
2012
2013       t = ctx->ImageUnits[index].TexObj;
2014       v->value_int = (t ? t->Name : 0);
2015       return TYPE_INT;
2016    }
2017
2018    case GL_IMAGE_BINDING_LEVEL:
2019       if (!ctx->Extensions.ARB_shader_image_load_store)
2020          goto invalid_enum;
2021       if (index >= ctx->Const.MaxImageUnits)
2022          goto invalid_value;
2023
2024       v->value_int = ctx->ImageUnits[index].Level;
2025       return TYPE_INT;
2026
2027    case GL_IMAGE_BINDING_LAYERED:
2028       if (!ctx->Extensions.ARB_shader_image_load_store)
2029          goto invalid_enum;
2030       if (index >= ctx->Const.MaxImageUnits)
2031          goto invalid_value;
2032
2033       v->value_int = ctx->ImageUnits[index].Layered;
2034       return TYPE_INT;
2035
2036    case GL_IMAGE_BINDING_LAYER:
2037       if (!ctx->Extensions.ARB_shader_image_load_store)
2038          goto invalid_enum;
2039       if (index >= ctx->Const.MaxImageUnits)
2040          goto invalid_value;
2041
2042       v->value_int = ctx->ImageUnits[index].Layer;
2043       return TYPE_INT;
2044
2045    case GL_IMAGE_BINDING_ACCESS:
2046       if (!ctx->Extensions.ARB_shader_image_load_store)
2047          goto invalid_enum;
2048       if (index >= ctx->Const.MaxImageUnits)
2049          goto invalid_value;
2050
2051       v->value_int = ctx->ImageUnits[index].Access;
2052       return TYPE_INT;
2053
2054    case GL_IMAGE_BINDING_FORMAT:
2055       if (!ctx->Extensions.ARB_shader_image_load_store)
2056          goto invalid_enum;
2057       if (index >= ctx->Const.MaxImageUnits)
2058          goto invalid_value;
2059
2060       v->value_int = ctx->ImageUnits[index].Format;
2061       return TYPE_INT;
2062
2063    /* ARB_direct_state_access */
2064    case GL_TEXTURE_BINDING_1D:
2065    case GL_TEXTURE_BINDING_1D_ARRAY:
2066    case GL_TEXTURE_BINDING_2D:
2067    case GL_TEXTURE_BINDING_2D_ARRAY:
2068    case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
2069    case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
2070    case GL_TEXTURE_BINDING_3D:
2071    case GL_TEXTURE_BINDING_BUFFER:
2072    case GL_TEXTURE_BINDING_CUBE_MAP:
2073    case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
2074    case GL_TEXTURE_BINDING_RECTANGLE: {
2075       int target;
2076
2077       if (ctx->API != API_OPENGL_CORE)
2078          goto invalid_enum;
2079       target = tex_binding_to_index(ctx, pname);
2080       if (target < 0)
2081          goto invalid_enum;
2082       if (index >= _mesa_max_tex_unit(ctx))
2083          goto invalid_value;
2084
2085       v->value_int = ctx->Texture.Unit[index].CurrentTex[target]->Name;
2086       return TYPE_INT;
2087    }
2088
2089    case GL_SAMPLER_BINDING: {
2090       struct gl_sampler_object *samp;
2091
2092       if (ctx->API != API_OPENGL_CORE)
2093          goto invalid_enum;
2094       if (index >= _mesa_max_tex_unit(ctx))
2095          goto invalid_value;
2096
2097       samp = ctx->Texture.Unit[index].Sampler;
2098       v->value_int = samp ? samp->Name : 0;
2099       return TYPE_INT;
2100    }
2101
2102    case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
2103       if (!_mesa_has_compute_shaders(ctx))
2104          goto invalid_enum;
2105       if (index >= 3)
2106          goto invalid_value;
2107       v->value_int = ctx->Const.MaxComputeWorkGroupCount[index];
2108       return TYPE_INT;
2109
2110    case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
2111       if (!_mesa_has_compute_shaders(ctx))
2112          goto invalid_enum;
2113       if (index >= 3)
2114          goto invalid_value;
2115       v->value_int = ctx->Const.MaxComputeWorkGroupSize[index];
2116       return TYPE_INT;
2117    }
2118
2119  invalid_enum:
2120    _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)", func,
2121                _mesa_enum_to_string(pname));
2122    return TYPE_INVALID;
2123  invalid_value:
2124    _mesa_error(ctx, GL_INVALID_VALUE, "%s(pname=%s)", func,
2125                _mesa_enum_to_string(pname));
2126    return TYPE_INVALID;
2127 }
2128
2129 void GLAPIENTRY
2130 _mesa_GetBooleani_v( GLenum pname, GLuint index, GLboolean *params )
2131 {
2132    union value v;
2133    enum value_type type =
2134       find_value_indexed("glGetBooleani_v", pname, index, &v);
2135
2136    switch (type) {
2137    case TYPE_INT:
2138       params[0] = INT_TO_BOOLEAN(v.value_int);
2139       break;
2140    case TYPE_INT_4:
2141       params[0] = INT_TO_BOOLEAN(v.value_int_4[0]);
2142       params[1] = INT_TO_BOOLEAN(v.value_int_4[1]);
2143       params[2] = INT_TO_BOOLEAN(v.value_int_4[2]);
2144       params[3] = INT_TO_BOOLEAN(v.value_int_4[3]);
2145       break;
2146    case TYPE_INT64:
2147       params[0] = INT64_TO_BOOLEAN(v.value_int64);
2148       break;
2149    default:
2150       ; /* nothing - GL error was recorded */
2151    }
2152 }
2153
2154 void GLAPIENTRY
2155 _mesa_GetIntegeri_v( GLenum pname, GLuint index, GLint *params )
2156 {
2157    union value v;
2158    enum value_type type =
2159       find_value_indexed("glGetIntegeri_v", pname, index, &v);
2160
2161    switch (type) {
2162    case TYPE_FLOAT_4:
2163    case TYPE_FLOATN_4:
2164       params[3] = IROUND(v.value_float_4[3]);
2165    case TYPE_FLOAT_3:
2166    case TYPE_FLOATN_3:
2167       params[2] = IROUND(v.value_float_4[2]);
2168    case TYPE_FLOAT_2:
2169    case TYPE_FLOATN_2:
2170       params[1] = IROUND(v.value_float_4[1]);
2171    case TYPE_FLOAT:
2172    case TYPE_FLOATN:
2173       params[0] = IROUND(v.value_float_4[0]);
2174       break;
2175
2176    case TYPE_DOUBLEN_2:
2177       params[1] = IROUND(v.value_double_2[1]);
2178    case TYPE_DOUBLEN:
2179       params[0] = IROUND(v.value_double_2[0]);
2180       break;
2181
2182    case TYPE_INT:
2183       params[0] = v.value_int;
2184       break;
2185    case TYPE_INT_4:
2186       params[0] = v.value_int_4[0];
2187       params[1] = v.value_int_4[1];
2188       params[2] = v.value_int_4[2];
2189       params[3] = v.value_int_4[3];
2190       break;
2191    case TYPE_INT64:
2192       params[0] = INT64_TO_INT(v.value_int64);
2193       break;
2194    default:
2195       ; /* nothing - GL error was recorded */
2196    }
2197 }
2198
2199 void GLAPIENTRY
2200 _mesa_GetInteger64i_v( GLenum pname, GLuint index, GLint64 *params )
2201 {
2202    union value v;
2203    enum value_type type =
2204       find_value_indexed("glGetInteger64i_v", pname, index, &v);
2205
2206    switch (type) {
2207    case TYPE_INT:
2208       params[0] = v.value_int;
2209       break;
2210    case TYPE_INT_4:
2211       params[0] = v.value_int_4[0];
2212       params[1] = v.value_int_4[1];
2213       params[2] = v.value_int_4[2];
2214       params[3] = v.value_int_4[3];
2215       break;
2216    case TYPE_INT64:
2217       params[0] = v.value_int64;
2218       break;
2219    default:
2220       ; /* nothing - GL error was recorded */
2221    }
2222 }
2223
2224 void GLAPIENTRY
2225 _mesa_GetFloati_v(GLenum pname, GLuint index, GLfloat *params)
2226 {
2227    int i;
2228    GLmatrix *m;
2229    union value v;
2230    enum value_type type =
2231       find_value_indexed("glGetFloati_v", pname, index, &v);
2232
2233    switch (type) {
2234    case TYPE_FLOAT_4:
2235    case TYPE_FLOATN_4:
2236       params[3] = v.value_float_4[3];
2237    case TYPE_FLOAT_3:
2238    case TYPE_FLOATN_3:
2239       params[2] = v.value_float_4[2];
2240    case TYPE_FLOAT_2:
2241    case TYPE_FLOATN_2:
2242       params[1] = v.value_float_4[1];
2243    case TYPE_FLOAT:
2244    case TYPE_FLOATN:
2245       params[0] = v.value_float_4[0];
2246       break;
2247
2248    case TYPE_DOUBLEN_2:
2249       params[1] = (GLfloat) v.value_double_2[1];
2250    case TYPE_DOUBLEN:
2251       params[0] = (GLfloat) v.value_double_2[0];
2252       break;
2253
2254    case TYPE_INT_4:
2255       params[3] = (GLfloat) v.value_int_4[3];
2256    case TYPE_INT_3:
2257       params[2] = (GLfloat) v.value_int_4[2];
2258    case TYPE_INT_2:
2259    case TYPE_ENUM_2:
2260       params[1] = (GLfloat) v.value_int_4[1];
2261    case TYPE_INT:
2262    case TYPE_ENUM:
2263       params[0] = (GLfloat) v.value_int_4[0];
2264       break;
2265
2266    case TYPE_INT_N:
2267       for (i = 0; i < v.value_int_n.n; i++)
2268          params[i] = INT_TO_FLOAT(v.value_int_n.ints[i]);
2269       break;
2270
2271    case TYPE_INT64:
2272       params[0] = (GLfloat) v.value_int64;
2273       break;
2274
2275    case TYPE_BOOLEAN:
2276       params[0] = BOOLEAN_TO_FLOAT(v.value_bool);
2277       break;
2278
2279    case TYPE_MATRIX:
2280       m = *(GLmatrix **) &v;
2281       for (i = 0; i < 16; i++)
2282          params[i] = m->m[i];
2283       break;
2284
2285    case TYPE_MATRIX_T:
2286       m = *(GLmatrix **) &v;
2287       for (i = 0; i < 16; i++)
2288          params[i] = m->m[transpose[i]];
2289       break;
2290
2291    default:
2292       ;
2293    }
2294 }
2295
2296 void GLAPIENTRY
2297 _mesa_GetDoublei_v(GLenum pname, GLuint index, GLdouble *params)
2298 {
2299    int i;
2300    GLmatrix *m;
2301    union value v;
2302    enum value_type type =
2303       find_value_indexed("glGetDoublei_v", pname, index, &v);
2304
2305    switch (type) {
2306    case TYPE_FLOAT_4:
2307    case TYPE_FLOATN_4:
2308       params[3] = (GLdouble) v.value_float_4[3];
2309    case TYPE_FLOAT_3:
2310    case TYPE_FLOATN_3:
2311       params[2] = (GLdouble) v.value_float_4[2];
2312    case TYPE_FLOAT_2:
2313    case TYPE_FLOATN_2:
2314       params[1] = (GLdouble) v.value_float_4[1];
2315    case TYPE_FLOAT:
2316    case TYPE_FLOATN:
2317       params[0] = (GLdouble) v.value_float_4[0];
2318       break;
2319
2320    case TYPE_DOUBLEN_2:
2321       params[1] = v.value_double_2[1];
2322    case TYPE_DOUBLEN:
2323       params[0] = v.value_double_2[0];
2324       break;
2325
2326    case TYPE_INT_4:
2327       params[3] = (GLdouble) v.value_int_4[3];
2328    case TYPE_INT_3:
2329       params[2] = (GLdouble) v.value_int_4[2];
2330    case TYPE_INT_2:
2331    case TYPE_ENUM_2:
2332       params[1] = (GLdouble) v.value_int_4[1];
2333    case TYPE_INT:
2334    case TYPE_ENUM:
2335       params[0] = (GLdouble) v.value_int_4[0];
2336       break;
2337
2338    case TYPE_INT_N:
2339       for (i = 0; i < v.value_int_n.n; i++)
2340          params[i] = (GLdouble) INT_TO_FLOAT(v.value_int_n.ints[i]);
2341       break;
2342
2343    case TYPE_INT64:
2344       params[0] = (GLdouble) v.value_int64;
2345       break;
2346
2347    case TYPE_BOOLEAN:
2348       params[0] = (GLdouble) BOOLEAN_TO_FLOAT(v.value_bool);
2349       break;
2350
2351    case TYPE_MATRIX:
2352       m = *(GLmatrix **) &v;
2353       for (i = 0; i < 16; i++)
2354          params[i] = (GLdouble) m->m[i];
2355       break;
2356
2357    case TYPE_MATRIX_T:
2358       m = *(GLmatrix **) &v;
2359       for (i = 0; i < 16; i++)
2360          params[i] = (GLdouble) m->m[transpose[i]];
2361       break;
2362
2363    default:
2364       ;
2365    }
2366 }
2367
2368 void GLAPIENTRY
2369 _mesa_GetFixedv(GLenum pname, GLfixed *params)
2370 {
2371    const struct value_desc *d;
2372    union value v;
2373    GLmatrix *m;
2374    int shift, i;
2375    void *p;
2376
2377    d = find_value("glGetDoublev", pname, &p, &v);
2378    switch (d->type) {
2379    case TYPE_INVALID:
2380       break;
2381    case TYPE_CONST:
2382       params[0] = INT_TO_FIXED(d->offset);
2383       break;
2384
2385    case TYPE_FLOAT_4:
2386    case TYPE_FLOATN_4:
2387       params[3] = FLOAT_TO_FIXED(((GLfloat *) p)[3]);
2388    case TYPE_FLOAT_3:
2389    case TYPE_FLOATN_3:
2390       params[2] = FLOAT_TO_FIXED(((GLfloat *) p)[2]);
2391    case TYPE_FLOAT_2:
2392    case TYPE_FLOATN_2:
2393       params[1] = FLOAT_TO_FIXED(((GLfloat *) p)[1]);
2394    case TYPE_FLOAT:
2395    case TYPE_FLOATN:
2396       params[0] = FLOAT_TO_FIXED(((GLfloat *) p)[0]);
2397       break;
2398
2399    case TYPE_DOUBLEN_2:
2400       params[1] = FLOAT_TO_FIXED(((GLdouble *) p)[1]);
2401    case TYPE_DOUBLEN:
2402       params[0] = FLOAT_TO_FIXED(((GLdouble *) p)[0]);
2403       break;
2404
2405    case TYPE_INT_4:
2406       params[3] = INT_TO_FIXED(((GLint *) p)[3]);
2407    case TYPE_INT_3:
2408       params[2] = INT_TO_FIXED(((GLint *) p)[2]);
2409    case TYPE_INT_2:
2410    case TYPE_ENUM_2:
2411       params[1] = INT_TO_FIXED(((GLint *) p)[1]);
2412    case TYPE_INT:
2413    case TYPE_ENUM:
2414       params[0] = INT_TO_FIXED(((GLint *) p)[0]);
2415       break;
2416
2417    case TYPE_INT_N:
2418       for (i = 0; i < v.value_int_n.n; i++)
2419          params[i] = INT_TO_FIXED(v.value_int_n.ints[i]);
2420       break;
2421
2422    case TYPE_INT64:
2423       params[0] = ((GLint64 *) p)[0];
2424       break;
2425
2426    case TYPE_BOOLEAN:
2427       params[0] = BOOLEAN_TO_FIXED(((GLboolean*) p)[0]);
2428       break;            
2429
2430    case TYPE_MATRIX:
2431       m = *(GLmatrix **) p;
2432       for (i = 0; i < 16; i++)
2433          params[i] = FLOAT_TO_FIXED(m->m[i]);
2434       break;
2435
2436    case TYPE_MATRIX_T:
2437       m = *(GLmatrix **) p;
2438       for (i = 0; i < 16; i++)
2439          params[i] = FLOAT_TO_FIXED(m->m[transpose[i]]);
2440       break;
2441
2442    case TYPE_BIT_0:
2443    case TYPE_BIT_1:
2444    case TYPE_BIT_2:
2445    case TYPE_BIT_3:
2446    case TYPE_BIT_4:
2447    case TYPE_BIT_5:
2448    case TYPE_BIT_6:
2449    case TYPE_BIT_7:
2450       shift = d->type - TYPE_BIT_0;
2451       params[0] = BOOLEAN_TO_FIXED((*(GLbitfield *) p >> shift) & 1);
2452       break;
2453    }
2454 }