get.c revision 993e1d59
13464ebd5Sriastradh/*
23464ebd5Sriastradh * Copyright (C) 2010  Brian Paul   All Rights Reserved.
33464ebd5Sriastradh * Copyright (C) 2010  Intel Corporation
43464ebd5Sriastradh *
53464ebd5Sriastradh * Permission is hereby granted, free of charge, to any person obtaining a
63464ebd5Sriastradh * copy of this software and associated documentation files (the "Software"),
73464ebd5Sriastradh * to deal in the Software without restriction, including without limitation
83464ebd5Sriastradh * the rights to use, copy, modify, merge, publish, distribute, sublicense,
93464ebd5Sriastradh * and/or sell copies of the Software, and to permit persons to whom the
103464ebd5Sriastradh * Software is furnished to do so, subject to the following conditions:
113464ebd5Sriastradh *
123464ebd5Sriastradh * The above copyright notice and this permission notice shall be included
133464ebd5Sriastradh * in all copies or substantial portions of the Software.
143464ebd5Sriastradh *
153464ebd5Sriastradh * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
163464ebd5Sriastradh * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
173464ebd5Sriastradh * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18af69d88dSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19af69d88dSmrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20af69d88dSmrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21af69d88dSmrg * OTHER DEALINGS IN THE SOFTWARE.
223464ebd5Sriastradh *
233464ebd5Sriastradh * Author: Kristian Høgsberg <krh@bitplanet.net>
243464ebd5Sriastradh */
257117f1b4Smrg
267117f1b4Smrg#include "glheader.h"
277117f1b4Smrg#include "context.h"
28af69d88dSmrg#include "blend.h"
2901e04c3fSmrg#include "debug_output.h"
307117f1b4Smrg#include "enable.h"
313464ebd5Sriastradh#include "enums.h"
32af69d88dSmrg#include "errors.h"
337117f1b4Smrg#include "extensions.h"
347117f1b4Smrg#include "get.h"
357117f1b4Smrg#include "macros.h"
367117f1b4Smrg#include "mtypes.h"
377117f1b4Smrg#include "state.h"
387117f1b4Smrg#include "texcompress.h"
3901e04c3fSmrg#include "texstate.h"
404a49301eSmrg#include "framebuffer.h"
41af69d88dSmrg#include "samplerobj.h"
42af69d88dSmrg#include "stencil.h"
4301e04c3fSmrg#include "version.h"
447117f1b4Smrg
453464ebd5Sriastradh/* This is a table driven implemetation of the glGet*v() functions.
463464ebd5Sriastradh * The basic idea is that most getters just look up an int somewhere
473464ebd5Sriastradh * in struct gl_context and then convert it to a bool or float according to
483464ebd5Sriastradh * which of glGetIntegerv() glGetBooleanv() etc is being called.
493464ebd5Sriastradh * Instead of generating code to do this, we can just record the enum
503464ebd5Sriastradh * value and the offset into struct gl_context in an array of structs.  Then
513464ebd5Sriastradh * in glGet*(), we lookup the struct for the enum in question, and use
523464ebd5Sriastradh * the offset to get the int we need.
533464ebd5Sriastradh *
543464ebd5Sriastradh * Sometimes we need to look up a float, a boolean, a bit in a
553464ebd5Sriastradh * bitfield, a matrix or other types instead, so we need to track the
563464ebd5Sriastradh * type of the value in struct gl_context.  And sometimes the value isn't in
573464ebd5Sriastradh * struct gl_context but in the drawbuffer, the array object, current texture
583464ebd5Sriastradh * unit, or maybe it's a computed value.  So we need to also track
593464ebd5Sriastradh * where or how to find the value.  Finally, we sometimes need to
603464ebd5Sriastradh * check that one of a number of extensions are enabled, the GL
613464ebd5Sriastradh * version or flush or call _mesa_update_state().  This is done by
623464ebd5Sriastradh * attaching optional extra information to the value description
633464ebd5Sriastradh * struct, it's sort of like an array of opcodes that describe extra
643464ebd5Sriastradh * checks or actions.
653464ebd5Sriastradh *
663464ebd5Sriastradh * Putting all this together we end up with struct value_desc below,
673464ebd5Sriastradh * and with a couple of macros to help, the table of struct value_desc
683464ebd5Sriastradh * is about as concise as the specification in the old python script.
693464ebd5Sriastradh */
703464ebd5Sriastradh
717117f1b4Smrg#define FLOAT_TO_BOOLEAN(X)   ( (X) ? GL_TRUE : GL_FALSE )
723464ebd5Sriastradh#define FLOAT_TO_FIXED(F)     ( ((F) * 65536.0f > INT_MAX) ? INT_MAX : \
733464ebd5Sriastradh                                ((F) * 65536.0f < INT_MIN) ? INT_MIN : \
743464ebd5Sriastradh                                (GLint) ((F) * 65536.0f) )
757117f1b4Smrg
767117f1b4Smrg#define INT_TO_BOOLEAN(I)     ( (I) ? GL_TRUE : GL_FALSE )
773464ebd5Sriastradh#define INT_TO_FIXED(I)       ( ((I) > SHRT_MAX) ? INT_MAX : \
783464ebd5Sriastradh                                ((I) < SHRT_MIN) ? INT_MIN : \
793464ebd5Sriastradh                                (GLint) ((I) * 65536) )
807117f1b4Smrg
814a49301eSmrg#define INT64_TO_BOOLEAN(I)   ( (I) ? GL_TRUE : GL_FALSE )
824a49301eSmrg#define INT64_TO_INT(I)       ( (GLint)((I > INT_MAX) ? INT_MAX : ((I < INT_MIN) ? INT_MIN : (I))) )
834a49301eSmrg
847117f1b4Smrg#define BOOLEAN_TO_INT(B)     ( (GLint) (B) )
854a49301eSmrg#define BOOLEAN_TO_INT64(B)   ( (GLint64) (B) )
867117f1b4Smrg#define BOOLEAN_TO_FLOAT(B)   ( (B) ? 1.0F : 0.0F )
873464ebd5Sriastradh#define BOOLEAN_TO_FIXED(B)   ( (GLint) ((B) ? 1 : 0) << 16 )
887117f1b4Smrg
894a49301eSmrg#define ENUM_TO_INT64(E)      ( (GLint64) (E) )
903464ebd5Sriastradh#define ENUM_TO_FIXED(E)      (E)
914a49301eSmrg
923464ebd5Sriastradhenum value_type {
933464ebd5Sriastradh   TYPE_INVALID,
943464ebd5Sriastradh   TYPE_INT,
953464ebd5Sriastradh   TYPE_INT_2,
963464ebd5Sriastradh   TYPE_INT_3,
973464ebd5Sriastradh   TYPE_INT_4,
983464ebd5Sriastradh   TYPE_INT_N,
9901e04c3fSmrg   TYPE_UINT,
10001e04c3fSmrg   TYPE_UINT_2,
10101e04c3fSmrg   TYPE_UINT_3,
10201e04c3fSmrg   TYPE_UINT_4,
1033464ebd5Sriastradh   TYPE_INT64,
10401e04c3fSmrg   TYPE_ENUM16,
1053464ebd5Sriastradh   TYPE_ENUM,
1063464ebd5Sriastradh   TYPE_ENUM_2,
1073464ebd5Sriastradh   TYPE_BOOLEAN,
10801e04c3fSmrg   TYPE_UBYTE,
10901e04c3fSmrg   TYPE_SHORT,
1103464ebd5Sriastradh   TYPE_BIT_0,
1113464ebd5Sriastradh   TYPE_BIT_1,
1123464ebd5Sriastradh   TYPE_BIT_2,
1133464ebd5Sriastradh   TYPE_BIT_3,
1143464ebd5Sriastradh   TYPE_BIT_4,
1153464ebd5Sriastradh   TYPE_BIT_5,
116af69d88dSmrg   TYPE_BIT_6,
117af69d88dSmrg   TYPE_BIT_7,
1183464ebd5Sriastradh   TYPE_FLOAT,
1193464ebd5Sriastradh   TYPE_FLOAT_2,
1203464ebd5Sriastradh   TYPE_FLOAT_3,
1213464ebd5Sriastradh   TYPE_FLOAT_4,
12201e04c3fSmrg   TYPE_FLOAT_8,
1233464ebd5Sriastradh   TYPE_FLOATN,
1243464ebd5Sriastradh   TYPE_FLOATN_2,
1253464ebd5Sriastradh   TYPE_FLOATN_3,
1263464ebd5Sriastradh   TYPE_FLOATN_4,
1273464ebd5Sriastradh   TYPE_DOUBLEN,
128af69d88dSmrg   TYPE_DOUBLEN_2,
1293464ebd5Sriastradh   TYPE_MATRIX,
1303464ebd5Sriastradh   TYPE_MATRIX_T,
1313464ebd5Sriastradh   TYPE_CONST
1323464ebd5Sriastradh};
1337117f1b4Smrg
1343464ebd5Sriastradhenum value_location {
1353464ebd5Sriastradh   LOC_BUFFER,
1363464ebd5Sriastradh   LOC_CONTEXT,
1373464ebd5Sriastradh   LOC_ARRAY,
1383464ebd5Sriastradh   LOC_TEXUNIT,
1393464ebd5Sriastradh   LOC_CUSTOM
1403464ebd5Sriastradh};
1413464ebd5Sriastradh
1423464ebd5Sriastradhenum value_extra {
1433464ebd5Sriastradh   EXTRA_END = 0x8000,
1443464ebd5Sriastradh   EXTRA_VERSION_30,
1453464ebd5Sriastradh   EXTRA_VERSION_31,
1463464ebd5Sriastradh   EXTRA_VERSION_32,
147af69d88dSmrg   EXTRA_VERSION_40,
14801e04c3fSmrg   EXTRA_VERSION_43,
149af69d88dSmrg   EXTRA_API_GL,
150af69d88dSmrg   EXTRA_API_GL_CORE,
151af69d88dSmrg   EXTRA_API_ES2,
152af69d88dSmrg   EXTRA_API_ES3,
15301e04c3fSmrg   EXTRA_API_ES31,
15401e04c3fSmrg   EXTRA_API_ES32,
15501e04c3fSmrg   EXTRA_NEW_BUFFERS,
1563464ebd5Sriastradh   EXTRA_NEW_FRAG_CLAMP,
1573464ebd5Sriastradh   EXTRA_VALID_DRAW_BUFFER,
1583464ebd5Sriastradh   EXTRA_VALID_TEXTURE_UNIT,
159af69d88dSmrg   EXTRA_VALID_CLIP_DISTANCE,
1603464ebd5Sriastradh   EXTRA_FLUSH_CURRENT,
161af69d88dSmrg   EXTRA_GLSL_130,
16201e04c3fSmrg   EXTRA_EXT_UBO_GS,
16301e04c3fSmrg   EXTRA_EXT_ATOMICS_GS,
16401e04c3fSmrg   EXTRA_EXT_SHADER_IMAGE_GS,
16501e04c3fSmrg   EXTRA_EXT_ATOMICS_TESS,
16601e04c3fSmrg   EXTRA_EXT_SHADER_IMAGE_TESS,
16701e04c3fSmrg   EXTRA_EXT_SSBO_GS,
16801e04c3fSmrg   EXTRA_EXT_FB_NO_ATTACH_GS,
16901e04c3fSmrg   EXTRA_EXT_ES_GS,
17001e04c3fSmrg   EXTRA_EXT_PROVOKING_VERTEX_32,
1713464ebd5Sriastradh};
1723464ebd5Sriastradh
1733464ebd5Sriastradh#define NO_EXTRA NULL
1743464ebd5Sriastradh#define NO_OFFSET 0
1753464ebd5Sriastradh
1763464ebd5Sriastradhstruct value_desc {
1773464ebd5Sriastradh   GLenum pname;
1783464ebd5Sriastradh   GLubyte location;  /**< enum value_location */
1793464ebd5Sriastradh   GLubyte type;      /**< enum value_type */
1803464ebd5Sriastradh   int offset;
1813464ebd5Sriastradh   const int *extra;
1823464ebd5Sriastradh};
1833464ebd5Sriastradh
1843464ebd5Sriastradhunion value {
1853464ebd5Sriastradh   GLfloat value_float;
1863464ebd5Sriastradh   GLfloat value_float_4[4];
187af69d88dSmrg   GLdouble value_double_2[2];
1883464ebd5Sriastradh   GLmatrix *value_matrix;
1893464ebd5Sriastradh   GLint value_int;
1903464ebd5Sriastradh   GLint value_int_4[4];
1913464ebd5Sriastradh   GLint64 value_int64;
1923464ebd5Sriastradh   GLenum value_enum;
19301e04c3fSmrg   GLubyte value_ubyte;
19401e04c3fSmrg   GLshort value_short;
19501e04c3fSmrg   GLuint value_uint;
1963464ebd5Sriastradh
1973464ebd5Sriastradh   /* Sigh, see GL_COMPRESSED_TEXTURE_FORMATS_ARB handling */
1983464ebd5Sriastradh   struct {
1993464ebd5Sriastradh      GLint n, ints[100];
2003464ebd5Sriastradh   } value_int_n;
2013464ebd5Sriastradh   GLboolean value_bool;
2023464ebd5Sriastradh};
2033464ebd5Sriastradh
2043464ebd5Sriastradh#define BUFFER_FIELD(field, type) \
2053464ebd5Sriastradh   LOC_BUFFER, type, offsetof(struct gl_framebuffer, field)
2063464ebd5Sriastradh#define CONTEXT_FIELD(field, type) \
2073464ebd5Sriastradh   LOC_CONTEXT, type, offsetof(struct gl_context, field)
2083464ebd5Sriastradh#define ARRAY_FIELD(field, type) \
209af69d88dSmrg   LOC_ARRAY, type, offsetof(struct gl_vertex_array_object, field)
210af69d88dSmrg#undef CONST /* already defined through windows.h */
2113464ebd5Sriastradh#define CONST(value) \
2123464ebd5Sriastradh   LOC_CONTEXT, TYPE_CONST, value
2133464ebd5Sriastradh
2143464ebd5Sriastradh#define BUFFER_INT(field) BUFFER_FIELD(field, TYPE_INT)
2153464ebd5Sriastradh#define BUFFER_ENUM(field) BUFFER_FIELD(field, TYPE_ENUM)
21601e04c3fSmrg#define BUFFER_ENUM16(field) BUFFER_FIELD(field, TYPE_ENUM16)
2173464ebd5Sriastradh#define BUFFER_BOOL(field) BUFFER_FIELD(field, TYPE_BOOLEAN)
2183464ebd5Sriastradh
2193464ebd5Sriastradh#define CONTEXT_INT(field) CONTEXT_FIELD(field, TYPE_INT)
2203464ebd5Sriastradh#define CONTEXT_INT2(field) CONTEXT_FIELD(field, TYPE_INT_2)
2213464ebd5Sriastradh#define CONTEXT_INT64(field) CONTEXT_FIELD(field, TYPE_INT64)
22201e04c3fSmrg#define CONTEXT_UINT(field) CONTEXT_FIELD(field, TYPE_UINT)
22301e04c3fSmrg#define CONTEXT_ENUM16(field) CONTEXT_FIELD(field, TYPE_ENUM16)
2243464ebd5Sriastradh#define CONTEXT_ENUM(field) CONTEXT_FIELD(field, TYPE_ENUM)
2253464ebd5Sriastradh#define CONTEXT_ENUM2(field) CONTEXT_FIELD(field, TYPE_ENUM_2)
2263464ebd5Sriastradh#define CONTEXT_BOOL(field) CONTEXT_FIELD(field, TYPE_BOOLEAN)
2273464ebd5Sriastradh#define CONTEXT_BIT0(field) CONTEXT_FIELD(field, TYPE_BIT_0)
2283464ebd5Sriastradh#define CONTEXT_BIT1(field) CONTEXT_FIELD(field, TYPE_BIT_1)
2293464ebd5Sriastradh#define CONTEXT_BIT2(field) CONTEXT_FIELD(field, TYPE_BIT_2)
2303464ebd5Sriastradh#define CONTEXT_BIT3(field) CONTEXT_FIELD(field, TYPE_BIT_3)
2313464ebd5Sriastradh#define CONTEXT_BIT4(field) CONTEXT_FIELD(field, TYPE_BIT_4)
2323464ebd5Sriastradh#define CONTEXT_BIT5(field) CONTEXT_FIELD(field, TYPE_BIT_5)
233af69d88dSmrg#define CONTEXT_BIT6(field) CONTEXT_FIELD(field, TYPE_BIT_6)
234af69d88dSmrg#define CONTEXT_BIT7(field) CONTEXT_FIELD(field, TYPE_BIT_7)
2353464ebd5Sriastradh#define CONTEXT_FLOAT(field) CONTEXT_FIELD(field, TYPE_FLOAT)
2363464ebd5Sriastradh#define CONTEXT_FLOAT2(field) CONTEXT_FIELD(field, TYPE_FLOAT_2)
2373464ebd5Sriastradh#define CONTEXT_FLOAT3(field) CONTEXT_FIELD(field, TYPE_FLOAT_3)
2383464ebd5Sriastradh#define CONTEXT_FLOAT4(field) CONTEXT_FIELD(field, TYPE_FLOAT_4)
23901e04c3fSmrg#define CONTEXT_FLOAT8(field) CONTEXT_FIELD(field, TYPE_FLOAT_8)
2403464ebd5Sriastradh#define CONTEXT_MATRIX(field) CONTEXT_FIELD(field, TYPE_MATRIX)
2413464ebd5Sriastradh#define CONTEXT_MATRIX_T(field) CONTEXT_FIELD(field, TYPE_MATRIX_T)
2423464ebd5Sriastradh
24301e04c3fSmrg/* Vertex array fields */
2443464ebd5Sriastradh#define ARRAY_INT(field) ARRAY_FIELD(field, TYPE_INT)
2453464ebd5Sriastradh#define ARRAY_ENUM(field) ARRAY_FIELD(field, TYPE_ENUM)
24601e04c3fSmrg#define ARRAY_ENUM16(field) ARRAY_FIELD(field, TYPE_ENUM16)
2473464ebd5Sriastradh#define ARRAY_BOOL(field) ARRAY_FIELD(field, TYPE_BOOLEAN)
24801e04c3fSmrg#define ARRAY_UBYTE(field) ARRAY_FIELD(field, TYPE_UBYTE)
24901e04c3fSmrg#define ARRAY_SHORT(field) ARRAY_FIELD(field, TYPE_SHORT)
2503464ebd5Sriastradh
2513464ebd5Sriastradh#define EXT(f)					\
2523464ebd5Sriastradh   offsetof(struct gl_extensions, f)
2533464ebd5Sriastradh
2543464ebd5Sriastradh#define EXTRA_EXT(e)				\
2553464ebd5Sriastradh   static const int extra_##e[] = {		\
2563464ebd5Sriastradh      EXT(e), EXTRA_END				\
2577117f1b4Smrg   }
2587117f1b4Smrg
2593464ebd5Sriastradh#define EXTRA_EXT2(e1, e2)			\
2603464ebd5Sriastradh   static const int extra_##e1##_##e2[] = {	\
2613464ebd5Sriastradh      EXT(e1), EXT(e2), EXTRA_END		\
2623464ebd5Sriastradh   }
2633464ebd5Sriastradh
2643464ebd5Sriastradh/* The 'extra' mechanism is a way to specify extra checks (such as
2653464ebd5Sriastradh * extensions or specific gl versions) or actions (flush current, new
2663464ebd5Sriastradh * buffers) that we need to do before looking up an enum.  We need to
2673464ebd5Sriastradh * declare them all up front so we can refer to them in the value_desc
268af69d88dSmrg * structs below.
269af69d88dSmrg *
270af69d88dSmrg * Each EXTRA_ will be executed.  For EXTRA_* enums of extensions and API
271af69d88dSmrg * versions, listing multiple ones in an array means an error will be thrown
272af69d88dSmrg * only if none of them are available.  If you need to check for "AND"
273af69d88dSmrg * behavior, you would need to make a custom EXTRA_ enum.
274af69d88dSmrg */
2753464ebd5Sriastradh
2763464ebd5Sriastradhstatic const int extra_new_buffers[] = {
2773464ebd5Sriastradh   EXTRA_NEW_BUFFERS,
2783464ebd5Sriastradh   EXTRA_END
2793464ebd5Sriastradh};
2803464ebd5Sriastradh
2813464ebd5Sriastradhstatic const int extra_new_frag_clamp[] = {
2823464ebd5Sriastradh   EXTRA_NEW_FRAG_CLAMP,
2833464ebd5Sriastradh   EXTRA_END
2843464ebd5Sriastradh};
2853464ebd5Sriastradh
2863464ebd5Sriastradhstatic const int extra_valid_draw_buffer[] = {
2873464ebd5Sriastradh   EXTRA_VALID_DRAW_BUFFER,
2883464ebd5Sriastradh   EXTRA_END
2893464ebd5Sriastradh};
2903464ebd5Sriastradh
2913464ebd5Sriastradhstatic const int extra_valid_texture_unit[] = {
2923464ebd5Sriastradh   EXTRA_VALID_TEXTURE_UNIT,
2933464ebd5Sriastradh   EXTRA_END
2943464ebd5Sriastradh};
2953464ebd5Sriastradh
296af69d88dSmrgstatic const int extra_valid_clip_distance[] = {
297af69d88dSmrg   EXTRA_VALID_CLIP_DISTANCE,
298af69d88dSmrg   EXTRA_END
299af69d88dSmrg};
300af69d88dSmrg
3013464ebd5Sriastradhstatic const int extra_flush_current_valid_texture_unit[] = {
3023464ebd5Sriastradh   EXTRA_FLUSH_CURRENT,
3033464ebd5Sriastradh   EXTRA_VALID_TEXTURE_UNIT,
3043464ebd5Sriastradh   EXTRA_END
3053464ebd5Sriastradh};
3063464ebd5Sriastradh
3073464ebd5Sriastradhstatic const int extra_flush_current[] = {
3083464ebd5Sriastradh   EXTRA_FLUSH_CURRENT,
3093464ebd5Sriastradh   EXTRA_END
3103464ebd5Sriastradh};
3113464ebd5Sriastradh
312af69d88dSmrgstatic const int extra_EXT_texture_integer_and_new_buffers[] = {
313af69d88dSmrg   EXT(EXT_texture_integer),
3143464ebd5Sriastradh   EXTRA_NEW_BUFFERS,
3153464ebd5Sriastradh   EXTRA_END
3163464ebd5Sriastradh};
3173464ebd5Sriastradh
318af69d88dSmrgstatic const int extra_GLSL_130_es3[] = {
319af69d88dSmrg   EXTRA_GLSL_130,
320af69d88dSmrg   EXTRA_API_ES3,
3213464ebd5Sriastradh   EXTRA_END
3223464ebd5Sriastradh};
3233464ebd5Sriastradh
324af69d88dSmrgstatic const int extra_texture_buffer_object[] = {
325af69d88dSmrg   EXT(ARB_texture_buffer_object),
3263464ebd5Sriastradh   EXTRA_END
3273464ebd5Sriastradh};
3283464ebd5Sriastradh
329af69d88dSmrgstatic const int extra_ARB_transform_feedback2_api_es3[] = {
330af69d88dSmrg   EXT(ARB_transform_feedback2),
331af69d88dSmrg   EXTRA_API_ES3,
3323464ebd5Sriastradh   EXTRA_END
3333464ebd5Sriastradh};
3343464ebd5Sriastradh
335af69d88dSmrgstatic const int extra_ARB_uniform_buffer_object_and_geometry_shader[] = {
33601e04c3fSmrg   EXTRA_EXT_UBO_GS,
3373464ebd5Sriastradh   EXTRA_END
3383464ebd5Sriastradh};
3393464ebd5Sriastradh
340af69d88dSmrgstatic const int extra_ARB_ES2_compatibility_api_es2[] = {
341af69d88dSmrg   EXT(ARB_ES2_compatibility),
342af69d88dSmrg   EXTRA_API_ES2,
3433464ebd5Sriastradh   EXTRA_END
3443464ebd5Sriastradh};
3453464ebd5Sriastradh
346af69d88dSmrgstatic const int extra_ARB_ES3_compatibility_api_es3[] = {
347af69d88dSmrg   EXT(ARB_ES3_compatibility),
348af69d88dSmrg   EXTRA_API_ES3,
349af69d88dSmrg   EXTRA_END
350af69d88dSmrg};
351af69d88dSmrg
352af69d88dSmrgstatic const int extra_EXT_framebuffer_sRGB_and_new_buffers[] = {
353af69d88dSmrg   EXT(EXT_framebuffer_sRGB),
354af69d88dSmrg   EXTRA_NEW_BUFFERS,
355af69d88dSmrg   EXTRA_END
356af69d88dSmrg};
357af69d88dSmrg
358af69d88dSmrgstatic const int extra_EXT_packed_float[] = {
359af69d88dSmrg   EXT(EXT_packed_float),
360af69d88dSmrg   EXTRA_NEW_BUFFERS,
361af69d88dSmrg   EXTRA_END
362af69d88dSmrg};
363af69d88dSmrg
364af69d88dSmrgstatic const int extra_EXT_texture_array_es3[] = {
365af69d88dSmrg   EXT(EXT_texture_array),
366af69d88dSmrg   EXTRA_API_ES3,
367af69d88dSmrg   EXTRA_END
368af69d88dSmrg};
369af69d88dSmrg
370af69d88dSmrgstatic const int extra_ARB_shader_atomic_counters_and_geometry_shader[] = {
37101e04c3fSmrg   EXTRA_EXT_ATOMICS_GS,
372af69d88dSmrg   EXTRA_END
373af69d88dSmrg};
374af69d88dSmrg
375af69d88dSmrgstatic const int extra_ARB_shader_image_load_store_and_geometry_shader[] = {
37601e04c3fSmrg   EXTRA_EXT_SHADER_IMAGE_GS,
37701e04c3fSmrg   EXTRA_END
37801e04c3fSmrg};
37901e04c3fSmrg
38001e04c3fSmrgstatic const int extra_ARB_shader_atomic_counters_and_tessellation[] = {
38101e04c3fSmrg   EXTRA_EXT_ATOMICS_TESS,
38201e04c3fSmrg   EXTRA_END
38301e04c3fSmrg};
38401e04c3fSmrg
38501e04c3fSmrgstatic const int extra_ARB_shader_image_load_store_and_tessellation[] = {
38601e04c3fSmrg   EXTRA_EXT_SHADER_IMAGE_TESS,
38701e04c3fSmrg   EXTRA_END
38801e04c3fSmrg};
38901e04c3fSmrg
39001e04c3fSmrg/* HACK: remove when ARB_compute_shader is actually supported */
39101e04c3fSmrgstatic const int extra_ARB_compute_shader_es31[] = {
39201e04c3fSmrg   EXT(ARB_compute_shader),
39301e04c3fSmrg   EXTRA_API_ES31,
39401e04c3fSmrg   EXTRA_END
39501e04c3fSmrg};
39601e04c3fSmrg
39701e04c3fSmrgstatic const int extra_ARB_shader_storage_buffer_object_es31[] = {
39801e04c3fSmrg   EXT(ARB_shader_storage_buffer_object),
39901e04c3fSmrg   EXTRA_API_ES31,
40001e04c3fSmrg   EXTRA_END
40101e04c3fSmrg};
40201e04c3fSmrg
40301e04c3fSmrgstatic const int extra_ARB_shader_storage_buffer_object_and_geometry_shader[] = {
40401e04c3fSmrg   EXTRA_EXT_SSBO_GS,
40501e04c3fSmrg   EXTRA_END
40601e04c3fSmrg};
40701e04c3fSmrg
40801e04c3fSmrgstatic const int extra_ARB_shader_image_load_store_shader_storage_buffer_object_es31[] = {
40901e04c3fSmrg   EXT(ARB_shader_image_load_store),
41001e04c3fSmrg   EXT(ARB_shader_storage_buffer_object),
41101e04c3fSmrg   EXTRA_API_ES31,
41201e04c3fSmrg   EXTRA_END
41301e04c3fSmrg};
41401e04c3fSmrg
41501e04c3fSmrgstatic const int extra_ARB_framebuffer_no_attachments_and_geometry_shader[] = {
41601e04c3fSmrg   EXTRA_EXT_FB_NO_ATTACH_GS,
41701e04c3fSmrg   EXTRA_END
41801e04c3fSmrg};
41901e04c3fSmrg
42001e04c3fSmrgstatic const int extra_ARB_viewport_array_or_oes_geometry_shader[] = {
42101e04c3fSmrg   EXT(ARB_viewport_array),
42201e04c3fSmrg   EXTRA_EXT_ES_GS,
42301e04c3fSmrg   EXTRA_END
42401e04c3fSmrg};
42501e04c3fSmrg
42601e04c3fSmrgstatic const int extra_ARB_viewport_array_or_oes_viewport_array[] = {
42701e04c3fSmrg   EXT(ARB_viewport_array),
42801e04c3fSmrg   EXT(OES_viewport_array),
42901e04c3fSmrg   EXTRA_END
43001e04c3fSmrg};
43101e04c3fSmrg
43201e04c3fSmrgstatic const int extra_ARB_gpu_shader5_or_oes_geometry_shader[] = {
43301e04c3fSmrg   EXT(ARB_gpu_shader5),
43401e04c3fSmrg   EXTRA_EXT_ES_GS,
43501e04c3fSmrg   EXTRA_END
43601e04c3fSmrg};
43701e04c3fSmrg
43801e04c3fSmrgstatic const int extra_ARB_gpu_shader5_or_OES_sample_variables[] = {
43901e04c3fSmrg   EXT(ARB_gpu_shader5),
44001e04c3fSmrg   EXT(OES_sample_variables),
44101e04c3fSmrg   EXTRA_END
44201e04c3fSmrg};
44301e04c3fSmrg
44401e04c3fSmrgstatic const int extra_ES32[] = {
44501e04c3fSmrg   EXT(ARB_ES3_2_compatibility),
44601e04c3fSmrg   EXTRA_API_ES32,
44701e04c3fSmrg   EXTRA_END
44801e04c3fSmrg};
44901e04c3fSmrg
45001e04c3fSmrgstatic const int extra_KHR_robustness_or_GL[] = {
45101e04c3fSmrg   EXT(KHR_robustness),
45201e04c3fSmrg   EXTRA_API_GL,
45301e04c3fSmrg   EXTRA_API_GL_CORE,
45401e04c3fSmrg   EXTRA_END
45501e04c3fSmrg};
45601e04c3fSmrg
45701e04c3fSmrgstatic const int extra_INTEL_conservative_rasterization[] = {
45801e04c3fSmrg   EXT(INTEL_conservative_rasterization),
459af69d88dSmrg   EXTRA_END
460af69d88dSmrg};
4613464ebd5Sriastradh
4623464ebd5SriastradhEXTRA_EXT(ARB_texture_cube_map);
463af69d88dSmrgEXTRA_EXT(EXT_texture_array);
464af69d88dSmrgEXTRA_EXT(NV_fog_distance);
4653464ebd5SriastradhEXTRA_EXT(EXT_texture_filter_anisotropic);
4663464ebd5SriastradhEXTRA_EXT(NV_point_sprite);
4673464ebd5SriastradhEXTRA_EXT(NV_texture_rectangle);
4683464ebd5SriastradhEXTRA_EXT(EXT_stencil_two_side);
4693464ebd5SriastradhEXTRA_EXT(EXT_depth_bounds_test);
4703464ebd5SriastradhEXTRA_EXT(ARB_depth_clamp);
47101e04c3fSmrgEXTRA_EXT(AMD_depth_clamp_separate);
4723464ebd5SriastradhEXTRA_EXT(ATI_fragment_shader);
4733464ebd5SriastradhEXTRA_EXT(EXT_provoking_vertex);
4743464ebd5SriastradhEXTRA_EXT(ARB_fragment_shader);
4753464ebd5SriastradhEXTRA_EXT(ARB_fragment_program);
4763464ebd5SriastradhEXTRA_EXT2(ARB_framebuffer_object, EXT_framebuffer_multisample);
4773464ebd5SriastradhEXTRA_EXT(ARB_seamless_cube_map);
4783464ebd5SriastradhEXTRA_EXT(ARB_sync);
4793464ebd5SriastradhEXTRA_EXT(ARB_vertex_shader);
4803464ebd5SriastradhEXTRA_EXT(EXT_transform_feedback);
481af69d88dSmrgEXTRA_EXT(ARB_transform_feedback3);
4823464ebd5SriastradhEXTRA_EXT(EXT_pixel_buffer_object);
4833464ebd5SriastradhEXTRA_EXT(ARB_vertex_program);
4843464ebd5SriastradhEXTRA_EXT2(NV_point_sprite, ARB_point_sprite);
4853464ebd5SriastradhEXTRA_EXT2(ARB_vertex_program, ARB_fragment_program);
486af69d88dSmrgEXTRA_EXT(ARB_color_buffer_float);
4873464ebd5SriastradhEXTRA_EXT(EXT_framebuffer_sRGB);
488af69d88dSmrgEXTRA_EXT(OES_EGL_image_external);
489af69d88dSmrgEXTRA_EXT(ARB_blend_func_extended);
490af69d88dSmrgEXTRA_EXT(ARB_uniform_buffer_object);
491af69d88dSmrgEXTRA_EXT(ARB_timer_query);
49201e04c3fSmrgEXTRA_EXT2(ARB_texture_cube_map_array, OES_texture_cube_map_array);
493af69d88dSmrgEXTRA_EXT(ARB_texture_buffer_range);
494af69d88dSmrgEXTRA_EXT(ARB_texture_multisample);
495af69d88dSmrgEXTRA_EXT(ARB_texture_gather);
496af69d88dSmrgEXTRA_EXT(ARB_shader_atomic_counters);
497af69d88dSmrgEXTRA_EXT(ARB_draw_indirect);
498af69d88dSmrgEXTRA_EXT(ARB_shader_image_load_store);
49901e04c3fSmrgEXTRA_EXT(ARB_query_buffer_object);
500af69d88dSmrgEXTRA_EXT2(ARB_transform_feedback3, ARB_gpu_shader5);
501af69d88dSmrgEXTRA_EXT(INTEL_performance_query);
502af69d88dSmrgEXTRA_EXT(ARB_explicit_uniform_location);
50301e04c3fSmrgEXTRA_EXT(ARB_clip_control);
50401e04c3fSmrgEXTRA_EXT(ARB_polygon_offset_clamp);
50501e04c3fSmrgEXTRA_EXT(ARB_framebuffer_no_attachments);
50601e04c3fSmrgEXTRA_EXT(ARB_tessellation_shader);
50701e04c3fSmrgEXTRA_EXT(ARB_shader_storage_buffer_object);
50801e04c3fSmrgEXTRA_EXT(ARB_indirect_parameters);
50901e04c3fSmrgEXTRA_EXT(ATI_meminfo);
51001e04c3fSmrgEXTRA_EXT(NVX_gpu_memory_info);
51101e04c3fSmrgEXTRA_EXT(ARB_cull_distance);
51201e04c3fSmrgEXTRA_EXT(EXT_window_rectangles);
51301e04c3fSmrgEXTRA_EXT(KHR_blend_equation_advanced_coherent);
51401e04c3fSmrgEXTRA_EXT(OES_primitive_bounding_box);
51501e04c3fSmrgEXTRA_EXT(ARB_compute_variable_group_size);
51601e04c3fSmrgEXTRA_EXT(KHR_robustness);
51701e04c3fSmrgEXTRA_EXT(ARB_sparse_buffer);
51801e04c3fSmrgEXTRA_EXT(NV_conservative_raster);
51901e04c3fSmrgEXTRA_EXT(NV_conservative_raster_dilate);
52001e04c3fSmrgEXTRA_EXT(NV_conservative_raster_pre_snap_triangles);
52101e04c3fSmrgEXTRA_EXT(ARB_sample_locations);
52201e04c3fSmrgEXTRA_EXT(AMD_framebuffer_multisample_advanced);
5233464ebd5Sriastradh
5243464ebd5Sriastradhstatic const int
525af69d88dSmrgextra_ARB_color_buffer_float_or_glcore[] = {
526af69d88dSmrg   EXT(ARB_color_buffer_float),
527af69d88dSmrg   EXTRA_API_GL_CORE,
5283464ebd5Sriastradh   EXTRA_END
5293464ebd5Sriastradh};
5303464ebd5Sriastradh
5313464ebd5Sriastradhstatic const int
5323464ebd5Sriastradhextra_NV_primitive_restart[] = {
5333464ebd5Sriastradh   EXT(NV_primitive_restart),
5343464ebd5Sriastradh   EXTRA_END
5353464ebd5Sriastradh};
5363464ebd5Sriastradh
5373464ebd5Sriastradhstatic const int extra_version_30[] = { EXTRA_VERSION_30, EXTRA_END };
5383464ebd5Sriastradhstatic const int extra_version_31[] = { EXTRA_VERSION_31, EXTRA_END };
5393464ebd5Sriastradhstatic const int extra_version_32[] = { EXTRA_VERSION_32, EXTRA_END };
54001e04c3fSmrgstatic const int extra_version_43[] = { EXTRA_VERSION_43, EXTRA_END };
541af69d88dSmrg
542af69d88dSmrgstatic const int extra_gl30_es3[] = {
543af69d88dSmrg    EXTRA_VERSION_30,
544af69d88dSmrg    EXTRA_API_ES3,
545af69d88dSmrg    EXTRA_END,
546af69d88dSmrg};
547af69d88dSmrg
548af69d88dSmrgstatic const int extra_gl32_es3[] = {
549af69d88dSmrg    EXTRA_VERSION_32,
550af69d88dSmrg    EXTRA_API_ES3,
551af69d88dSmrg    EXTRA_END,
552af69d88dSmrg};
553af69d88dSmrg
55401e04c3fSmrgstatic const int extra_version_32_OES_geometry_shader[] = {
555af69d88dSmrg    EXTRA_VERSION_32,
55601e04c3fSmrg    EXTRA_EXT_ES_GS,
557af69d88dSmrg    EXTRA_END
558af69d88dSmrg};
559af69d88dSmrg
560af69d88dSmrgstatic const int extra_gl40_ARB_sample_shading[] = {
561af69d88dSmrg   EXTRA_VERSION_40,
562af69d88dSmrg   EXT(ARB_sample_shading),
563af69d88dSmrg   EXTRA_END
564af69d88dSmrg};
5653464ebd5Sriastradh
5663464ebd5Sriastradhstatic const int
567af69d88dSmrgextra_ARB_vertex_program_api_es2[] = {
5683464ebd5Sriastradh   EXT(ARB_vertex_program),
569af69d88dSmrg   EXTRA_API_ES2,
570af69d88dSmrg   EXTRA_END
571af69d88dSmrg};
572af69d88dSmrg
573af69d88dSmrg/* The ReadBuffer get token is valid under either full GL or under
574af69d88dSmrg * GLES2 if the NV_read_buffer extension is available. */
575af69d88dSmrgstatic const int
576af69d88dSmrgextra_NV_read_buffer_api_gl[] = {
577af69d88dSmrg   EXTRA_API_ES2,
578af69d88dSmrg   EXTRA_API_GL,
5793464ebd5Sriastradh   EXTRA_END
5803464ebd5Sriastradh};
5813464ebd5Sriastradh
582af69d88dSmrgstatic const int extra_core_ARB_color_buffer_float_and_new_buffers[] = {
583af69d88dSmrg   EXTRA_API_GL_CORE,
584af69d88dSmrg   EXT(ARB_color_buffer_float),
585af69d88dSmrg   EXTRA_NEW_BUFFERS,
586af69d88dSmrg   EXTRA_END
587af69d88dSmrg};
5883464ebd5Sriastradh
58901e04c3fSmrgstatic const int extra_EXT_shader_framebuffer_fetch[] = {
59001e04c3fSmrg   EXTRA_API_ES2,
59101e04c3fSmrg   EXTRA_API_ES3,
59201e04c3fSmrg   EXT(EXT_shader_framebuffer_fetch),
59301e04c3fSmrg   EXTRA_END
59401e04c3fSmrg};
59501e04c3fSmrg
59601e04c3fSmrgstatic const int extra_EXT_provoking_vertex_32[] = {
59701e04c3fSmrg   EXTRA_EXT_PROVOKING_VERTEX_32,
59801e04c3fSmrg   EXTRA_END
59901e04c3fSmrg};
60001e04c3fSmrg
60101e04c3fSmrgstatic const int extra_EXT_disjoint_timer_query[] = {
60201e04c3fSmrg   EXTRA_API_ES2,
60301e04c3fSmrg   EXTRA_API_ES3,
60401e04c3fSmrg   EXT(EXT_disjoint_timer_query),
60501e04c3fSmrg   EXTRA_END
60601e04c3fSmrg};
60701e04c3fSmrg
60801e04c3fSmrg
6093464ebd5Sriastradh/* This is the big table describing all the enums we accept in
6103464ebd5Sriastradh * glGet*v().  The table is partitioned into six parts: enums
6113464ebd5Sriastradh * understood by all GL APIs (OpenGL, GLES and GLES2), enums shared
6123464ebd5Sriastradh * between OpenGL and GLES, enums exclusive to GLES, etc for the
613af69d88dSmrg * remaining combinations. To look up the enums valid in a given API
614af69d88dSmrg * we will use a hash table specific to that API. These tables are in
615af69d88dSmrg * turn generated at build time and included through get_hash.h.
616af69d88dSmrg */
6173464ebd5Sriastradh
618af69d88dSmrg#include "get_hash.h"
6193464ebd5Sriastradh
6203464ebd5Sriastradh/* All we need now is a way to look up the value struct from the enum.
6213464ebd5Sriastradh * The code generated by gcc for the old generated big switch
6223464ebd5Sriastradh * statement is a big, balanced, open coded if/else tree, essentially
6233464ebd5Sriastradh * an unrolled binary search.  It would be natural to sort the new
6243464ebd5Sriastradh * enum table and use bsearch(), but we will use a read-only hash
6253464ebd5Sriastradh * table instead.  bsearch() has a nice guaranteed worst case
6263464ebd5Sriastradh * performance, but we're also guaranteed to hit that worst case
6273464ebd5Sriastradh * (log2(n) iterations) for about half the enums.  Instead, using an
6283464ebd5Sriastradh * open addressing hash table, we can find the enum on the first try
6293464ebd5Sriastradh * for 80% of the enums, 1 collision for 10% and never more than 5
6303464ebd5Sriastradh * collisions for any enum (typical numbers).  And the code is very
6313464ebd5Sriastradh * simple, even though it feels a little magic. */
6323464ebd5Sriastradh
6333464ebd5Sriastradh/**
6343464ebd5Sriastradh * Handle irregular enums
6353464ebd5Sriastradh *
6363464ebd5Sriastradh * Some values don't conform to the "well-known type at context
6373464ebd5Sriastradh * pointer + offset" pattern, so we have this function to catch all
6383464ebd5Sriastradh * the corner cases.  Typically, it's a computed value or a one-off
6393464ebd5Sriastradh * pointer to a custom struct or something.
6403464ebd5Sriastradh *
6413464ebd5Sriastradh * In this case we can't return a pointer to the value, so we'll have
6423464ebd5Sriastradh * to use the temporary variable 'v' declared back in the calling
6433464ebd5Sriastradh * glGet*v() function to store the result.
6443464ebd5Sriastradh *
6453464ebd5Sriastradh * \param ctx the current context
6463464ebd5Sriastradh * \param d the struct value_desc that describes the enum
6473464ebd5Sriastradh * \param v pointer to the tmp declared in the calling glGet*v() function
6483464ebd5Sriastradh */
6493464ebd5Sriastradhstatic void
6503464ebd5Sriastradhfind_custom_value(struct gl_context *ctx, const struct value_desc *d, union value *v)
6513464ebd5Sriastradh{
6523464ebd5Sriastradh   struct gl_buffer_object **buffer_obj;
65301e04c3fSmrg   struct gl_array_attributes *array;
6543464ebd5Sriastradh   GLuint unit, *p;
6553464ebd5Sriastradh
6563464ebd5Sriastradh   switch (d->pname) {
657af69d88dSmrg   case GL_MAJOR_VERSION:
658af69d88dSmrg      v->value_int = ctx->Version / 10;
659af69d88dSmrg      break;
660af69d88dSmrg   case GL_MINOR_VERSION:
661af69d88dSmrg      v->value_int = ctx->Version % 10;
662af69d88dSmrg      break;
663af69d88dSmrg
6643464ebd5Sriastradh   case GL_TEXTURE_1D:
6653464ebd5Sriastradh   case GL_TEXTURE_2D:
6663464ebd5Sriastradh   case GL_TEXTURE_3D:
66701e04c3fSmrg   case GL_TEXTURE_CUBE_MAP:
6683464ebd5Sriastradh   case GL_TEXTURE_RECTANGLE_NV:
669af69d88dSmrg   case GL_TEXTURE_EXTERNAL_OES:
6703464ebd5Sriastradh      v->value_bool = _mesa_IsEnabled(d->pname);
6713464ebd5Sriastradh      break;
6723464ebd5Sriastradh
6733464ebd5Sriastradh   case GL_LINE_STIPPLE_PATTERN:
6743464ebd5Sriastradh      /* This is the only GLushort, special case it here by promoting
6753464ebd5Sriastradh       * to an int rather than introducing a new type. */
6763464ebd5Sriastradh      v->value_int = ctx->Line.StipplePattern;
6773464ebd5Sriastradh      break;
6783464ebd5Sriastradh
6793464ebd5Sriastradh   case GL_CURRENT_RASTER_TEXTURE_COORDS:
6803464ebd5Sriastradh      unit = ctx->Texture.CurrentUnit;
6813464ebd5Sriastradh      v->value_float_4[0] = ctx->Current.RasterTexCoords[unit][0];
6823464ebd5Sriastradh      v->value_float_4[1] = ctx->Current.RasterTexCoords[unit][1];
6833464ebd5Sriastradh      v->value_float_4[2] = ctx->Current.RasterTexCoords[unit][2];
6843464ebd5Sriastradh      v->value_float_4[3] = ctx->Current.RasterTexCoords[unit][3];
6853464ebd5Sriastradh      break;
6863464ebd5Sriastradh
6873464ebd5Sriastradh   case GL_CURRENT_TEXTURE_COORDS:
6883464ebd5Sriastradh      unit = ctx->Texture.CurrentUnit;
6893464ebd5Sriastradh      v->value_float_4[0] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][0];
6903464ebd5Sriastradh      v->value_float_4[1] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][1];
6913464ebd5Sriastradh      v->value_float_4[2] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][2];
6923464ebd5Sriastradh      v->value_float_4[3] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][3];
6933464ebd5Sriastradh      break;
6943464ebd5Sriastradh
6953464ebd5Sriastradh   case GL_COLOR_WRITEMASK:
69601e04c3fSmrg      v->value_int_4[0] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 0);
69701e04c3fSmrg      v->value_int_4[1] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 1);
69801e04c3fSmrg      v->value_int_4[2] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 2);
69901e04c3fSmrg      v->value_int_4[3] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 3);
70001e04c3fSmrg      break;
70101e04c3fSmrg
70201e04c3fSmrg   case GL_DEPTH_CLAMP:
70301e04c3fSmrg      v->value_bool = ctx->Transform.DepthClampNear || ctx->Transform.DepthClampFar;
7043464ebd5Sriastradh      break;
7053464ebd5Sriastradh
7063464ebd5Sriastradh   case GL_EDGE_FLAG:
70701e04c3fSmrg      v->value_bool = ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG][0] == 1.0F;
7083464ebd5Sriastradh      break;
7093464ebd5Sriastradh
7103464ebd5Sriastradh   case GL_READ_BUFFER:
7113464ebd5Sriastradh      v->value_enum = ctx->ReadBuffer->ColorReadBuffer;
7123464ebd5Sriastradh      break;
7133464ebd5Sriastradh
7143464ebd5Sriastradh   case GL_MAP2_GRID_DOMAIN:
7153464ebd5Sriastradh      v->value_float_4[0] = ctx->Eval.MapGrid2u1;
7163464ebd5Sriastradh      v->value_float_4[1] = ctx->Eval.MapGrid2u2;
7173464ebd5Sriastradh      v->value_float_4[2] = ctx->Eval.MapGrid2v1;
7183464ebd5Sriastradh      v->value_float_4[3] = ctx->Eval.MapGrid2v2;
7193464ebd5Sriastradh      break;
7203464ebd5Sriastradh
7213464ebd5Sriastradh   case GL_TEXTURE_STACK_DEPTH:
7223464ebd5Sriastradh      unit = ctx->Texture.CurrentUnit;
7233464ebd5Sriastradh      v->value_int = ctx->TextureMatrixStack[unit].Depth + 1;
7243464ebd5Sriastradh      break;
7253464ebd5Sriastradh   case GL_TEXTURE_MATRIX:
7263464ebd5Sriastradh      unit = ctx->Texture.CurrentUnit;
7273464ebd5Sriastradh      v->value_matrix = ctx->TextureMatrixStack[unit].Top;
7283464ebd5Sriastradh      break;
7293464ebd5Sriastradh
7303464ebd5Sriastradh   case GL_TEXTURE_COORD_ARRAY:
7313464ebd5Sriastradh   case GL_TEXTURE_COORD_ARRAY_SIZE:
7323464ebd5Sriastradh   case GL_TEXTURE_COORD_ARRAY_TYPE:
7333464ebd5Sriastradh   case GL_TEXTURE_COORD_ARRAY_STRIDE:
734af69d88dSmrg      array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)];
7353464ebd5Sriastradh      v->value_int = *(GLuint *) ((char *) array + d->offset);
7363464ebd5Sriastradh      break;
7373464ebd5Sriastradh
7383464ebd5Sriastradh   case GL_ACTIVE_TEXTURE_ARB:
7393464ebd5Sriastradh      v->value_int = GL_TEXTURE0_ARB + ctx->Texture.CurrentUnit;
7403464ebd5Sriastradh      break;
7413464ebd5Sriastradh   case GL_CLIENT_ACTIVE_TEXTURE_ARB:
7423464ebd5Sriastradh      v->value_int = GL_TEXTURE0_ARB + ctx->Array.ActiveTexture;
7433464ebd5Sriastradh      break;
7443464ebd5Sriastradh
7453464ebd5Sriastradh   case GL_MODELVIEW_STACK_DEPTH:
7463464ebd5Sriastradh   case GL_PROJECTION_STACK_DEPTH:
7473464ebd5Sriastradh      v->value_int = *(GLint *) ((char *) ctx + d->offset) + 1;
7483464ebd5Sriastradh      break;
7493464ebd5Sriastradh
7503464ebd5Sriastradh   case GL_MAX_TEXTURE_SIZE:
7513464ebd5Sriastradh   case GL_MAX_3D_TEXTURE_SIZE:
7523464ebd5Sriastradh   case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:
7533464ebd5Sriastradh      p = (GLuint *) ((char *) ctx + d->offset);
7543464ebd5Sriastradh      v->value_int = 1 << (*p - 1);
7553464ebd5Sriastradh      break;
7563464ebd5Sriastradh
7573464ebd5Sriastradh   case GL_SCISSOR_BOX:
758af69d88dSmrg      v->value_int_4[0] = ctx->Scissor.ScissorArray[0].X;
759af69d88dSmrg      v->value_int_4[1] = ctx->Scissor.ScissorArray[0].Y;
760af69d88dSmrg      v->value_int_4[2] = ctx->Scissor.ScissorArray[0].Width;
761af69d88dSmrg      v->value_int_4[3] = ctx->Scissor.ScissorArray[0].Height;
762af69d88dSmrg      break;
763af69d88dSmrg
764af69d88dSmrg   case GL_SCISSOR_TEST:
765af69d88dSmrg      v->value_bool = ctx->Scissor.EnableFlags & 1;
7663464ebd5Sriastradh      break;
7673464ebd5Sriastradh
7683464ebd5Sriastradh   case GL_LIST_INDEX:
7693464ebd5Sriastradh      v->value_int =
77001e04c3fSmrg         ctx->ListState.CurrentList ? ctx->ListState.CurrentList->Name : 0;
7713464ebd5Sriastradh      break;
7723464ebd5Sriastradh   case GL_LIST_MODE:
7733464ebd5Sriastradh      if (!ctx->CompileFlag)
77401e04c3fSmrg         v->value_enum = 0;
7753464ebd5Sriastradh      else if (ctx->ExecuteFlag)
77601e04c3fSmrg         v->value_enum = GL_COMPILE_AND_EXECUTE;
7773464ebd5Sriastradh      else
77801e04c3fSmrg         v->value_enum = GL_COMPILE;
7793464ebd5Sriastradh      break;
7803464ebd5Sriastradh
7813464ebd5Sriastradh   case GL_VIEWPORT:
782af69d88dSmrg      v->value_float_4[0] = ctx->ViewportArray[0].X;
783af69d88dSmrg      v->value_float_4[1] = ctx->ViewportArray[0].Y;
784af69d88dSmrg      v->value_float_4[2] = ctx->ViewportArray[0].Width;
785af69d88dSmrg      v->value_float_4[3] = ctx->ViewportArray[0].Height;
786af69d88dSmrg      break;
787af69d88dSmrg
788af69d88dSmrg   case GL_DEPTH_RANGE:
789af69d88dSmrg      v->value_double_2[0] = ctx->ViewportArray[0].Near;
790af69d88dSmrg      v->value_double_2[1] = ctx->ViewportArray[0].Far;
7913464ebd5Sriastradh      break;
7923464ebd5Sriastradh
7933464ebd5Sriastradh   case GL_ACTIVE_STENCIL_FACE_EXT:
7943464ebd5Sriastradh      v->value_enum = ctx->Stencil.ActiveFace ? GL_BACK : GL_FRONT;
7953464ebd5Sriastradh      break;
7963464ebd5Sriastradh
7973464ebd5Sriastradh   case GL_STENCIL_FAIL:
7983464ebd5Sriastradh      v->value_enum = ctx->Stencil.FailFunc[ctx->Stencil.ActiveFace];
7993464ebd5Sriastradh      break;
8003464ebd5Sriastradh   case GL_STENCIL_FUNC:
8013464ebd5Sriastradh      v->value_enum = ctx->Stencil.Function[ctx->Stencil.ActiveFace];
8023464ebd5Sriastradh      break;
8033464ebd5Sriastradh   case GL_STENCIL_PASS_DEPTH_FAIL:
8043464ebd5Sriastradh      v->value_enum = ctx->Stencil.ZFailFunc[ctx->Stencil.ActiveFace];
8053464ebd5Sriastradh      break;
8063464ebd5Sriastradh   case GL_STENCIL_PASS_DEPTH_PASS:
8073464ebd5Sriastradh      v->value_enum = ctx->Stencil.ZPassFunc[ctx->Stencil.ActiveFace];
8083464ebd5Sriastradh      break;
8093464ebd5Sriastradh   case GL_STENCIL_REF:
810af69d88dSmrg      v->value_int = _mesa_get_stencil_ref(ctx, ctx->Stencil.ActiveFace);
811af69d88dSmrg      break;
812af69d88dSmrg   case GL_STENCIL_BACK_REF:
813af69d88dSmrg      v->value_int = _mesa_get_stencil_ref(ctx, 1);
8143464ebd5Sriastradh      break;
8153464ebd5Sriastradh   case GL_STENCIL_VALUE_MASK:
8163464ebd5Sriastradh      v->value_int = ctx->Stencil.ValueMask[ctx->Stencil.ActiveFace];
8173464ebd5Sriastradh      break;
8183464ebd5Sriastradh   case GL_STENCIL_WRITEMASK:
8193464ebd5Sriastradh      v->value_int = ctx->Stencil.WriteMask[ctx->Stencil.ActiveFace];
8203464ebd5Sriastradh      break;
8213464ebd5Sriastradh
8223464ebd5Sriastradh   case GL_NUM_EXTENSIONS:
8233464ebd5Sriastradh      v->value_int = _mesa_get_extension_count(ctx);
8243464ebd5Sriastradh      break;
8253464ebd5Sriastradh
8263464ebd5Sriastradh   case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
82701e04c3fSmrg      v->value_int = _mesa_get_color_read_type(ctx, NULL, "glGetIntegerv");
8283464ebd5Sriastradh      break;
8293464ebd5Sriastradh   case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
83001e04c3fSmrg      v->value_int = _mesa_get_color_read_format(ctx, NULL, "glGetIntegerv");
8313464ebd5Sriastradh      break;
8323464ebd5Sriastradh
8333464ebd5Sriastradh   case GL_CURRENT_MATRIX_STACK_DEPTH_ARB:
8343464ebd5Sriastradh      v->value_int = ctx->CurrentStack->Depth + 1;
8353464ebd5Sriastradh      break;
8363464ebd5Sriastradh   case GL_CURRENT_MATRIX_ARB:
8373464ebd5Sriastradh   case GL_TRANSPOSE_CURRENT_MATRIX_ARB:
8383464ebd5Sriastradh      v->value_matrix = ctx->CurrentStack->Top;
8393464ebd5Sriastradh      break;
8403464ebd5Sriastradh
8413464ebd5Sriastradh   case GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB:
8423464ebd5Sriastradh      v->value_int = _mesa_get_compressed_formats(ctx, NULL);
8433464ebd5Sriastradh      break;
8443464ebd5Sriastradh   case GL_COMPRESSED_TEXTURE_FORMATS_ARB:
84501e04c3fSmrg      v->value_int_n.n =
84601e04c3fSmrg         _mesa_get_compressed_formats(ctx, v->value_int_n.ints);
84701e04c3fSmrg      assert(v->value_int_n.n <= (int) ARRAY_SIZE(v->value_int_n.ints));
8483464ebd5Sriastradh      break;
8493464ebd5Sriastradh
8503464ebd5Sriastradh   case GL_MAX_VARYING_FLOATS_ARB:
8513464ebd5Sriastradh      v->value_int = ctx->Const.MaxVarying * 4;
8523464ebd5Sriastradh      break;
8533464ebd5Sriastradh
8543464ebd5Sriastradh   /* Various object names */
8553464ebd5Sriastradh
8563464ebd5Sriastradh   case GL_TEXTURE_BINDING_1D:
8573464ebd5Sriastradh   case GL_TEXTURE_BINDING_2D:
8583464ebd5Sriastradh   case GL_TEXTURE_BINDING_3D:
8593464ebd5Sriastradh   case GL_TEXTURE_BINDING_1D_ARRAY_EXT:
8603464ebd5Sriastradh   case GL_TEXTURE_BINDING_2D_ARRAY_EXT:
8613464ebd5Sriastradh   case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
8623464ebd5Sriastradh   case GL_TEXTURE_BINDING_RECTANGLE_NV:
863af69d88dSmrg   case GL_TEXTURE_BINDING_EXTERNAL_OES:
864af69d88dSmrg   case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
865af69d88dSmrg   case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
866af69d88dSmrg   case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
8673464ebd5Sriastradh      unit = ctx->Texture.CurrentUnit;
8683464ebd5Sriastradh      v->value_int =
86901e04c3fSmrg         ctx->Texture.Unit[unit].CurrentTex[d->offset]->Name;
87001e04c3fSmrg      break;
87101e04c3fSmrg
87201e04c3fSmrg   /* GL_EXT_external_objects */
873993e1d59Smrg   case GL_NUM_DEVICE_UUIDS_EXT:
874993e1d59Smrg      v->value_int = 1;
875993e1d59Smrg      break;
87601e04c3fSmrg   case GL_DRIVER_UUID_EXT:
87701e04c3fSmrg      _mesa_get_driver_uuid(ctx, v->value_int_4);
87801e04c3fSmrg      break;
87901e04c3fSmrg   case GL_DEVICE_UUID_EXT:
88001e04c3fSmrg      _mesa_get_device_uuid(ctx, v->value_int_4);
8813464ebd5Sriastradh      break;
8823464ebd5Sriastradh
883af69d88dSmrg   /* GL_EXT_packed_float */
884af69d88dSmrg   case GL_RGBA_SIGNED_COMPONENTS_EXT:
885af69d88dSmrg      {
886af69d88dSmrg         /* Note: we only check the 0th color attachment. */
887af69d88dSmrg         const struct gl_renderbuffer *rb =
888af69d88dSmrg            ctx->DrawBuffer->_ColorDrawBuffers[0];
889af69d88dSmrg         if (rb && _mesa_is_format_signed(rb->Format)) {
890af69d88dSmrg            /* Issue 17 of GL_EXT_packed_float:  If a component (such as
891af69d88dSmrg             * alpha) has zero bits, the component should not be considered
892af69d88dSmrg             * signed and so the bit for the respective component should be
893af69d88dSmrg             * zeroed.
894af69d88dSmrg             */
895af69d88dSmrg            GLint r_bits =
896af69d88dSmrg               _mesa_get_format_bits(rb->Format, GL_RED_BITS);
897af69d88dSmrg            GLint g_bits =
898af69d88dSmrg               _mesa_get_format_bits(rb->Format, GL_GREEN_BITS);
899af69d88dSmrg            GLint b_bits =
900af69d88dSmrg               _mesa_get_format_bits(rb->Format, GL_BLUE_BITS);
901af69d88dSmrg            GLint a_bits =
902af69d88dSmrg               _mesa_get_format_bits(rb->Format, GL_ALPHA_BITS);
903af69d88dSmrg            GLint l_bits =
904af69d88dSmrg               _mesa_get_format_bits(rb->Format, GL_TEXTURE_LUMINANCE_SIZE);
905af69d88dSmrg            GLint i_bits =
906af69d88dSmrg               _mesa_get_format_bits(rb->Format, GL_TEXTURE_INTENSITY_SIZE);
907af69d88dSmrg
908af69d88dSmrg            v->value_int_4[0] = r_bits + l_bits + i_bits > 0;
909af69d88dSmrg            v->value_int_4[1] = g_bits + l_bits + i_bits > 0;
910af69d88dSmrg            v->value_int_4[2] = b_bits + l_bits + i_bits > 0;
911af69d88dSmrg            v->value_int_4[3] = a_bits + i_bits > 0;
912af69d88dSmrg         }
913af69d88dSmrg         else {
914af69d88dSmrg            v->value_int_4[0] =
915af69d88dSmrg            v->value_int_4[1] =
916af69d88dSmrg            v->value_int_4[2] =
917af69d88dSmrg            v->value_int_4[3] = 0;
918af69d88dSmrg         }
919af69d88dSmrg      }
920af69d88dSmrg      break;
921af69d88dSmrg
9223464ebd5Sriastradh   /* GL_ARB_vertex_buffer_object */
9233464ebd5Sriastradh   case GL_VERTEX_ARRAY_BUFFER_BINDING_ARB:
9243464ebd5Sriastradh   case GL_NORMAL_ARRAY_BUFFER_BINDING_ARB:
9253464ebd5Sriastradh   case GL_COLOR_ARRAY_BUFFER_BINDING_ARB:
9263464ebd5Sriastradh   case GL_INDEX_ARRAY_BUFFER_BINDING_ARB:
9273464ebd5Sriastradh   case GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB:
9283464ebd5Sriastradh   case GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB:
9293464ebd5Sriastradh   case GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB:
9303464ebd5Sriastradh      buffer_obj = (struct gl_buffer_object **)
93101e04c3fSmrg         ((char *) ctx->Array.VAO + d->offset);
9323464ebd5Sriastradh      v->value_int = (*buffer_obj)->Name;
9333464ebd5Sriastradh      break;
9343464ebd5Sriastradh   case GL_ARRAY_BUFFER_BINDING_ARB:
9353464ebd5Sriastradh      v->value_int = ctx->Array.ArrayBufferObj->Name;
9363464ebd5Sriastradh      break;
9373464ebd5Sriastradh   case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB:
9383464ebd5Sriastradh      v->value_int =
93901e04c3fSmrg         ctx->Array.VAO->BufferBinding[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].BufferObj->Name;
9403464ebd5Sriastradh      break;
9413464ebd5Sriastradh   case GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB:
942af69d88dSmrg      v->value_int = ctx->Array.VAO->IndexBufferObj->Name;
943af69d88dSmrg      break;
944af69d88dSmrg
945af69d88dSmrg   /* ARB_vertex_array_bgra */
946af69d88dSmrg   case GL_COLOR_ARRAY_SIZE:
947af69d88dSmrg      array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR0];
948af69d88dSmrg      v->value_int = array->Format == GL_BGRA ? GL_BGRA : array->Size;
949af69d88dSmrg      break;
950af69d88dSmrg   case GL_SECONDARY_COLOR_ARRAY_SIZE:
951af69d88dSmrg      array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR1];
952af69d88dSmrg      v->value_int = array->Format == GL_BGRA ? GL_BGRA : array->Size;
9533464ebd5Sriastradh      break;
9543464ebd5Sriastradh
9553464ebd5Sriastradh   /* ARB_copy_buffer */
9563464ebd5Sriastradh   case GL_COPY_READ_BUFFER:
9573464ebd5Sriastradh      v->value_int = ctx->CopyReadBuffer->Name;
9583464ebd5Sriastradh      break;
9593464ebd5Sriastradh   case GL_COPY_WRITE_BUFFER:
9603464ebd5Sriastradh      v->value_int = ctx->CopyWriteBuffer->Name;
9613464ebd5Sriastradh      break;
9623464ebd5Sriastradh
9633464ebd5Sriastradh   case GL_PIXEL_PACK_BUFFER_BINDING_EXT:
9643464ebd5Sriastradh      v->value_int = ctx->Pack.BufferObj->Name;
9653464ebd5Sriastradh      break;
9663464ebd5Sriastradh   case GL_PIXEL_UNPACK_BUFFER_BINDING_EXT:
9673464ebd5Sriastradh      v->value_int = ctx->Unpack.BufferObj->Name;
9683464ebd5Sriastradh      break;
9693464ebd5Sriastradh   case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
9703464ebd5Sriastradh      v->value_int = ctx->TransformFeedback.CurrentBuffer->Name;
9713464ebd5Sriastradh      break;
9723464ebd5Sriastradh   case GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED:
9733464ebd5Sriastradh      v->value_int = ctx->TransformFeedback.CurrentObject->Paused;
9743464ebd5Sriastradh      break;
9753464ebd5Sriastradh   case GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE:
9763464ebd5Sriastradh      v->value_int = ctx->TransformFeedback.CurrentObject->Active;
9773464ebd5Sriastradh      break;
9783464ebd5Sriastradh   case GL_TRANSFORM_FEEDBACK_BINDING:
9793464ebd5Sriastradh      v->value_int = ctx->TransformFeedback.CurrentObject->Name;
9803464ebd5Sriastradh      break;
9813464ebd5Sriastradh   case GL_CURRENT_PROGRAM:
982af69d88dSmrg      /* The Changelog of the ARB_separate_shader_objects spec says:
983af69d88dSmrg       *
984af69d88dSmrg       * 24 25 Jul 2011  pbrown  Remove the language erroneously deleting
985af69d88dSmrg       *                         CURRENT_PROGRAM.  In the EXT extension, this
986af69d88dSmrg       *                         token was aliased to ACTIVE_PROGRAM_EXT, and
987af69d88dSmrg       *                         was used to indicate the last program set by
988af69d88dSmrg       *                         either ActiveProgramEXT or UseProgram.  In
989af69d88dSmrg       *                         the ARB extension, the SSO active programs
990af69d88dSmrg       *                         are now program pipeline object state and
991af69d88dSmrg       *                         CURRENT_PROGRAM should still be used to query
992af69d88dSmrg       *                         the last program set by UseProgram (bug 7822).
993af69d88dSmrg       */
9943464ebd5Sriastradh      v->value_int =
99501e04c3fSmrg         ctx->Shader.ActiveProgram ? ctx->Shader.ActiveProgram->Name : 0;
9963464ebd5Sriastradh      break;
9973464ebd5Sriastradh   case GL_READ_FRAMEBUFFER_BINDING_EXT:
9983464ebd5Sriastradh      v->value_int = ctx->ReadBuffer->Name;
9993464ebd5Sriastradh      break;
10003464ebd5Sriastradh   case GL_RENDERBUFFER_BINDING_EXT:
10013464ebd5Sriastradh      v->value_int =
100201e04c3fSmrg         ctx->CurrentRenderbuffer ? ctx->CurrentRenderbuffer->Name : 0;
10033464ebd5Sriastradh      break;
10043464ebd5Sriastradh   case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
100501e04c3fSmrg      v->value_int = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_POINT_SIZE].BufferObj->Name;
10063464ebd5Sriastradh      break;
10073464ebd5Sriastradh
10083464ebd5Sriastradh   case GL_FOG_COLOR:
100901e04c3fSmrg      if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer))
10103464ebd5Sriastradh         COPY_4FV(v->value_float_4, ctx->Fog.Color);
10113464ebd5Sriastradh      else
10123464ebd5Sriastradh         COPY_4FV(v->value_float_4, ctx->Fog.ColorUnclamped);
10133464ebd5Sriastradh      break;
10143464ebd5Sriastradh   case GL_COLOR_CLEAR_VALUE:
101501e04c3fSmrg      if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer)) {
1016af69d88dSmrg         v->value_float_4[0] = CLAMP(ctx->Color.ClearColor.f[0], 0.0F, 1.0F);
1017af69d88dSmrg         v->value_float_4[1] = CLAMP(ctx->Color.ClearColor.f[1], 0.0F, 1.0F);
1018af69d88dSmrg         v->value_float_4[2] = CLAMP(ctx->Color.ClearColor.f[2], 0.0F, 1.0F);
1019af69d88dSmrg         v->value_float_4[3] = CLAMP(ctx->Color.ClearColor.f[3], 0.0F, 1.0F);
1020af69d88dSmrg      } else
1021af69d88dSmrg         COPY_4FV(v->value_float_4, ctx->Color.ClearColor.f);
10223464ebd5Sriastradh      break;
10233464ebd5Sriastradh   case GL_BLEND_COLOR_EXT:
102401e04c3fSmrg      if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer))
10253464ebd5Sriastradh         COPY_4FV(v->value_float_4, ctx->Color.BlendColor);
10263464ebd5Sriastradh      else
10273464ebd5Sriastradh         COPY_4FV(v->value_float_4, ctx->Color.BlendColorUnclamped);
10283464ebd5Sriastradh      break;
10293464ebd5Sriastradh   case GL_ALPHA_TEST_REF:
103001e04c3fSmrg      if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer))
10313464ebd5Sriastradh         v->value_float = ctx->Color.AlphaRef;
10323464ebd5Sriastradh      else
10333464ebd5Sriastradh         v->value_float = ctx->Color.AlphaRefUnclamped;
10343464ebd5Sriastradh      break;
10353464ebd5Sriastradh   case GL_MAX_VERTEX_UNIFORM_VECTORS:
1036af69d88dSmrg      v->value_int = ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents / 4;
10373464ebd5Sriastradh      break;
10383464ebd5Sriastradh
10393464ebd5Sriastradh   case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1040af69d88dSmrg      v->value_int = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents / 4;
10413464ebd5Sriastradh      break;
10423464ebd5Sriastradh
10433464ebd5Sriastradh   /* GL_ARB_texture_buffer_object */
10443464ebd5Sriastradh   case GL_TEXTURE_BUFFER_ARB:
10453464ebd5Sriastradh      v->value_int = ctx->Texture.BufferObject->Name;
10463464ebd5Sriastradh      break;
10473464ebd5Sriastradh   case GL_TEXTURE_BINDING_BUFFER_ARB:
10483464ebd5Sriastradh      unit = ctx->Texture.CurrentUnit;
10493464ebd5Sriastradh      v->value_int =
10503464ebd5Sriastradh         ctx->Texture.Unit[unit].CurrentTex[TEXTURE_BUFFER_INDEX]->Name;
10513464ebd5Sriastradh      break;
10523464ebd5Sriastradh   case GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB:
10533464ebd5Sriastradh      {
10543464ebd5Sriastradh         struct gl_buffer_object *buf =
10553464ebd5Sriastradh            ctx->Texture.Unit[ctx->Texture.CurrentUnit]
10563464ebd5Sriastradh            .CurrentTex[TEXTURE_BUFFER_INDEX]->BufferObject;
10573464ebd5Sriastradh         v->value_int = buf ? buf->Name : 0;
10583464ebd5Sriastradh      }
10593464ebd5Sriastradh      break;
10603464ebd5Sriastradh   case GL_TEXTURE_BUFFER_FORMAT_ARB:
10613464ebd5Sriastradh      v->value_int = ctx->Texture.Unit[ctx->Texture.CurrentUnit]
10623464ebd5Sriastradh         .CurrentTex[TEXTURE_BUFFER_INDEX]->BufferObjectFormat;
10633464ebd5Sriastradh      break;
10643464ebd5Sriastradh
10653464ebd5Sriastradh   /* GL_ARB_sampler_objects */
10663464ebd5Sriastradh   case GL_SAMPLER_BINDING:
10673464ebd5Sriastradh      {
10683464ebd5Sriastradh         struct gl_sampler_object *samp =
10693464ebd5Sriastradh            ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler;
107001e04c3fSmrg         v->value_int = samp ? samp->Name : 0;
1071af69d88dSmrg      }
1072af69d88dSmrg      break;
1073af69d88dSmrg   /* GL_ARB_uniform_buffer_object */
1074af69d88dSmrg   case GL_UNIFORM_BUFFER_BINDING:
1075af69d88dSmrg      v->value_int = ctx->UniformBuffer->Name;
1076af69d88dSmrg      break;
107701e04c3fSmrg   /* GL_ARB_shader_storage_buffer_object */
107801e04c3fSmrg   case GL_SHADER_STORAGE_BUFFER_BINDING:
107901e04c3fSmrg      v->value_int = ctx->ShaderStorageBuffer->Name;
108001e04c3fSmrg      break;
108101e04c3fSmrg   /* GL_ARB_query_buffer_object */
108201e04c3fSmrg   case GL_QUERY_BUFFER_BINDING:
108301e04c3fSmrg      v->value_int = ctx->QueryBuffer->Name;
108401e04c3fSmrg      break;
1085af69d88dSmrg   /* GL_ARB_timer_query */
1086af69d88dSmrg   case GL_TIMESTAMP:
1087af69d88dSmrg      if (ctx->Driver.GetTimestamp) {
1088af69d88dSmrg         v->value_int64 = ctx->Driver.GetTimestamp(ctx);
1089af69d88dSmrg      }
1090af69d88dSmrg      else {
1091af69d88dSmrg         _mesa_problem(ctx, "driver doesn't implement GetTimestamp");
10923464ebd5Sriastradh      }
10933464ebd5Sriastradh      break;
1094af69d88dSmrg   /* GL_KHR_DEBUG */
109501e04c3fSmrg   case GL_DEBUG_OUTPUT:
109601e04c3fSmrg   case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1097af69d88dSmrg   case GL_DEBUG_LOGGED_MESSAGES:
1098af69d88dSmrg   case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
1099af69d88dSmrg   case GL_DEBUG_GROUP_STACK_DEPTH:
1100af69d88dSmrg      v->value_int = _mesa_get_debug_state_int(ctx, d->pname);
1101af69d88dSmrg      break;
1102af69d88dSmrg   /* GL_ARB_shader_atomic_counters */
1103af69d88dSmrg   case GL_ATOMIC_COUNTER_BUFFER_BINDING:
1104af69d88dSmrg      if (ctx->AtomicBuffer) {
1105af69d88dSmrg         v->value_int = ctx->AtomicBuffer->Name;
1106af69d88dSmrg      } else {
1107af69d88dSmrg         v->value_int = 0;
1108af69d88dSmrg      }
1109af69d88dSmrg      break;
111001e04c3fSmrg   /* GL 4.3 */
111101e04c3fSmrg   case GL_NUM_SHADING_LANGUAGE_VERSIONS:
111201e04c3fSmrg      v->value_int = _mesa_get_shading_language_version(ctx, -1, NULL);
111301e04c3fSmrg      break;
1114af69d88dSmrg   /* GL_ARB_draw_indirect */
1115af69d88dSmrg   case GL_DRAW_INDIRECT_BUFFER_BINDING:
1116af69d88dSmrg      v->value_int = ctx->DrawIndirectBuffer->Name;
1117af69d88dSmrg      break;
111801e04c3fSmrg   /* GL_ARB_indirect_parameters */
111901e04c3fSmrg   case GL_PARAMETER_BUFFER_BINDING_ARB:
112001e04c3fSmrg      v->value_int = ctx->ParameterBuffer->Name;
112101e04c3fSmrg      break;
1122af69d88dSmrg   /* GL_ARB_separate_shader_objects */
1123af69d88dSmrg   case GL_PROGRAM_PIPELINE_BINDING:
1124af69d88dSmrg      if (ctx->Pipeline.Current) {
1125af69d88dSmrg         v->value_int = ctx->Pipeline.Current->Name;
1126af69d88dSmrg      } else {
1127af69d88dSmrg         v->value_int = 0;
1128af69d88dSmrg      }
1129af69d88dSmrg      break;
113001e04c3fSmrg   /* GL_ARB_compute_shader */
113101e04c3fSmrg   case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
113201e04c3fSmrg      v->value_int = ctx->DispatchIndirectBuffer->Name;
113301e04c3fSmrg      break;
113401e04c3fSmrg   /* GL_ARB_multisample */
113501e04c3fSmrg   case GL_SAMPLES:
113601e04c3fSmrg      v->value_int = _mesa_geometric_samples(ctx->DrawBuffer);
113701e04c3fSmrg      break;
113801e04c3fSmrg   case GL_SAMPLE_BUFFERS:
113901e04c3fSmrg      v->value_int = _mesa_geometric_samples(ctx->DrawBuffer) > 0;
114001e04c3fSmrg      break;
114101e04c3fSmrg   /* GL_EXT_textrue_integer */
114201e04c3fSmrg   case GL_RGBA_INTEGER_MODE_EXT:
114301e04c3fSmrg      v->value_int = (ctx->DrawBuffer->_IntegerBuffers != 0);
114401e04c3fSmrg      break;
114501e04c3fSmrg   /* GL_ATI_meminfo & GL_NVX_gpu_memory_info */
114601e04c3fSmrg   case GL_VBO_FREE_MEMORY_ATI:
114701e04c3fSmrg   case GL_TEXTURE_FREE_MEMORY_ATI:
114801e04c3fSmrg   case GL_RENDERBUFFER_FREE_MEMORY_ATI:
114901e04c3fSmrg   case GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX:
115001e04c3fSmrg   case GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX:
115101e04c3fSmrg   case GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX:
115201e04c3fSmrg   case GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX:
115301e04c3fSmrg   case GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX:
115401e04c3fSmrg      {
115501e04c3fSmrg         struct gl_memory_info info;
115601e04c3fSmrg
115701e04c3fSmrg         ctx->Driver.QueryMemoryInfo(ctx, &info);
115801e04c3fSmrg
115901e04c3fSmrg         if (d->pname == GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX)
116001e04c3fSmrg            v->value_int = info.total_device_memory;
116101e04c3fSmrg         else if (d->pname == GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX)
116201e04c3fSmrg            v->value_int = info.total_device_memory +
116301e04c3fSmrg                           info.total_staging_memory;
116401e04c3fSmrg         else if (d->pname == GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX)
116501e04c3fSmrg            v->value_int = info.avail_device_memory;
116601e04c3fSmrg         else if (d->pname == GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX)
116701e04c3fSmrg            v->value_int = info.nr_device_memory_evictions;
116801e04c3fSmrg         else if (d->pname == GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX)
116901e04c3fSmrg            v->value_int = info.device_memory_evicted;
117001e04c3fSmrg         else {
117101e04c3fSmrg            /* ATI free memory enums.
117201e04c3fSmrg             *
117301e04c3fSmrg             * Since the GPU memory is (usually) page-table based, every two
117401e04c3fSmrg             * consecutive elements are equal. From the GL_ATI_meminfo
117501e04c3fSmrg             * specification:
117601e04c3fSmrg             *
117701e04c3fSmrg             *    "param[0] - total memory free in the pool
117801e04c3fSmrg             *     param[1] - largest available free block in the pool
117901e04c3fSmrg             *     param[2] - total auxiliary memory free
118001e04c3fSmrg             *     param[3] - largest auxiliary free block"
118101e04c3fSmrg             *
118201e04c3fSmrg             * All three (VBO, TEXTURE, RENDERBUFFER) queries return
118301e04c3fSmrg             * the same numbers here.
118401e04c3fSmrg             */
118501e04c3fSmrg            v->value_int_4[0] = info.avail_device_memory;
118601e04c3fSmrg            v->value_int_4[1] = info.avail_device_memory;
118701e04c3fSmrg            v->value_int_4[2] = info.avail_staging_memory;
118801e04c3fSmrg            v->value_int_4[3] = info.avail_staging_memory;
118901e04c3fSmrg         }
119001e04c3fSmrg      }
119101e04c3fSmrg      break;
119201e04c3fSmrg
119301e04c3fSmrg   /* GL_ARB_get_program_binary */
119401e04c3fSmrg   case GL_PROGRAM_BINARY_FORMATS:
119501e04c3fSmrg      assert(ctx->Const.NumProgramBinaryFormats <= 1);
119601e04c3fSmrg      v->value_int_n.n = MIN2(ctx->Const.NumProgramBinaryFormats, 1);
119701e04c3fSmrg      if (ctx->Const.NumProgramBinaryFormats > 0) {
119801e04c3fSmrg         v->value_int_n.ints[0] = GL_PROGRAM_BINARY_FORMAT_MESA;
119901e04c3fSmrg      }
120001e04c3fSmrg      break;
120101e04c3fSmrg   /* GL_EXT_disjoint_timer_query */
120201e04c3fSmrg   case GL_GPU_DISJOINT_EXT:
120301e04c3fSmrg      {
120401e04c3fSmrg         simple_mtx_lock(&ctx->Shared->Mutex);
120501e04c3fSmrg         v->value_int = ctx->Shared->DisjointOperation;
120601e04c3fSmrg         /* Reset state as expected by the spec. */
120701e04c3fSmrg         ctx->Shared->DisjointOperation = false;
120801e04c3fSmrg         simple_mtx_unlock(&ctx->Shared->Mutex);
120901e04c3fSmrg      }
121001e04c3fSmrg      break;
121101e04c3fSmrg   /* GL_ARB_sample_locations */
121201e04c3fSmrg   case GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB:
121301e04c3fSmrg   case GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB:
121401e04c3fSmrg   case GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB:
121501e04c3fSmrg      {
121601e04c3fSmrg         GLuint bits, width, height;
121701e04c3fSmrg
121801e04c3fSmrg         if (ctx->NewState & _NEW_BUFFERS)
121901e04c3fSmrg            _mesa_update_state(ctx);
122001e04c3fSmrg
122101e04c3fSmrg         if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE) {
122201e04c3fSmrg            v->value_uint = 0;
122301e04c3fSmrg            break;
122401e04c3fSmrg         }
122501e04c3fSmrg
122601e04c3fSmrg         ctx->Driver.GetProgrammableSampleCaps(ctx, ctx->DrawBuffer,
122701e04c3fSmrg                                               &bits, &width, &height);
122801e04c3fSmrg
122901e04c3fSmrg         if (d->pname == GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB)
123001e04c3fSmrg            v->value_uint = width;
123101e04c3fSmrg         else if (d->pname == GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB)
123201e04c3fSmrg            v->value_uint = height;
123301e04c3fSmrg         else
123401e04c3fSmrg            v->value_uint = bits;
123501e04c3fSmrg      }
123601e04c3fSmrg      break;
123701e04c3fSmrg   case GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB:
123801e04c3fSmrg      v->value_uint = MAX_SAMPLE_LOCATION_TABLE_SIZE;
123901e04c3fSmrg      break;
124001e04c3fSmrg
124101e04c3fSmrg   /* GL_AMD_framebuffer_multisample_advanced */
124201e04c3fSmrg   case GL_SUPPORTED_MULTISAMPLE_MODES_AMD:
124301e04c3fSmrg      v->value_int_n.n = ctx->Const.NumSupportedMultisampleModes * 3;
124401e04c3fSmrg      memcpy(v->value_int_n.ints, ctx->Const.SupportedMultisampleModes,
124501e04c3fSmrg             v->value_int_n.n * sizeof(GLint));
124601e04c3fSmrg      break;
1247af69d88dSmrg   }
12483464ebd5Sriastradh}
12493464ebd5Sriastradh
12503464ebd5Sriastradh/**
12513464ebd5Sriastradh * Check extra constraints on a struct value_desc descriptor
12523464ebd5Sriastradh *
12533464ebd5Sriastradh * If a struct value_desc has a non-NULL extra pointer, it means that
12543464ebd5Sriastradh * there are a number of extra constraints to check or actions to
12553464ebd5Sriastradh * perform.  The extras is just an integer array where each integer
12563464ebd5Sriastradh * encode different constraints or actions.
12573464ebd5Sriastradh *
12583464ebd5Sriastradh * \param ctx current context
12593464ebd5Sriastradh * \param func name of calling glGet*v() function for error reporting
12603464ebd5Sriastradh * \param d the struct value_desc that has the extra constraints
12613464ebd5Sriastradh *
1262af69d88dSmrg * \return GL_FALSE if all of the constraints were not satisfied,
12633464ebd5Sriastradh *     otherwise GL_TRUE.
12647117f1b4Smrg */
12653464ebd5Sriastradhstatic GLboolean
12663464ebd5Sriastradhcheck_extra(struct gl_context *ctx, const char *func, const struct value_desc *d)
12673464ebd5Sriastradh{
1268af69d88dSmrg   const GLuint version = ctx->Version;
1269af69d88dSmrg   GLboolean api_check = GL_FALSE;
1270af69d88dSmrg   GLboolean api_found = GL_FALSE;
12713464ebd5Sriastradh   const int *e;
12723464ebd5Sriastradh
1273af69d88dSmrg   for (e = d->extra; *e != EXTRA_END; e++) {
12743464ebd5Sriastradh      switch (*e) {
12753464ebd5Sriastradh      case EXTRA_VERSION_30:
1276af69d88dSmrg         api_check = GL_TRUE;
1277af69d88dSmrg         if (version >= 30)
1278af69d88dSmrg            api_found = GL_TRUE;
127901e04c3fSmrg         break;
12803464ebd5Sriastradh      case EXTRA_VERSION_31:
1281af69d88dSmrg         api_check = GL_TRUE;
1282af69d88dSmrg         if (version >= 31)
1283af69d88dSmrg            api_found = GL_TRUE;
128401e04c3fSmrg         break;
12853464ebd5Sriastradh      case EXTRA_VERSION_32:
1286af69d88dSmrg         api_check = GL_TRUE;
1287af69d88dSmrg         if (version >= 32)
1288af69d88dSmrg            api_found = GL_TRUE;
128901e04c3fSmrg         break;
129001e04c3fSmrg      case EXTRA_VERSION_40:
129101e04c3fSmrg         api_check = GL_TRUE;
129201e04c3fSmrg         if (version >= 40)
129301e04c3fSmrg            api_found = GL_TRUE;
129401e04c3fSmrg         break;
129501e04c3fSmrg      case EXTRA_VERSION_43:
129601e04c3fSmrg         api_check = TRUE;
129701e04c3fSmrg         if (_mesa_is_desktop_gl(ctx) && version >= 43)
129801e04c3fSmrg            api_found = GL_TRUE;
129901e04c3fSmrg         break;
13003464ebd5Sriastradh      case EXTRA_NEW_FRAG_CLAMP:
13013464ebd5Sriastradh         if (ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
13023464ebd5Sriastradh            _mesa_update_state(ctx);
13033464ebd5Sriastradh         break;
1304af69d88dSmrg      case EXTRA_API_ES2:
1305af69d88dSmrg         api_check = GL_TRUE;
1306af69d88dSmrg         if (ctx->API == API_OPENGLES2)
1307af69d88dSmrg            api_found = GL_TRUE;
130801e04c3fSmrg         break;
1309af69d88dSmrg      case EXTRA_API_ES3:
1310af69d88dSmrg         api_check = GL_TRUE;
1311af69d88dSmrg         if (_mesa_is_gles3(ctx))
1312af69d88dSmrg            api_found = GL_TRUE;
131301e04c3fSmrg         break;
131401e04c3fSmrg      case EXTRA_API_ES31:
131501e04c3fSmrg         api_check = GL_TRUE;
131601e04c3fSmrg         if (_mesa_is_gles31(ctx))
131701e04c3fSmrg            api_found = GL_TRUE;
131801e04c3fSmrg         break;
131901e04c3fSmrg      case EXTRA_API_ES32:
132001e04c3fSmrg         api_check = GL_TRUE;
132101e04c3fSmrg         if (_mesa_is_gles32(ctx))
132201e04c3fSmrg            api_found = GL_TRUE;
132301e04c3fSmrg         break;
1324af69d88dSmrg      case EXTRA_API_GL:
1325af69d88dSmrg         api_check = GL_TRUE;
1326af69d88dSmrg         if (_mesa_is_desktop_gl(ctx))
1327af69d88dSmrg            api_found = GL_TRUE;
132801e04c3fSmrg         break;
1329af69d88dSmrg      case EXTRA_API_GL_CORE:
1330af69d88dSmrg         api_check = GL_TRUE;
1331af69d88dSmrg         if (ctx->API == API_OPENGL_CORE)
1332af69d88dSmrg            api_found = GL_TRUE;
133301e04c3fSmrg         break;
13343464ebd5Sriastradh      case EXTRA_NEW_BUFFERS:
133501e04c3fSmrg         if (ctx->NewState & _NEW_BUFFERS)
133601e04c3fSmrg            _mesa_update_state(ctx);
133701e04c3fSmrg         break;
13383464ebd5Sriastradh      case EXTRA_FLUSH_CURRENT:
133901e04c3fSmrg         FLUSH_CURRENT(ctx, 0);
134001e04c3fSmrg         break;
13413464ebd5Sriastradh      case EXTRA_VALID_DRAW_BUFFER:
134201e04c3fSmrg         if (d->pname - GL_DRAW_BUFFER0_ARB >= ctx->Const.MaxDrawBuffers) {
134301e04c3fSmrg            _mesa_error(ctx, GL_INVALID_OPERATION, "%s(draw buffer %u)",
134401e04c3fSmrg                        func, d->pname - GL_DRAW_BUFFER0_ARB);
134501e04c3fSmrg            return GL_FALSE;
134601e04c3fSmrg         }
134701e04c3fSmrg         break;
13483464ebd5Sriastradh      case EXTRA_VALID_TEXTURE_UNIT:
134901e04c3fSmrg         if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
135001e04c3fSmrg            _mesa_error(ctx, GL_INVALID_OPERATION, "%s(texture %u)",
135101e04c3fSmrg                        func, ctx->Texture.CurrentUnit);
135201e04c3fSmrg            return GL_FALSE;
135301e04c3fSmrg         }
135401e04c3fSmrg         break;
1355af69d88dSmrg      case EXTRA_VALID_CLIP_DISTANCE:
135601e04c3fSmrg         if (d->pname - GL_CLIP_DISTANCE0 >= ctx->Const.MaxClipPlanes) {
135701e04c3fSmrg            _mesa_error(ctx, GL_INVALID_ENUM, "%s(clip distance %u)",
135801e04c3fSmrg                        func, d->pname - GL_CLIP_DISTANCE0);
135901e04c3fSmrg            return GL_FALSE;
136001e04c3fSmrg         }
136101e04c3fSmrg         break;
1362af69d88dSmrg      case EXTRA_GLSL_130:
1363af69d88dSmrg         api_check = GL_TRUE;
1364af69d88dSmrg         if (ctx->Const.GLSLVersion >= 130)
1365af69d88dSmrg            api_found = GL_TRUE;
136601e04c3fSmrg         break;
136701e04c3fSmrg      case EXTRA_EXT_UBO_GS:
1368af69d88dSmrg         api_check = GL_TRUE;
136901e04c3fSmrg         if (ctx->Extensions.ARB_uniform_buffer_object &&
137001e04c3fSmrg            _mesa_has_geometry_shaders(ctx))
137101e04c3fSmrg            api_found = GL_TRUE;
137201e04c3fSmrg         break;
137301e04c3fSmrg      case EXTRA_EXT_ATOMICS_GS:
137401e04c3fSmrg         api_check = GL_TRUE;
137501e04c3fSmrg         if (ctx->Extensions.ARB_shader_atomic_counters &&
137601e04c3fSmrg            _mesa_has_geometry_shaders(ctx))
137701e04c3fSmrg            api_found = GL_TRUE;
137801e04c3fSmrg         break;
137901e04c3fSmrg      case EXTRA_EXT_SHADER_IMAGE_GS:
138001e04c3fSmrg         api_check = GL_TRUE;
138101e04c3fSmrg         if (ctx->Extensions.ARB_shader_image_load_store &&
138201e04c3fSmrg            _mesa_has_geometry_shaders(ctx))
138301e04c3fSmrg            api_found = GL_TRUE;
138401e04c3fSmrg         break;
138501e04c3fSmrg      case EXTRA_EXT_ATOMICS_TESS:
138601e04c3fSmrg         api_check = GL_TRUE;
138701e04c3fSmrg         api_found = ctx->Extensions.ARB_shader_atomic_counters &&
138801e04c3fSmrg                     _mesa_has_tessellation(ctx);
138901e04c3fSmrg         break;
139001e04c3fSmrg      case EXTRA_EXT_SHADER_IMAGE_TESS:
139101e04c3fSmrg         api_check = GL_TRUE;
139201e04c3fSmrg         api_found = ctx->Extensions.ARB_shader_image_load_store &&
139301e04c3fSmrg                     _mesa_has_tessellation(ctx);
139401e04c3fSmrg         break;
139501e04c3fSmrg      case EXTRA_EXT_SSBO_GS:
139601e04c3fSmrg         api_check = GL_TRUE;
139701e04c3fSmrg         if (ctx->Extensions.ARB_shader_storage_buffer_object &&
139801e04c3fSmrg            _mesa_has_geometry_shaders(ctx))
139901e04c3fSmrg            api_found = GL_TRUE;
1400af69d88dSmrg         break;
140101e04c3fSmrg      case EXTRA_EXT_FB_NO_ATTACH_GS:
1402af69d88dSmrg         api_check = GL_TRUE;
140301e04c3fSmrg         if (ctx->Extensions.ARB_framebuffer_no_attachments &&
140401e04c3fSmrg            (_mesa_is_desktop_gl(ctx) ||
140501e04c3fSmrg            _mesa_has_OES_geometry_shader(ctx)))
140601e04c3fSmrg            api_found = GL_TRUE;
1407af69d88dSmrg         break;
140801e04c3fSmrg      case EXTRA_EXT_ES_GS:
1409af69d88dSmrg         api_check = GL_TRUE;
141001e04c3fSmrg         if (_mesa_has_OES_geometry_shader(ctx))
141101e04c3fSmrg            api_found = GL_TRUE;
141201e04c3fSmrg         break;
141301e04c3fSmrg      case EXTRA_EXT_PROVOKING_VERTEX_32:
141401e04c3fSmrg         api_check = TRUE;
141501e04c3fSmrg         if (ctx->API == API_OPENGL_COMPAT || version == 32)
141601e04c3fSmrg            api_found = ctx->Extensions.EXT_provoking_vertex;
1417af69d88dSmrg         break;
14183464ebd5Sriastradh      case EXTRA_END:
141901e04c3fSmrg         break;
14203464ebd5Sriastradh      default: /* *e is a offset into the extension struct */
142101e04c3fSmrg         api_check = GL_TRUE;
142201e04c3fSmrg         if (*(GLboolean *) ((char *) &ctx->Extensions + *e))
142301e04c3fSmrg            api_found = GL_TRUE;
142401e04c3fSmrg         break;
14253464ebd5Sriastradh      }
1426af69d88dSmrg   }
14273464ebd5Sriastradh
1428af69d88dSmrg   if (api_check && !api_found) {
14293464ebd5Sriastradh      _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)", func,
143001e04c3fSmrg                  _mesa_enum_to_string(d->pname));
14313464ebd5Sriastradh      return GL_FALSE;
14327117f1b4Smrg   }
14337117f1b4Smrg
14343464ebd5Sriastradh   return GL_TRUE;
14353464ebd5Sriastradh}
14363464ebd5Sriastradh
14373464ebd5Sriastradhstatic const struct value_desc error_value =
14383464ebd5Sriastradh   { 0, 0, TYPE_INVALID, NO_OFFSET, NO_EXTRA };
14393464ebd5Sriastradh
14403464ebd5Sriastradh/**
14413464ebd5Sriastradh * Find the struct value_desc corresponding to the enum 'pname'.
144201e04c3fSmrg *
14433464ebd5Sriastradh * We hash the enum value to get an index into the 'table' array,
14443464ebd5Sriastradh * which holds the index in the 'values' array of struct value_desc.
14453464ebd5Sriastradh * Once we've found the entry, we do the extra checks, if any, then
14463464ebd5Sriastradh * look up the value and return a pointer to it.
14473464ebd5Sriastradh *
14483464ebd5Sriastradh * If the value has to be computed (for example, it's the result of a
14493464ebd5Sriastradh * function call or we need to add 1 to it), we use the tmp 'v' to
14503464ebd5Sriastradh * store the result.
145101e04c3fSmrg *
14523464ebd5Sriastradh * \param func name of glGet*v() func for error reporting
14533464ebd5Sriastradh * \param pname the enum value we're looking up
14543464ebd5Sriastradh * \param p is were we return the pointer to the value
14553464ebd5Sriastradh * \param v a tmp union value variable in the calling glGet*v() function
14563464ebd5Sriastradh *
14573464ebd5Sriastradh * \return the struct value_desc corresponding to the enum or a struct
14583464ebd5Sriastradh *     value_desc of TYPE_INVALID if not found.  This lets the calling
14593464ebd5Sriastradh *     glGet*v() function jump right into a switch statement and
14603464ebd5Sriastradh *     handle errors there instead of having to check for NULL.
14617117f1b4Smrg */
14623464ebd5Sriastradhstatic const struct value_desc *
14633464ebd5Sriastradhfind_value(const char *func, GLenum pname, void **p, union value *v)
14643464ebd5Sriastradh{
14653464ebd5Sriastradh   GET_CURRENT_CONTEXT(ctx);
14663464ebd5Sriastradh   int mask, hash;
14673464ebd5Sriastradh   const struct value_desc *d;
1468af69d88dSmrg   int api;
14693464ebd5Sriastradh
1470af69d88dSmrg   api = ctx->API;
1471af69d88dSmrg   /* We index into the table_set[] list of per-API hash tables using the API's
1472af69d88dSmrg    * value in the gl_api enum. Since GLES 3 doesn't have an API_OPENGL* enum
1473af69d88dSmrg    * value since it's compatible with GLES2 its entry in table_set[] is at the
1474af69d88dSmrg    * end.
1475af69d88dSmrg    */
147601e04c3fSmrg   STATIC_ASSERT(ARRAY_SIZE(table_set) == API_OPENGL_LAST + 4);
147701e04c3fSmrg   if (ctx->API == API_OPENGLES2) {
147801e04c3fSmrg      if (ctx->Version >= 32)
147901e04c3fSmrg         api = API_OPENGL_LAST + 3;
148001e04c3fSmrg      else if (ctx->Version >= 31)
148101e04c3fSmrg         api = API_OPENGL_LAST + 2;
148201e04c3fSmrg      else if (ctx->Version >= 30)
148301e04c3fSmrg         api = API_OPENGL_LAST + 1;
1484af69d88dSmrg   }
148501e04c3fSmrg   mask = ARRAY_SIZE(table(api)) - 1;
14863464ebd5Sriastradh   hash = (pname * prime_factor);
14873464ebd5Sriastradh   while (1) {
1488af69d88dSmrg      int idx = table(api)[hash & mask];
14893464ebd5Sriastradh
14903464ebd5Sriastradh      /* If the enum isn't valid, the hash walk ends with index 0,
1491af69d88dSmrg       * pointing to the first entry of values[] which doesn't hold
1492af69d88dSmrg       * any valid enum. */
1493af69d88dSmrg      if (unlikely(idx == 0)) {
1494af69d88dSmrg         _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)", func,
149501e04c3fSmrg               _mesa_enum_to_string(pname));
1496af69d88dSmrg         return &error_value;
14973464ebd5Sriastradh      }
14983464ebd5Sriastradh
1499af69d88dSmrg      d = &values[idx];
15003464ebd5Sriastradh      if (likely(d->pname == pname))
1501af69d88dSmrg         break;
15023464ebd5Sriastradh
15033464ebd5Sriastradh      hash += prime_step;
15047117f1b4Smrg   }
15057117f1b4Smrg
15063464ebd5Sriastradh   if (unlikely(d->extra && !check_extra(ctx, func, d)))
15073464ebd5Sriastradh      return &error_value;
15083464ebd5Sriastradh
15093464ebd5Sriastradh   switch (d->location) {
15103464ebd5Sriastradh   case LOC_BUFFER:
15113464ebd5Sriastradh      *p = ((char *) ctx->DrawBuffer + d->offset);
15123464ebd5Sriastradh      return d;
15133464ebd5Sriastradh   case LOC_CONTEXT:
15143464ebd5Sriastradh      *p = ((char *) ctx + d->offset);
15153464ebd5Sriastradh      return d;
15163464ebd5Sriastradh   case LOC_ARRAY:
1517af69d88dSmrg      *p = ((char *) ctx->Array.VAO + d->offset);
15183464ebd5Sriastradh      return d;
15193464ebd5Sriastradh   case LOC_TEXUNIT:
152001e04c3fSmrg      if (ctx->Texture.CurrentUnit < ARRAY_SIZE(ctx->Texture.FixedFuncUnit)) {
152101e04c3fSmrg         unsigned index = ctx->Texture.CurrentUnit;
152201e04c3fSmrg         *p = ((char *)&ctx->Texture.FixedFuncUnit[index] + d->offset);
152301e04c3fSmrg      }
15243464ebd5Sriastradh      return d;
15253464ebd5Sriastradh   case LOC_CUSTOM:
15263464ebd5Sriastradh      find_custom_value(ctx, d, v);
15273464ebd5Sriastradh      *p = v;
15283464ebd5Sriastradh      return d;
15293464ebd5Sriastradh   default:
15303464ebd5Sriastradh      assert(0);
15313464ebd5Sriastradh      break;
15323464ebd5Sriastradh   }
15333464ebd5Sriastradh
15343464ebd5Sriastradh   /* silence warning */
15353464ebd5Sriastradh   return &error_value;
15363464ebd5Sriastradh}
15373464ebd5Sriastradh
15383464ebd5Sriastradhstatic const int transpose[] = {
15393464ebd5Sriastradh   0, 4,  8, 12,
15403464ebd5Sriastradh   1, 5,  9, 13,
15413464ebd5Sriastradh   2, 6, 10, 14,
15423464ebd5Sriastradh   3, 7, 11, 15
15433464ebd5Sriastradh};
15447117f1b4Smrg
154501e04c3fSmrgstatic GLsizei
154601e04c3fSmrgget_value_size(enum value_type type, const union value *v)
154701e04c3fSmrg{
154801e04c3fSmrg   switch (type) {
154901e04c3fSmrg   case TYPE_INVALID:
155001e04c3fSmrg      return 0;
155101e04c3fSmrg   case TYPE_CONST:
155201e04c3fSmrg   case TYPE_UINT:
155301e04c3fSmrg   case TYPE_INT:
155401e04c3fSmrg      return sizeof(GLint);
155501e04c3fSmrg   case TYPE_INT_2:
155601e04c3fSmrg   case TYPE_UINT_2:
155701e04c3fSmrg      return sizeof(GLint) * 2;
155801e04c3fSmrg   case TYPE_INT_3:
155901e04c3fSmrg   case TYPE_UINT_3:
156001e04c3fSmrg      return sizeof(GLint) * 3;
156101e04c3fSmrg   case TYPE_INT_4:
156201e04c3fSmrg   case TYPE_UINT_4:
156301e04c3fSmrg      return sizeof(GLint) * 4;
156401e04c3fSmrg   case TYPE_INT_N:
156501e04c3fSmrg      return sizeof(GLint) * v->value_int_n.n;
156601e04c3fSmrg   case TYPE_INT64:
156701e04c3fSmrg      return sizeof(GLint64);
156801e04c3fSmrg      break;
156901e04c3fSmrg   case TYPE_ENUM16:
157001e04c3fSmrg      return sizeof(GLenum16);
157101e04c3fSmrg   case TYPE_ENUM:
157201e04c3fSmrg      return sizeof(GLenum);
157301e04c3fSmrg   case TYPE_ENUM_2:
157401e04c3fSmrg      return sizeof(GLenum) * 2;
157501e04c3fSmrg   case TYPE_BOOLEAN:
157601e04c3fSmrg      return sizeof(GLboolean);
157701e04c3fSmrg   case TYPE_UBYTE:
157801e04c3fSmrg      return sizeof(GLubyte);
157901e04c3fSmrg   case TYPE_SHORT:
158001e04c3fSmrg      return sizeof(GLshort);
158101e04c3fSmrg   case TYPE_BIT_0:
158201e04c3fSmrg   case TYPE_BIT_1:
158301e04c3fSmrg   case TYPE_BIT_2:
158401e04c3fSmrg   case TYPE_BIT_3:
158501e04c3fSmrg   case TYPE_BIT_4:
158601e04c3fSmrg   case TYPE_BIT_5:
158701e04c3fSmrg   case TYPE_BIT_6:
158801e04c3fSmrg   case TYPE_BIT_7:
158901e04c3fSmrg      return 1;
159001e04c3fSmrg   case TYPE_FLOAT:
159101e04c3fSmrg   case TYPE_FLOATN:
159201e04c3fSmrg      return sizeof(GLfloat);
159301e04c3fSmrg   case TYPE_FLOAT_2:
159401e04c3fSmrg   case TYPE_FLOATN_2:
159501e04c3fSmrg      return sizeof(GLfloat) * 2;
159601e04c3fSmrg   case TYPE_FLOAT_3:
159701e04c3fSmrg   case TYPE_FLOATN_3:
159801e04c3fSmrg      return sizeof(GLfloat) * 3;
159901e04c3fSmrg   case TYPE_FLOAT_4:
160001e04c3fSmrg   case TYPE_FLOATN_4:
160101e04c3fSmrg      return sizeof(GLfloat) * 4;
160201e04c3fSmrg   case TYPE_FLOAT_8:
160301e04c3fSmrg      return sizeof(GLfloat) * 8;
160401e04c3fSmrg   case TYPE_DOUBLEN:
160501e04c3fSmrg      return sizeof(GLdouble);
160601e04c3fSmrg   case TYPE_DOUBLEN_2:
160701e04c3fSmrg      return sizeof(GLdouble) * 2;
160801e04c3fSmrg   case TYPE_MATRIX:
160901e04c3fSmrg      return sizeof (GLfloat) * 16;
161001e04c3fSmrg   case TYPE_MATRIX_T:
161101e04c3fSmrg      return sizeof (GLfloat) * 16;
161201e04c3fSmrg   default:
161301e04c3fSmrg      return -1;
161401e04c3fSmrg   }
161501e04c3fSmrg}
161601e04c3fSmrg
16177117f1b4Smrgvoid GLAPIENTRY
16183464ebd5Sriastradh_mesa_GetBooleanv(GLenum pname, GLboolean *params)
16197117f1b4Smrg{
16203464ebd5Sriastradh   const struct value_desc *d;
16213464ebd5Sriastradh   union value v;
16223464ebd5Sriastradh   GLmatrix *m;
16233464ebd5Sriastradh   int shift, i;
16243464ebd5Sriastradh   void *p;
16257117f1b4Smrg
16263464ebd5Sriastradh   d = find_value("glGetBooleanv", pname, &p, &v);
16273464ebd5Sriastradh   switch (d->type) {
16283464ebd5Sriastradh   case TYPE_INVALID:
16293464ebd5Sriastradh      break;
16303464ebd5Sriastradh   case TYPE_CONST:
16313464ebd5Sriastradh      params[0] = INT_TO_BOOLEAN(d->offset);
16323464ebd5Sriastradh      break;
16337117f1b4Smrg
163401e04c3fSmrg   case TYPE_FLOAT_8:
163501e04c3fSmrg      params[7] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[7]);
163601e04c3fSmrg      params[6] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[6]);
163701e04c3fSmrg      params[5] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[5]);
163801e04c3fSmrg      params[4] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[4]);
16393464ebd5Sriastradh   case TYPE_FLOAT_4:
16403464ebd5Sriastradh   case TYPE_FLOATN_4:
16413464ebd5Sriastradh      params[3] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[3]);
16423464ebd5Sriastradh   case TYPE_FLOAT_3:
16433464ebd5Sriastradh   case TYPE_FLOATN_3:
16443464ebd5Sriastradh      params[2] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[2]);
16453464ebd5Sriastradh   case TYPE_FLOAT_2:
16463464ebd5Sriastradh   case TYPE_FLOATN_2:
16473464ebd5Sriastradh      params[1] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[1]);
16483464ebd5Sriastradh   case TYPE_FLOAT:
16493464ebd5Sriastradh   case TYPE_FLOATN:
16503464ebd5Sriastradh      params[0] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[0]);
16513464ebd5Sriastradh      break;
16527117f1b4Smrg
1653af69d88dSmrg   case TYPE_DOUBLEN_2:
1654af69d88dSmrg      params[1] = FLOAT_TO_BOOLEAN(((GLdouble *) p)[1]);
16553464ebd5Sriastradh   case TYPE_DOUBLEN:
16563464ebd5Sriastradh      params[0] = FLOAT_TO_BOOLEAN(((GLdouble *) p)[0]);
16573464ebd5Sriastradh      break;
16587117f1b4Smrg
16593464ebd5Sriastradh   case TYPE_INT_4:
166001e04c3fSmrg   case TYPE_UINT_4:
16613464ebd5Sriastradh      params[3] = INT_TO_BOOLEAN(((GLint *) p)[3]);
16623464ebd5Sriastradh   case TYPE_INT_3:
166301e04c3fSmrg   case TYPE_UINT_3:
16643464ebd5Sriastradh      params[2] = INT_TO_BOOLEAN(((GLint *) p)[2]);
16653464ebd5Sriastradh   case TYPE_INT_2:
166601e04c3fSmrg   case TYPE_UINT_2:
16673464ebd5Sriastradh   case TYPE_ENUM_2:
16683464ebd5Sriastradh      params[1] = INT_TO_BOOLEAN(((GLint *) p)[1]);
16693464ebd5Sriastradh   case TYPE_INT:
167001e04c3fSmrg   case TYPE_UINT:
16713464ebd5Sriastradh   case TYPE_ENUM:
16723464ebd5Sriastradh      params[0] = INT_TO_BOOLEAN(((GLint *) p)[0]);
16733464ebd5Sriastradh      break;
16743464ebd5Sriastradh
167501e04c3fSmrg   case TYPE_ENUM16:
167601e04c3fSmrg      params[0] = INT_TO_BOOLEAN(((GLenum16 *) p)[0]);
167701e04c3fSmrg      break;
167801e04c3fSmrg
16793464ebd5Sriastradh   case TYPE_INT_N:
16803464ebd5Sriastradh      for (i = 0; i < v.value_int_n.n; i++)
168101e04c3fSmrg         params[i] = INT_TO_BOOLEAN(v.value_int_n.ints[i]);
16823464ebd5Sriastradh      break;
16833464ebd5Sriastradh
16843464ebd5Sriastradh   case TYPE_INT64:
16853464ebd5Sriastradh      params[0] = INT64_TO_BOOLEAN(((GLint64 *) p)[0]);
16863464ebd5Sriastradh      break;
16873464ebd5Sriastradh
16883464ebd5Sriastradh   case TYPE_BOOLEAN:
16893464ebd5Sriastradh      params[0] = ((GLboolean*) p)[0];
169001e04c3fSmrg      break;
169101e04c3fSmrg
169201e04c3fSmrg   case TYPE_UBYTE:
169301e04c3fSmrg      params[0] = INT_TO_BOOLEAN(((GLubyte *) p)[0]);
169401e04c3fSmrg      break;
169501e04c3fSmrg
169601e04c3fSmrg   case TYPE_SHORT:
169701e04c3fSmrg      params[0] = INT_TO_BOOLEAN(((GLshort *) p)[0]);
169801e04c3fSmrg      break;
16993464ebd5Sriastradh
17003464ebd5Sriastradh   case TYPE_MATRIX:
17013464ebd5Sriastradh      m = *(GLmatrix **) p;
17023464ebd5Sriastradh      for (i = 0; i < 16; i++)
170301e04c3fSmrg         params[i] = FLOAT_TO_BOOLEAN(m->m[i]);
17043464ebd5Sriastradh      break;
17053464ebd5Sriastradh
17063464ebd5Sriastradh   case TYPE_MATRIX_T:
17073464ebd5Sriastradh      m = *(GLmatrix **) p;
17083464ebd5Sriastradh      for (i = 0; i < 16; i++)
170901e04c3fSmrg         params[i] = FLOAT_TO_BOOLEAN(m->m[transpose[i]]);
17103464ebd5Sriastradh      break;
17113464ebd5Sriastradh
17123464ebd5Sriastradh   case TYPE_BIT_0:
17133464ebd5Sriastradh   case TYPE_BIT_1:
17143464ebd5Sriastradh   case TYPE_BIT_2:
17153464ebd5Sriastradh   case TYPE_BIT_3:
17163464ebd5Sriastradh   case TYPE_BIT_4:
17173464ebd5Sriastradh   case TYPE_BIT_5:
1718af69d88dSmrg   case TYPE_BIT_6:
1719af69d88dSmrg   case TYPE_BIT_7:
17203464ebd5Sriastradh      shift = d->type - TYPE_BIT_0;
17213464ebd5Sriastradh      params[0] = (*(GLbitfield *) p >> shift) & 1;
17223464ebd5Sriastradh      break;
17234a49301eSmrg   }
17244a49301eSmrg}
17257117f1b4Smrg
17267117f1b4Smrgvoid GLAPIENTRY
17273464ebd5Sriastradh_mesa_GetFloatv(GLenum pname, GLfloat *params)
17287117f1b4Smrg{
17293464ebd5Sriastradh   const struct value_desc *d;
17303464ebd5Sriastradh   union value v;
17313464ebd5Sriastradh   GLmatrix *m;
17323464ebd5Sriastradh   int shift, i;
17333464ebd5Sriastradh   void *p;
17347117f1b4Smrg
17353464ebd5Sriastradh   d = find_value("glGetFloatv", pname, &p, &v);
17363464ebd5Sriastradh   switch (d->type) {
17373464ebd5Sriastradh   case TYPE_INVALID:
17383464ebd5Sriastradh      break;
17393464ebd5Sriastradh   case TYPE_CONST:
17403464ebd5Sriastradh      params[0] = (GLfloat) d->offset;
17413464ebd5Sriastradh      break;
17427117f1b4Smrg
174301e04c3fSmrg   case TYPE_FLOAT_8:
174401e04c3fSmrg      params[7] = ((GLfloat *) p)[7];
174501e04c3fSmrg      params[6] = ((GLfloat *) p)[6];
174601e04c3fSmrg      params[5] = ((GLfloat *) p)[5];
174701e04c3fSmrg      params[4] = ((GLfloat *) p)[4];
17483464ebd5Sriastradh   case TYPE_FLOAT_4:
17493464ebd5Sriastradh   case TYPE_FLOATN_4:
17503464ebd5Sriastradh      params[3] = ((GLfloat *) p)[3];
17513464ebd5Sriastradh   case TYPE_FLOAT_3:
17523464ebd5Sriastradh   case TYPE_FLOATN_3:
17533464ebd5Sriastradh      params[2] = ((GLfloat *) p)[2];
17543464ebd5Sriastradh   case TYPE_FLOAT_2:
17553464ebd5Sriastradh   case TYPE_FLOATN_2:
17563464ebd5Sriastradh      params[1] = ((GLfloat *) p)[1];
17573464ebd5Sriastradh   case TYPE_FLOAT:
17583464ebd5Sriastradh   case TYPE_FLOATN:
17593464ebd5Sriastradh      params[0] = ((GLfloat *) p)[0];
17603464ebd5Sriastradh      break;
17617117f1b4Smrg
1762af69d88dSmrg   case TYPE_DOUBLEN_2:
1763af69d88dSmrg      params[1] = (GLfloat) (((GLdouble *) p)[1]);
17643464ebd5Sriastradh   case TYPE_DOUBLEN:
1765af69d88dSmrg      params[0] = (GLfloat) (((GLdouble *) p)[0]);
17663464ebd5Sriastradh      break;
17673464ebd5Sriastradh
17683464ebd5Sriastradh   case TYPE_INT_4:
17693464ebd5Sriastradh      params[3] = (GLfloat) (((GLint *) p)[3]);
17703464ebd5Sriastradh   case TYPE_INT_3:
17713464ebd5Sriastradh      params[2] = (GLfloat) (((GLint *) p)[2]);
17723464ebd5Sriastradh   case TYPE_INT_2:
17733464ebd5Sriastradh   case TYPE_ENUM_2:
17743464ebd5Sriastradh      params[1] = (GLfloat) (((GLint *) p)[1]);
17753464ebd5Sriastradh   case TYPE_INT:
17763464ebd5Sriastradh   case TYPE_ENUM:
17773464ebd5Sriastradh      params[0] = (GLfloat) (((GLint *) p)[0]);
17783464ebd5Sriastradh      break;
17793464ebd5Sriastradh
178001e04c3fSmrg   case TYPE_ENUM16:
178101e04c3fSmrg      params[0] = (GLfloat) (((GLenum16 *) p)[0]);
178201e04c3fSmrg      break;
178301e04c3fSmrg
17843464ebd5Sriastradh   case TYPE_INT_N:
17853464ebd5Sriastradh      for (i = 0; i < v.value_int_n.n; i++)
178601e04c3fSmrg         params[i] = (GLfloat) v.value_int_n.ints[i];
178701e04c3fSmrg      break;
178801e04c3fSmrg
178901e04c3fSmrg   case TYPE_UINT_4:
179001e04c3fSmrg      params[3] = (GLfloat) (((GLuint *) p)[3]);
179101e04c3fSmrg   case TYPE_UINT_3:
179201e04c3fSmrg      params[2] = (GLfloat) (((GLuint *) p)[2]);
179301e04c3fSmrg   case TYPE_UINT_2:
179401e04c3fSmrg      params[1] = (GLfloat) (((GLuint *) p)[1]);
179501e04c3fSmrg   case TYPE_UINT:
179601e04c3fSmrg      params[0] = (GLfloat) (((GLuint *) p)[0]);
17973464ebd5Sriastradh      break;
17983464ebd5Sriastradh
17993464ebd5Sriastradh   case TYPE_INT64:
1800af69d88dSmrg      params[0] = (GLfloat) (((GLint64 *) p)[0]);
18013464ebd5Sriastradh      break;
18023464ebd5Sriastradh
18033464ebd5Sriastradh   case TYPE_BOOLEAN:
18043464ebd5Sriastradh      params[0] = BOOLEAN_TO_FLOAT(*(GLboolean*) p);
180501e04c3fSmrg      break;
180601e04c3fSmrg
180701e04c3fSmrg   case TYPE_UBYTE:
180801e04c3fSmrg      params[0] = (GLfloat) ((GLubyte *) p)[0];
180901e04c3fSmrg      break;
181001e04c3fSmrg
181101e04c3fSmrg   case TYPE_SHORT:
181201e04c3fSmrg      params[0] = (GLfloat) ((GLshort *) p)[0];
181301e04c3fSmrg      break;
18143464ebd5Sriastradh
18153464ebd5Sriastradh   case TYPE_MATRIX:
18163464ebd5Sriastradh      m = *(GLmatrix **) p;
18173464ebd5Sriastradh      for (i = 0; i < 16; i++)
181801e04c3fSmrg         params[i] = m->m[i];
18193464ebd5Sriastradh      break;
18203464ebd5Sriastradh
18213464ebd5Sriastradh   case TYPE_MATRIX_T:
18223464ebd5Sriastradh      m = *(GLmatrix **) p;
18233464ebd5Sriastradh      for (i = 0; i < 16; i++)
182401e04c3fSmrg         params[i] = m->m[transpose[i]];
18253464ebd5Sriastradh      break;
18263464ebd5Sriastradh
18273464ebd5Sriastradh   case TYPE_BIT_0:
18283464ebd5Sriastradh   case TYPE_BIT_1:
18293464ebd5Sriastradh   case TYPE_BIT_2:
18303464ebd5Sriastradh   case TYPE_BIT_3:
18313464ebd5Sriastradh   case TYPE_BIT_4:
18323464ebd5Sriastradh   case TYPE_BIT_5:
1833af69d88dSmrg   case TYPE_BIT_6:
1834af69d88dSmrg   case TYPE_BIT_7:
18353464ebd5Sriastradh      shift = d->type - TYPE_BIT_0;
18363464ebd5Sriastradh      params[0] = BOOLEAN_TO_FLOAT((*(GLbitfield *) p >> shift) & 1);
18373464ebd5Sriastradh      break;
18383464ebd5Sriastradh   }
18397117f1b4Smrg}
18407117f1b4Smrg
1841cdc920a0Smrgvoid GLAPIENTRY
18423464ebd5Sriastradh_mesa_GetIntegerv(GLenum pname, GLint *params)
1843cdc920a0Smrg{
18443464ebd5Sriastradh   const struct value_desc *d;
18453464ebd5Sriastradh   union value v;
18463464ebd5Sriastradh   GLmatrix *m;
18473464ebd5Sriastradh   int shift, i;
18483464ebd5Sriastradh   void *p;
1849cdc920a0Smrg
18503464ebd5Sriastradh   d = find_value("glGetIntegerv", pname, &p, &v);
18513464ebd5Sriastradh   switch (d->type) {
18523464ebd5Sriastradh   case TYPE_INVALID:
18533464ebd5Sriastradh      break;
18543464ebd5Sriastradh   case TYPE_CONST:
18553464ebd5Sriastradh      params[0] = d->offset;
18563464ebd5Sriastradh      break;
1857cdc920a0Smrg
185801e04c3fSmrg   case TYPE_FLOAT_8:
185901e04c3fSmrg      params[7] = IROUND(((GLfloat *) p)[7]);
186001e04c3fSmrg      params[6] = IROUND(((GLfloat *) p)[6]);
186101e04c3fSmrg      params[5] = IROUND(((GLfloat *) p)[5]);
186201e04c3fSmrg      params[4] = IROUND(((GLfloat *) p)[4]);
18633464ebd5Sriastradh   case TYPE_FLOAT_4:
18643464ebd5Sriastradh      params[3] = IROUND(((GLfloat *) p)[3]);
18653464ebd5Sriastradh   case TYPE_FLOAT_3:
18663464ebd5Sriastradh      params[2] = IROUND(((GLfloat *) p)[2]);
18673464ebd5Sriastradh   case TYPE_FLOAT_2:
18683464ebd5Sriastradh      params[1] = IROUND(((GLfloat *) p)[1]);
18693464ebd5Sriastradh   case TYPE_FLOAT:
18703464ebd5Sriastradh      params[0] = IROUND(((GLfloat *) p)[0]);
18713464ebd5Sriastradh      break;
1872cdc920a0Smrg
18733464ebd5Sriastradh   case TYPE_FLOATN_4:
18743464ebd5Sriastradh      params[3] = FLOAT_TO_INT(((GLfloat *) p)[3]);
18753464ebd5Sriastradh   case TYPE_FLOATN_3:
18763464ebd5Sriastradh      params[2] = FLOAT_TO_INT(((GLfloat *) p)[2]);
18773464ebd5Sriastradh   case TYPE_FLOATN_2:
18783464ebd5Sriastradh      params[1] = FLOAT_TO_INT(((GLfloat *) p)[1]);
18793464ebd5Sriastradh   case TYPE_FLOATN:
18803464ebd5Sriastradh      params[0] = FLOAT_TO_INT(((GLfloat *) p)[0]);
18813464ebd5Sriastradh      break;
18823464ebd5Sriastradh
1883af69d88dSmrg   case TYPE_DOUBLEN_2:
1884af69d88dSmrg      params[1] = FLOAT_TO_INT(((GLdouble *) p)[1]);
18853464ebd5Sriastradh   case TYPE_DOUBLEN:
18863464ebd5Sriastradh      params[0] = FLOAT_TO_INT(((GLdouble *) p)[0]);
18873464ebd5Sriastradh      break;
18883464ebd5Sriastradh
18893464ebd5Sriastradh   case TYPE_INT_4:
189001e04c3fSmrg   case TYPE_UINT_4:
18913464ebd5Sriastradh      params[3] = ((GLint *) p)[3];
18923464ebd5Sriastradh   case TYPE_INT_3:
189301e04c3fSmrg   case TYPE_UINT_3:
18943464ebd5Sriastradh      params[2] = ((GLint *) p)[2];
18953464ebd5Sriastradh   case TYPE_INT_2:
189601e04c3fSmrg   case TYPE_UINT_2:
18973464ebd5Sriastradh   case TYPE_ENUM_2:
18983464ebd5Sriastradh      params[1] = ((GLint *) p)[1];
18993464ebd5Sriastradh   case TYPE_INT:
190001e04c3fSmrg   case TYPE_UINT:
19013464ebd5Sriastradh   case TYPE_ENUM:
19023464ebd5Sriastradh      params[0] = ((GLint *) p)[0];
19033464ebd5Sriastradh      break;
19043464ebd5Sriastradh
190501e04c3fSmrg   case TYPE_ENUM16:
190601e04c3fSmrg      params[0] = ((GLenum16 *) p)[0];
190701e04c3fSmrg      break;
190801e04c3fSmrg
19093464ebd5Sriastradh   case TYPE_INT_N:
19103464ebd5Sriastradh      for (i = 0; i < v.value_int_n.n; i++)
191101e04c3fSmrg         params[i] = v.value_int_n.ints[i];
19123464ebd5Sriastradh      break;
19133464ebd5Sriastradh
19143464ebd5Sriastradh   case TYPE_INT64:
19153464ebd5Sriastradh      params[0] = INT64_TO_INT(((GLint64 *) p)[0]);
19163464ebd5Sriastradh      break;
19173464ebd5Sriastradh
19183464ebd5Sriastradh   case TYPE_BOOLEAN:
19193464ebd5Sriastradh      params[0] = BOOLEAN_TO_INT(*(GLboolean*) p);
192001e04c3fSmrg      break;
192101e04c3fSmrg
192201e04c3fSmrg   case TYPE_UBYTE:
192301e04c3fSmrg      params[0] = ((GLubyte *) p)[0];
192401e04c3fSmrg      break;
192501e04c3fSmrg
192601e04c3fSmrg   case TYPE_SHORT:
192701e04c3fSmrg      params[0] = ((GLshort *) p)[0];
192801e04c3fSmrg      break;
19293464ebd5Sriastradh
19303464ebd5Sriastradh   case TYPE_MATRIX:
19313464ebd5Sriastradh      m = *(GLmatrix **) p;
19323464ebd5Sriastradh      for (i = 0; i < 16; i++)
193301e04c3fSmrg         params[i] = FLOAT_TO_INT(m->m[i]);
19343464ebd5Sriastradh      break;
19353464ebd5Sriastradh
19363464ebd5Sriastradh   case TYPE_MATRIX_T:
19373464ebd5Sriastradh      m = *(GLmatrix **) p;
19383464ebd5Sriastradh      for (i = 0; i < 16; i++)
193901e04c3fSmrg         params[i] = FLOAT_TO_INT(m->m[transpose[i]]);
19403464ebd5Sriastradh      break;
19413464ebd5Sriastradh
19423464ebd5Sriastradh   case TYPE_BIT_0:
19433464ebd5Sriastradh   case TYPE_BIT_1:
19443464ebd5Sriastradh   case TYPE_BIT_2:
19453464ebd5Sriastradh   case TYPE_BIT_3:
19463464ebd5Sriastradh   case TYPE_BIT_4:
19473464ebd5Sriastradh   case TYPE_BIT_5:
1948af69d88dSmrg   case TYPE_BIT_6:
1949af69d88dSmrg   case TYPE_BIT_7:
19503464ebd5Sriastradh      shift = d->type - TYPE_BIT_0;
19513464ebd5Sriastradh      params[0] = (*(GLbitfield *) p >> shift) & 1;
19523464ebd5Sriastradh      break;
1953cdc920a0Smrg   }
1954cdc920a0Smrg}
1955cdc920a0Smrg
1956cdc920a0Smrgvoid GLAPIENTRY
19573464ebd5Sriastradh_mesa_GetInteger64v(GLenum pname, GLint64 *params)
1958cdc920a0Smrg{
19593464ebd5Sriastradh   const struct value_desc *d;
19603464ebd5Sriastradh   union value v;
19613464ebd5Sriastradh   GLmatrix *m;
19623464ebd5Sriastradh   int shift, i;
19633464ebd5Sriastradh   void *p;
1964cdc920a0Smrg
19653464ebd5Sriastradh   d = find_value("glGetInteger64v", pname, &p, &v);
19663464ebd5Sriastradh   switch (d->type) {
19673464ebd5Sriastradh   case TYPE_INVALID:
19683464ebd5Sriastradh      break;
19693464ebd5Sriastradh   case TYPE_CONST:
19703464ebd5Sriastradh      params[0] = d->offset;
19713464ebd5Sriastradh      break;
1972cdc920a0Smrg
197301e04c3fSmrg   case TYPE_FLOAT_8:
197401e04c3fSmrg      params[7] = IROUND64(((GLfloat *) p)[7]);
197501e04c3fSmrg      params[6] = IROUND64(((GLfloat *) p)[6]);
197601e04c3fSmrg      params[5] = IROUND64(((GLfloat *) p)[5]);
197701e04c3fSmrg      params[4] = IROUND64(((GLfloat *) p)[4]);
19783464ebd5Sriastradh   case TYPE_FLOAT_4:
19793464ebd5Sriastradh      params[3] = IROUND64(((GLfloat *) p)[3]);
19803464ebd5Sriastradh   case TYPE_FLOAT_3:
19813464ebd5Sriastradh      params[2] = IROUND64(((GLfloat *) p)[2]);
19823464ebd5Sriastradh   case TYPE_FLOAT_2:
19833464ebd5Sriastradh      params[1] = IROUND64(((GLfloat *) p)[1]);
19843464ebd5Sriastradh   case TYPE_FLOAT:
19853464ebd5Sriastradh      params[0] = IROUND64(((GLfloat *) p)[0]);
19863464ebd5Sriastradh      break;
1987cdc920a0Smrg
19883464ebd5Sriastradh   case TYPE_FLOATN_4:
198901e04c3fSmrg      params[3] = FLOAT_TO_INT(((GLfloat *) p)[3]);
19903464ebd5Sriastradh   case TYPE_FLOATN_3:
199101e04c3fSmrg      params[2] = FLOAT_TO_INT(((GLfloat *) p)[2]);
19923464ebd5Sriastradh   case TYPE_FLOATN_2:
199301e04c3fSmrg      params[1] = FLOAT_TO_INT(((GLfloat *) p)[1]);
19943464ebd5Sriastradh   case TYPE_FLOATN:
199501e04c3fSmrg      params[0] = FLOAT_TO_INT(((GLfloat *) p)[0]);
19963464ebd5Sriastradh      break;
19973464ebd5Sriastradh
1998af69d88dSmrg   case TYPE_DOUBLEN_2:
199901e04c3fSmrg      params[1] = FLOAT_TO_INT(((GLdouble *) p)[1]);
20003464ebd5Sriastradh   case TYPE_DOUBLEN:
200101e04c3fSmrg      params[0] = FLOAT_TO_INT(((GLdouble *) p)[0]);
20023464ebd5Sriastradh      break;
20033464ebd5Sriastradh
20043464ebd5Sriastradh   case TYPE_INT_4:
20053464ebd5Sriastradh      params[3] = ((GLint *) p)[3];
20063464ebd5Sriastradh   case TYPE_INT_3:
20073464ebd5Sriastradh      params[2] = ((GLint *) p)[2];
20083464ebd5Sriastradh   case TYPE_INT_2:
20093464ebd5Sriastradh   case TYPE_ENUM_2:
20103464ebd5Sriastradh      params[1] = ((GLint *) p)[1];
20113464ebd5Sriastradh   case TYPE_INT:
20123464ebd5Sriastradh   case TYPE_ENUM:
20133464ebd5Sriastradh      params[0] = ((GLint *) p)[0];
20143464ebd5Sriastradh      break;
20153464ebd5Sriastradh
201601e04c3fSmrg   case TYPE_ENUM16:
201701e04c3fSmrg      params[0] = ((GLenum16 *) p)[0];
201801e04c3fSmrg      break;
201901e04c3fSmrg
20203464ebd5Sriastradh   case TYPE_INT_N:
20213464ebd5Sriastradh      for (i = 0; i < v.value_int_n.n; i++)
202201e04c3fSmrg         params[i] = v.value_int_n.ints[i];
202301e04c3fSmrg      break;
202401e04c3fSmrg
202501e04c3fSmrg   case TYPE_UINT_4:
202601e04c3fSmrg      params[3] = ((GLuint *) p)[3];
202701e04c3fSmrg   case TYPE_UINT_3:
202801e04c3fSmrg      params[2] = ((GLuint *) p)[2];
202901e04c3fSmrg   case TYPE_UINT_2:
203001e04c3fSmrg      params[1] = ((GLuint *) p)[1];
203101e04c3fSmrg   case TYPE_UINT:
203201e04c3fSmrg      params[0] = ((GLuint *) p)[0];
20333464ebd5Sriastradh      break;
20343464ebd5Sriastradh
20353464ebd5Sriastradh   case TYPE_INT64:
20363464ebd5Sriastradh      params[0] = ((GLint64 *) p)[0];
20373464ebd5Sriastradh      break;
20383464ebd5Sriastradh
20393464ebd5Sriastradh   case TYPE_BOOLEAN:
20403464ebd5Sriastradh      params[0] = ((GLboolean*) p)[0];
204101e04c3fSmrg      break;
20423464ebd5Sriastradh
20433464ebd5Sriastradh   case TYPE_MATRIX:
20443464ebd5Sriastradh      m = *(GLmatrix **) p;
20453464ebd5Sriastradh      for (i = 0; i < 16; i++)
204601e04c3fSmrg         params[i] = FLOAT_TO_INT64(m->m[i]);
20473464ebd5Sriastradh      break;
20483464ebd5Sriastradh
20493464ebd5Sriastradh   case TYPE_MATRIX_T:
20503464ebd5Sriastradh      m = *(GLmatrix **) p;
20513464ebd5Sriastradh      for (i = 0; i < 16; i++)
205201e04c3fSmrg         params[i] = FLOAT_TO_INT64(m->m[transpose[i]]);
20533464ebd5Sriastradh      break;
20543464ebd5Sriastradh
20553464ebd5Sriastradh   case TYPE_BIT_0:
20563464ebd5Sriastradh   case TYPE_BIT_1:
20573464ebd5Sriastradh   case TYPE_BIT_2:
20583464ebd5Sriastradh   case TYPE_BIT_3:
20593464ebd5Sriastradh   case TYPE_BIT_4:
20603464ebd5Sriastradh   case TYPE_BIT_5:
2061af69d88dSmrg   case TYPE_BIT_6:
2062af69d88dSmrg   case TYPE_BIT_7:
20633464ebd5Sriastradh      shift = d->type - TYPE_BIT_0;
20643464ebd5Sriastradh      params[0] = (*(GLbitfield *) p >> shift) & 1;
20653464ebd5Sriastradh      break;
2066cdc920a0Smrg   }
2067cdc920a0Smrg}
2068cdc920a0Smrg
2069cdc920a0Smrgvoid GLAPIENTRY
20703464ebd5Sriastradh_mesa_GetDoublev(GLenum pname, GLdouble *params)
2071cdc920a0Smrg{
20723464ebd5Sriastradh   const struct value_desc *d;
20733464ebd5Sriastradh   union value v;
20743464ebd5Sriastradh   GLmatrix *m;
20753464ebd5Sriastradh   int shift, i;
20763464ebd5Sriastradh   void *p;
2077cdc920a0Smrg
20783464ebd5Sriastradh   d = find_value("glGetDoublev", pname, &p, &v);
20793464ebd5Sriastradh   switch (d->type) {
20803464ebd5Sriastradh   case TYPE_INVALID:
20813464ebd5Sriastradh      break;
20823464ebd5Sriastradh   case TYPE_CONST:
20833464ebd5Sriastradh      params[0] = d->offset;
20843464ebd5Sriastradh      break;
20853464ebd5Sriastradh
208601e04c3fSmrg   case TYPE_FLOAT_8:
208701e04c3fSmrg      params[7] = ((GLfloat *) p)[7];
208801e04c3fSmrg      params[6] = ((GLfloat *) p)[6];
208901e04c3fSmrg      params[5] = ((GLfloat *) p)[5];
209001e04c3fSmrg      params[4] = ((GLfloat *) p)[4];
20913464ebd5Sriastradh   case TYPE_FLOAT_4:
20923464ebd5Sriastradh   case TYPE_FLOATN_4:
20933464ebd5Sriastradh      params[3] = ((GLfloat *) p)[3];
20943464ebd5Sriastradh   case TYPE_FLOAT_3:
20953464ebd5Sriastradh   case TYPE_FLOATN_3:
20963464ebd5Sriastradh      params[2] = ((GLfloat *) p)[2];
20973464ebd5Sriastradh   case TYPE_FLOAT_2:
20983464ebd5Sriastradh   case TYPE_FLOATN_2:
20993464ebd5Sriastradh      params[1] = ((GLfloat *) p)[1];
21003464ebd5Sriastradh   case TYPE_FLOAT:
21013464ebd5Sriastradh   case TYPE_FLOATN:
21023464ebd5Sriastradh      params[0] = ((GLfloat *) p)[0];
21033464ebd5Sriastradh      break;
21043464ebd5Sriastradh
2105af69d88dSmrg   case TYPE_DOUBLEN_2:
2106af69d88dSmrg      params[1] = ((GLdouble *) p)[1];
21073464ebd5Sriastradh   case TYPE_DOUBLEN:
21083464ebd5Sriastradh      params[0] = ((GLdouble *) p)[0];
21093464ebd5Sriastradh      break;
21103464ebd5Sriastradh
21113464ebd5Sriastradh   case TYPE_INT_4:
21123464ebd5Sriastradh      params[3] = ((GLint *) p)[3];
21133464ebd5Sriastradh   case TYPE_INT_3:
21143464ebd5Sriastradh      params[2] = ((GLint *) p)[2];
21153464ebd5Sriastradh   case TYPE_INT_2:
21163464ebd5Sriastradh   case TYPE_ENUM_2:
21173464ebd5Sriastradh      params[1] = ((GLint *) p)[1];
21183464ebd5Sriastradh   case TYPE_INT:
21193464ebd5Sriastradh   case TYPE_ENUM:
21203464ebd5Sriastradh      params[0] = ((GLint *) p)[0];
21213464ebd5Sriastradh      break;
21223464ebd5Sriastradh
212301e04c3fSmrg   case TYPE_ENUM16:
212401e04c3fSmrg      params[0] = ((GLenum16 *) p)[0];
212501e04c3fSmrg      break;
212601e04c3fSmrg
21273464ebd5Sriastradh   case TYPE_INT_N:
21283464ebd5Sriastradh      for (i = 0; i < v.value_int_n.n; i++)
212901e04c3fSmrg         params[i] = v.value_int_n.ints[i];
213001e04c3fSmrg      break;
213101e04c3fSmrg
213201e04c3fSmrg   case TYPE_UINT_4:
213301e04c3fSmrg      params[3] = ((GLuint *) p)[3];
213401e04c3fSmrg   case TYPE_UINT_3:
213501e04c3fSmrg      params[2] = ((GLuint *) p)[2];
213601e04c3fSmrg   case TYPE_UINT_2:
213701e04c3fSmrg      params[1] = ((GLuint *) p)[1];
213801e04c3fSmrg   case TYPE_UINT:
213901e04c3fSmrg      params[0] = ((GLuint *) p)[0];
21403464ebd5Sriastradh      break;
21413464ebd5Sriastradh
21423464ebd5Sriastradh   case TYPE_INT64:
2143af69d88dSmrg      params[0] = (GLdouble) (((GLint64 *) p)[0]);
21443464ebd5Sriastradh      break;
21453464ebd5Sriastradh
21463464ebd5Sriastradh   case TYPE_BOOLEAN:
21473464ebd5Sriastradh      params[0] = *(GLboolean*) p;
214801e04c3fSmrg      break;
214901e04c3fSmrg
215001e04c3fSmrg   case TYPE_UBYTE:
215101e04c3fSmrg      params[0] = ((GLubyte *) p)[0];
215201e04c3fSmrg      break;
215301e04c3fSmrg
215401e04c3fSmrg   case TYPE_SHORT:
215501e04c3fSmrg      params[0] = ((GLshort *) p)[0];
215601e04c3fSmrg      break;
21573464ebd5Sriastradh
21583464ebd5Sriastradh   case TYPE_MATRIX:
21593464ebd5Sriastradh      m = *(GLmatrix **) p;
21603464ebd5Sriastradh      for (i = 0; i < 16; i++)
216101e04c3fSmrg         params[i] = m->m[i];
21623464ebd5Sriastradh      break;
21633464ebd5Sriastradh
21643464ebd5Sriastradh   case TYPE_MATRIX_T:
21653464ebd5Sriastradh      m = *(GLmatrix **) p;
21663464ebd5Sriastradh      for (i = 0; i < 16; i++)
216701e04c3fSmrg         params[i] = m->m[transpose[i]];
21683464ebd5Sriastradh      break;
21693464ebd5Sriastradh
21703464ebd5Sriastradh   case TYPE_BIT_0:
21713464ebd5Sriastradh   case TYPE_BIT_1:
21723464ebd5Sriastradh   case TYPE_BIT_2:
21733464ebd5Sriastradh   case TYPE_BIT_3:
21743464ebd5Sriastradh   case TYPE_BIT_4:
21753464ebd5Sriastradh   case TYPE_BIT_5:
2176af69d88dSmrg   case TYPE_BIT_6:
2177af69d88dSmrg   case TYPE_BIT_7:
21783464ebd5Sriastradh      shift = d->type - TYPE_BIT_0;
21793464ebd5Sriastradh      params[0] = (*(GLbitfield *) p >> shift) & 1;
21803464ebd5Sriastradh      break;
21813464ebd5Sriastradh   }
21823464ebd5Sriastradh}
2183cdc920a0Smrg
218401e04c3fSmrgvoid GLAPIENTRY
218501e04c3fSmrg_mesa_GetUnsignedBytevEXT(GLenum pname, GLubyte *data)
218601e04c3fSmrg{
218701e04c3fSmrg   const struct value_desc *d;
218801e04c3fSmrg   union value v;
218901e04c3fSmrg   int shift;
219001e04c3fSmrg   void *p = NULL;
219101e04c3fSmrg   GLsizei size;
219201e04c3fSmrg   const char *func = "glGetUnsignedBytevEXT";
219301e04c3fSmrg
219401e04c3fSmrg   GET_CURRENT_CONTEXT(ctx);
219501e04c3fSmrg
219601e04c3fSmrg   if (!ctx->Extensions.EXT_memory_object) {
219701e04c3fSmrg      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
219801e04c3fSmrg      return;
219901e04c3fSmrg   }
220001e04c3fSmrg
220101e04c3fSmrg   d = find_value(func, pname, &p, &v);
220201e04c3fSmrg   size = get_value_size(d->type, &v);
220301e04c3fSmrg   if (size <= 0) {
220401e04c3fSmrg      _mesa_problem(ctx, "invalid value type in GetUnsignedBytevEXT()");
220501e04c3fSmrg   }
220601e04c3fSmrg
220701e04c3fSmrg   switch (d->type) {
220801e04c3fSmrg   case TYPE_BIT_0:
220901e04c3fSmrg   case TYPE_BIT_1:
221001e04c3fSmrg   case TYPE_BIT_2:
221101e04c3fSmrg   case TYPE_BIT_3:
221201e04c3fSmrg   case TYPE_BIT_4:
221301e04c3fSmrg   case TYPE_BIT_5:
221401e04c3fSmrg   case TYPE_BIT_6:
221501e04c3fSmrg   case TYPE_BIT_7:
221601e04c3fSmrg      shift = d->type - TYPE_BIT_0;
221701e04c3fSmrg      data[0] = (*(GLbitfield *) p >> shift) & 1;
221801e04c3fSmrg      break;
221901e04c3fSmrg   case TYPE_CONST:
222001e04c3fSmrg      memcpy(data, &d->offset, size);
222101e04c3fSmrg      break;
222201e04c3fSmrg   case TYPE_INT_N:
222301e04c3fSmrg      memcpy(data, &v.value_int_n.ints, size);
222401e04c3fSmrg      break;
222501e04c3fSmrg   case TYPE_UINT:
222601e04c3fSmrg   case TYPE_INT:
222701e04c3fSmrg   case TYPE_INT_2:
222801e04c3fSmrg   case TYPE_UINT_2:
222901e04c3fSmrg   case TYPE_INT_3:
223001e04c3fSmrg   case TYPE_UINT_3:
223101e04c3fSmrg   case TYPE_INT_4:
223201e04c3fSmrg   case TYPE_UINT_4:
223301e04c3fSmrg   case TYPE_INT64:
223401e04c3fSmrg   case TYPE_ENUM:
223501e04c3fSmrg   case TYPE_ENUM_2:
223601e04c3fSmrg   case TYPE_BOOLEAN:
223701e04c3fSmrg   case TYPE_UBYTE:
223801e04c3fSmrg   case TYPE_SHORT:
223901e04c3fSmrg   case TYPE_FLOAT:
224001e04c3fSmrg   case TYPE_FLOATN:
224101e04c3fSmrg   case TYPE_FLOAT_2:
224201e04c3fSmrg   case TYPE_FLOATN_2:
224301e04c3fSmrg   case TYPE_FLOAT_3:
224401e04c3fSmrg   case TYPE_FLOATN_3:
224501e04c3fSmrg   case TYPE_FLOAT_4:
224601e04c3fSmrg   case TYPE_FLOATN_4:
224701e04c3fSmrg   case TYPE_FLOAT_8:
224801e04c3fSmrg   case TYPE_DOUBLEN:
224901e04c3fSmrg   case TYPE_DOUBLEN_2:
225001e04c3fSmrg   case TYPE_MATRIX:
225101e04c3fSmrg   case TYPE_MATRIX_T:
225201e04c3fSmrg      memcpy(data, p, size);
225301e04c3fSmrg      break;
225401e04c3fSmrg   case TYPE_ENUM16: {
225501e04c3fSmrg      GLenum e = *(GLenum16 *)p;
225601e04c3fSmrg      memcpy(data, &e, sizeof(e));
225701e04c3fSmrg      break;
225801e04c3fSmrg   }
225901e04c3fSmrg   default:
226001e04c3fSmrg      break; /* nothing - GL error was recorded */
226101e04c3fSmrg   }
226201e04c3fSmrg}
226301e04c3fSmrg
226401e04c3fSmrg/**
226501e04c3fSmrg * Convert a GL texture binding enum such as GL_TEXTURE_BINDING_2D
226601e04c3fSmrg * into the corresponding Mesa texture target index.
226701e04c3fSmrg * \return TEXTURE_x_INDEX or -1 if binding is invalid
226801e04c3fSmrg */
226901e04c3fSmrgstatic int
227001e04c3fSmrgtex_binding_to_index(const struct gl_context *ctx, GLenum binding)
227101e04c3fSmrg{
227201e04c3fSmrg   switch (binding) {
227301e04c3fSmrg   case GL_TEXTURE_BINDING_1D:
227401e04c3fSmrg      return _mesa_is_desktop_gl(ctx) ? TEXTURE_1D_INDEX : -1;
227501e04c3fSmrg   case GL_TEXTURE_BINDING_2D:
227601e04c3fSmrg      return TEXTURE_2D_INDEX;
227701e04c3fSmrg   case GL_TEXTURE_BINDING_3D:
227801e04c3fSmrg      return ctx->API != API_OPENGLES ? TEXTURE_3D_INDEX : -1;
227901e04c3fSmrg   case GL_TEXTURE_BINDING_CUBE_MAP:
228001e04c3fSmrg      return ctx->Extensions.ARB_texture_cube_map
228101e04c3fSmrg         ? TEXTURE_CUBE_INDEX : -1;
228201e04c3fSmrg   case GL_TEXTURE_BINDING_RECTANGLE:
228301e04c3fSmrg      return _mesa_is_desktop_gl(ctx) && ctx->Extensions.NV_texture_rectangle
228401e04c3fSmrg         ? TEXTURE_RECT_INDEX : -1;
228501e04c3fSmrg   case GL_TEXTURE_BINDING_1D_ARRAY:
228601e04c3fSmrg      return _mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_array
228701e04c3fSmrg         ? TEXTURE_1D_ARRAY_INDEX : -1;
228801e04c3fSmrg   case GL_TEXTURE_BINDING_2D_ARRAY:
228901e04c3fSmrg      return (_mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_array)
229001e04c3fSmrg         || _mesa_is_gles3(ctx)
229101e04c3fSmrg         ? TEXTURE_2D_ARRAY_INDEX : -1;
229201e04c3fSmrg   case GL_TEXTURE_BINDING_BUFFER:
229301e04c3fSmrg      return (_mesa_has_ARB_texture_buffer_object(ctx) ||
229401e04c3fSmrg              _mesa_has_OES_texture_buffer(ctx)) ?
229501e04c3fSmrg             TEXTURE_BUFFER_INDEX : -1;
229601e04c3fSmrg   case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
229701e04c3fSmrg      return _mesa_has_texture_cube_map_array(ctx)
229801e04c3fSmrg         ? TEXTURE_CUBE_ARRAY_INDEX : -1;
229901e04c3fSmrg   case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
230001e04c3fSmrg      return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample
230101e04c3fSmrg         ? TEXTURE_2D_MULTISAMPLE_INDEX : -1;
230201e04c3fSmrg   case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
230301e04c3fSmrg      return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample
230401e04c3fSmrg         ? TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX : -1;
230501e04c3fSmrg   default:
230601e04c3fSmrg      return -1;
230701e04c3fSmrg   }
230801e04c3fSmrg}
230901e04c3fSmrg
23103464ebd5Sriastradhstatic enum value_type
2311af69d88dSmrgfind_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
23123464ebd5Sriastradh{
23133464ebd5Sriastradh   GET_CURRENT_CONTEXT(ctx);
2314cdc920a0Smrg
2315cdc920a0Smrg   switch (pname) {
23163464ebd5Sriastradh
23173464ebd5Sriastradh   case GL_BLEND:
23183464ebd5Sriastradh      if (index >= ctx->Const.MaxDrawBuffers)
231901e04c3fSmrg         goto invalid_value;
23203464ebd5Sriastradh      if (!ctx->Extensions.EXT_draw_buffers2)
232101e04c3fSmrg         goto invalid_enum;
23223464ebd5Sriastradh      v->value_int = (ctx->Color.BlendEnabled >> index) & 1;
23233464ebd5Sriastradh      return TYPE_INT;
23243464ebd5Sriastradh
23253464ebd5Sriastradh   case GL_BLEND_SRC:
23263464ebd5Sriastradh      /* fall-through */
23273464ebd5Sriastradh   case GL_BLEND_SRC_RGB:
23283464ebd5Sriastradh      if (index >= ctx->Const.MaxDrawBuffers)
232901e04c3fSmrg         goto invalid_value;
23303464ebd5Sriastradh      if (!ctx->Extensions.ARB_draw_buffers_blend)
233101e04c3fSmrg         goto invalid_enum;
23323464ebd5Sriastradh      v->value_int = ctx->Color.Blend[index].SrcRGB;
23333464ebd5Sriastradh      return TYPE_INT;
23343464ebd5Sriastradh   case GL_BLEND_SRC_ALPHA:
23353464ebd5Sriastradh      if (index >= ctx->Const.MaxDrawBuffers)
233601e04c3fSmrg         goto invalid_value;
23373464ebd5Sriastradh      if (!ctx->Extensions.ARB_draw_buffers_blend)
233801e04c3fSmrg         goto invalid_enum;
23393464ebd5Sriastradh      v->value_int = ctx->Color.Blend[index].SrcA;
23403464ebd5Sriastradh      return TYPE_INT;
23413464ebd5Sriastradh   case GL_BLEND_DST:
23423464ebd5Sriastradh      /* fall-through */
23433464ebd5Sriastradh   case GL_BLEND_DST_RGB:
23443464ebd5Sriastradh      if (index >= ctx->Const.MaxDrawBuffers)
234501e04c3fSmrg         goto invalid_value;
23463464ebd5Sriastradh      if (!ctx->Extensions.ARB_draw_buffers_blend)
234701e04c3fSmrg         goto invalid_enum;
23483464ebd5Sriastradh      v->value_int = ctx->Color.Blend[index].DstRGB;
23493464ebd5Sriastradh      return TYPE_INT;
23503464ebd5Sriastradh   case GL_BLEND_DST_ALPHA:
23513464ebd5Sriastradh      if (index >= ctx->Const.MaxDrawBuffers)
235201e04c3fSmrg         goto invalid_value;
23533464ebd5Sriastradh      if (!ctx->Extensions.ARB_draw_buffers_blend)
235401e04c3fSmrg         goto invalid_enum;
23553464ebd5Sriastradh      v->value_int = ctx->Color.Blend[index].DstA;
23563464ebd5Sriastradh      return TYPE_INT;
23573464ebd5Sriastradh   case GL_BLEND_EQUATION_RGB:
23583464ebd5Sriastradh      if (index >= ctx->Const.MaxDrawBuffers)
235901e04c3fSmrg         goto invalid_value;
23603464ebd5Sriastradh      if (!ctx->Extensions.ARB_draw_buffers_blend)
236101e04c3fSmrg         goto invalid_enum;
23623464ebd5Sriastradh      v->value_int = ctx->Color.Blend[index].EquationRGB;
23633464ebd5Sriastradh      return TYPE_INT;
23643464ebd5Sriastradh   case GL_BLEND_EQUATION_ALPHA:
23653464ebd5Sriastradh      if (index >= ctx->Const.MaxDrawBuffers)
236601e04c3fSmrg         goto invalid_value;
23673464ebd5Sriastradh      if (!ctx->Extensions.ARB_draw_buffers_blend)
236801e04c3fSmrg         goto invalid_enum;
23693464ebd5Sriastradh      v->value_int = ctx->Color.Blend[index].EquationA;
23703464ebd5Sriastradh      return TYPE_INT;
23713464ebd5Sriastradh
23723464ebd5Sriastradh   case GL_COLOR_WRITEMASK:
23733464ebd5Sriastradh      if (index >= ctx->Const.MaxDrawBuffers)
237401e04c3fSmrg         goto invalid_value;
23753464ebd5Sriastradh      if (!ctx->Extensions.EXT_draw_buffers2)
237601e04c3fSmrg         goto invalid_enum;
237701e04c3fSmrg      v->value_int_4[0] = GET_COLORMASK_BIT(ctx->Color.ColorMask, index, 0);
237801e04c3fSmrg      v->value_int_4[1] = GET_COLORMASK_BIT(ctx->Color.ColorMask, index, 1);
237901e04c3fSmrg      v->value_int_4[2] = GET_COLORMASK_BIT(ctx->Color.ColorMask, index, 2);
238001e04c3fSmrg      v->value_int_4[3] = GET_COLORMASK_BIT(ctx->Color.ColorMask, index, 3);
23813464ebd5Sriastradh      return TYPE_INT_4;
23823464ebd5Sriastradh
2383af69d88dSmrg   case GL_SCISSOR_BOX:
2384af69d88dSmrg      if (index >= ctx->Const.MaxViewports)
2385af69d88dSmrg         goto invalid_value;
2386af69d88dSmrg      v->value_int_4[0] = ctx->Scissor.ScissorArray[index].X;
2387af69d88dSmrg      v->value_int_4[1] = ctx->Scissor.ScissorArray[index].Y;
2388af69d88dSmrg      v->value_int_4[2] = ctx->Scissor.ScissorArray[index].Width;
2389af69d88dSmrg      v->value_int_4[3] = ctx->Scissor.ScissorArray[index].Height;
2390af69d88dSmrg      return TYPE_INT_4;
2391af69d88dSmrg
239201e04c3fSmrg   case GL_WINDOW_RECTANGLE_EXT:
239301e04c3fSmrg      if (!ctx->Extensions.EXT_window_rectangles)
239401e04c3fSmrg         goto invalid_enum;
239501e04c3fSmrg      if (index >= ctx->Const.MaxWindowRectangles)
239601e04c3fSmrg         goto invalid_value;
239701e04c3fSmrg      v->value_int_4[0] = ctx->Scissor.WindowRects[index].X;
239801e04c3fSmrg      v->value_int_4[1] = ctx->Scissor.WindowRects[index].Y;
239901e04c3fSmrg      v->value_int_4[2] = ctx->Scissor.WindowRects[index].Width;
240001e04c3fSmrg      v->value_int_4[3] = ctx->Scissor.WindowRects[index].Height;
240101e04c3fSmrg      return TYPE_INT_4;
240201e04c3fSmrg
2403af69d88dSmrg   case GL_VIEWPORT:
2404af69d88dSmrg      if (index >= ctx->Const.MaxViewports)
2405af69d88dSmrg         goto invalid_value;
2406af69d88dSmrg      v->value_float_4[0] = ctx->ViewportArray[index].X;
2407af69d88dSmrg      v->value_float_4[1] = ctx->ViewportArray[index].Y;
2408af69d88dSmrg      v->value_float_4[2] = ctx->ViewportArray[index].Width;
2409af69d88dSmrg      v->value_float_4[3] = ctx->ViewportArray[index].Height;
2410af69d88dSmrg      return TYPE_FLOAT_4;
2411af69d88dSmrg
2412af69d88dSmrg   case GL_DEPTH_RANGE:
2413af69d88dSmrg      if (index >= ctx->Const.MaxViewports)
2414af69d88dSmrg         goto invalid_value;
2415af69d88dSmrg      v->value_double_2[0] = ctx->ViewportArray[index].Near;
2416af69d88dSmrg      v->value_double_2[1] = ctx->ViewportArray[index].Far;
2417af69d88dSmrg      return TYPE_DOUBLEN_2;
2418af69d88dSmrg
24193464ebd5Sriastradh   case GL_TRANSFORM_FEEDBACK_BUFFER_START:
2420af69d88dSmrg      if (index >= ctx->Const.MaxTransformFeedbackBuffers)
242101e04c3fSmrg         goto invalid_value;
24223464ebd5Sriastradh      if (!ctx->Extensions.EXT_transform_feedback)
242301e04c3fSmrg         goto invalid_enum;
24243464ebd5Sriastradh      v->value_int64 = ctx->TransformFeedback.CurrentObject->Offset[index];
24253464ebd5Sriastradh      return TYPE_INT64;
24263464ebd5Sriastradh
24273464ebd5Sriastradh   case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
2428af69d88dSmrg      if (index >= ctx->Const.MaxTransformFeedbackBuffers)
242901e04c3fSmrg         goto invalid_value;
24303464ebd5Sriastradh      if (!ctx->Extensions.EXT_transform_feedback)
243101e04c3fSmrg         goto invalid_enum;
2432af69d88dSmrg      v->value_int64
2433af69d88dSmrg         = ctx->TransformFeedback.CurrentObject->RequestedSize[index];
24343464ebd5Sriastradh      return TYPE_INT64;
24353464ebd5Sriastradh
24363464ebd5Sriastradh   case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
2437af69d88dSmrg      if (index >= ctx->Const.MaxTransformFeedbackBuffers)
243801e04c3fSmrg         goto invalid_value;
24393464ebd5Sriastradh      if (!ctx->Extensions.EXT_transform_feedback)
244001e04c3fSmrg         goto invalid_enum;
2441af69d88dSmrg      v->value_int = ctx->TransformFeedback.CurrentObject->BufferNames[index];
2442af69d88dSmrg      return TYPE_INT;
2443af69d88dSmrg
2444af69d88dSmrg   case GL_UNIFORM_BUFFER_BINDING:
2445af69d88dSmrg      if (index >= ctx->Const.MaxUniformBufferBindings)
244601e04c3fSmrg         goto invalid_value;
2447af69d88dSmrg      if (!ctx->Extensions.ARB_uniform_buffer_object)
244801e04c3fSmrg         goto invalid_enum;
2449af69d88dSmrg      v->value_int = ctx->UniformBufferBindings[index].BufferObject->Name;
2450af69d88dSmrg      return TYPE_INT;
2451af69d88dSmrg
2452af69d88dSmrg   case GL_UNIFORM_BUFFER_START:
2453af69d88dSmrg      if (index >= ctx->Const.MaxUniformBufferBindings)
245401e04c3fSmrg         goto invalid_value;
2455af69d88dSmrg      if (!ctx->Extensions.ARB_uniform_buffer_object)
245601e04c3fSmrg         goto invalid_enum;
245701e04c3fSmrg      v->value_int = ctx->UniformBufferBindings[index].Offset < 0 ? 0 :
245801e04c3fSmrg                     ctx->UniformBufferBindings[index].Offset;
2459af69d88dSmrg      return TYPE_INT;
2460af69d88dSmrg
2461af69d88dSmrg   case GL_UNIFORM_BUFFER_SIZE:
2462af69d88dSmrg      if (index >= ctx->Const.MaxUniformBufferBindings)
246301e04c3fSmrg         goto invalid_value;
2464af69d88dSmrg      if (!ctx->Extensions.ARB_uniform_buffer_object)
246501e04c3fSmrg         goto invalid_enum;
246601e04c3fSmrg      v->value_int = ctx->UniformBufferBindings[index].Size < 0 ? 0 :
246701e04c3fSmrg                     ctx->UniformBufferBindings[index].Size;
246801e04c3fSmrg      return TYPE_INT;
246901e04c3fSmrg
247001e04c3fSmrg   /* ARB_shader_storage_buffer_object */
247101e04c3fSmrg   case GL_SHADER_STORAGE_BUFFER_BINDING:
247201e04c3fSmrg      if (!ctx->Extensions.ARB_shader_storage_buffer_object)
247301e04c3fSmrg         goto invalid_enum;
247401e04c3fSmrg      if (index >= ctx->Const.MaxShaderStorageBufferBindings)
247501e04c3fSmrg         goto invalid_value;
247601e04c3fSmrg      v->value_int = ctx->ShaderStorageBufferBindings[index].BufferObject->Name;
247701e04c3fSmrg      return TYPE_INT;
247801e04c3fSmrg
247901e04c3fSmrg   case GL_SHADER_STORAGE_BUFFER_START:
248001e04c3fSmrg      if (!ctx->Extensions.ARB_shader_storage_buffer_object)
248101e04c3fSmrg         goto invalid_enum;
248201e04c3fSmrg      if (index >= ctx->Const.MaxShaderStorageBufferBindings)
248301e04c3fSmrg         goto invalid_value;
248401e04c3fSmrg      v->value_int = ctx->ShaderStorageBufferBindings[index].Offset < 0 ? 0 :
248501e04c3fSmrg                     ctx->ShaderStorageBufferBindings[index].Offset;
248601e04c3fSmrg      return TYPE_INT;
248701e04c3fSmrg
248801e04c3fSmrg   case GL_SHADER_STORAGE_BUFFER_SIZE:
248901e04c3fSmrg      if (!ctx->Extensions.ARB_shader_storage_buffer_object)
249001e04c3fSmrg         goto invalid_enum;
249101e04c3fSmrg      if (index >= ctx->Const.MaxShaderStorageBufferBindings)
249201e04c3fSmrg         goto invalid_value;
249301e04c3fSmrg      v->value_int = ctx->ShaderStorageBufferBindings[index].Size < 0 ? 0 :
249401e04c3fSmrg                     ctx->ShaderStorageBufferBindings[index].Size;
2495af69d88dSmrg      return TYPE_INT;
2496af69d88dSmrg
2497af69d88dSmrg   /* ARB_texture_multisample / GL3.2 */
2498af69d88dSmrg   case GL_SAMPLE_MASK_VALUE:
2499af69d88dSmrg      if (index != 0)
2500af69d88dSmrg         goto invalid_value;
2501af69d88dSmrg      if (!ctx->Extensions.ARB_texture_multisample)
2502af69d88dSmrg         goto invalid_enum;
2503af69d88dSmrg      v->value_int = ctx->Multisample.SampleMaskValue;
2504af69d88dSmrg      return TYPE_INT;
2505af69d88dSmrg
2506af69d88dSmrg   case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2507af69d88dSmrg      if (!ctx->Extensions.ARB_shader_atomic_counters)
2508af69d88dSmrg         goto invalid_enum;
2509af69d88dSmrg      if (index >= ctx->Const.MaxAtomicBufferBindings)
2510af69d88dSmrg         goto invalid_value;
2511af69d88dSmrg      v->value_int = ctx->AtomicBufferBindings[index].BufferObject->Name;
2512af69d88dSmrg      return TYPE_INT;
2513af69d88dSmrg
2514af69d88dSmrg   case GL_ATOMIC_COUNTER_BUFFER_START:
2515af69d88dSmrg      if (!ctx->Extensions.ARB_shader_atomic_counters)
2516af69d88dSmrg         goto invalid_enum;
2517af69d88dSmrg      if (index >= ctx->Const.MaxAtomicBufferBindings)
2518af69d88dSmrg         goto invalid_value;
251901e04c3fSmrg      v->value_int64 = ctx->AtomicBufferBindings[index].Offset < 0 ? 0 :
252001e04c3fSmrg                       ctx->AtomicBufferBindings[index].Offset;
2521af69d88dSmrg      return TYPE_INT64;
2522af69d88dSmrg
2523af69d88dSmrg   case GL_ATOMIC_COUNTER_BUFFER_SIZE:
2524af69d88dSmrg      if (!ctx->Extensions.ARB_shader_atomic_counters)
2525af69d88dSmrg         goto invalid_enum;
2526af69d88dSmrg      if (index >= ctx->Const.MaxAtomicBufferBindings)
2527af69d88dSmrg         goto invalid_value;
252801e04c3fSmrg      v->value_int64 = ctx->AtomicBufferBindings[index].Size < 0 ? 0 :
252901e04c3fSmrg                       ctx->AtomicBufferBindings[index].Size;
2530af69d88dSmrg      return TYPE_INT64;
2531af69d88dSmrg
2532af69d88dSmrg   case GL_VERTEX_BINDING_DIVISOR:
253301e04c3fSmrg      if ((!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_instanced_arrays) &&
253401e04c3fSmrg          !_mesa_is_gles31(ctx))
2535af69d88dSmrg          goto invalid_enum;
2536af69d88dSmrg      if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs)
2537af69d88dSmrg          goto invalid_value;
253801e04c3fSmrg      v->value_int = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_GENERIC(index)].InstanceDivisor;
2539af69d88dSmrg      return TYPE_INT;
2540af69d88dSmrg
2541af69d88dSmrg   case GL_VERTEX_BINDING_OFFSET:
254201e04c3fSmrg      if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles31(ctx))
2543af69d88dSmrg          goto invalid_enum;
2544af69d88dSmrg      if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs)
2545af69d88dSmrg          goto invalid_value;
254601e04c3fSmrg      v->value_int = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_GENERIC(index)].Offset;
2547af69d88dSmrg      return TYPE_INT;
2548af69d88dSmrg
2549af69d88dSmrg   case GL_VERTEX_BINDING_STRIDE:
255001e04c3fSmrg      if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles31(ctx))
2551af69d88dSmrg          goto invalid_enum;
2552af69d88dSmrg      if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs)
2553af69d88dSmrg          goto invalid_value;
255401e04c3fSmrg      v->value_int = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_GENERIC(index)].Stride;
255501e04c3fSmrg      return TYPE_INT;
255601e04c3fSmrg
255701e04c3fSmrg   case GL_VERTEX_BINDING_BUFFER:
255801e04c3fSmrg      if (ctx->API == API_OPENGLES2 && ctx->Version < 31)
255901e04c3fSmrg         goto invalid_enum;
256001e04c3fSmrg      if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs)
256101e04c3fSmrg         goto invalid_value;
256201e04c3fSmrg      v->value_int = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_GENERIC(index)].BufferObj->Name;
256301e04c3fSmrg      return TYPE_INT;
2564af69d88dSmrg
2565af69d88dSmrg   /* ARB_shader_image_load_store */
2566af69d88dSmrg   case GL_IMAGE_BINDING_NAME: {
2567af69d88dSmrg      struct gl_texture_object *t;
2568af69d88dSmrg
2569af69d88dSmrg      if (!ctx->Extensions.ARB_shader_image_load_store)
2570af69d88dSmrg         goto invalid_enum;
2571af69d88dSmrg      if (index >= ctx->Const.MaxImageUnits)
2572af69d88dSmrg         goto invalid_value;
2573af69d88dSmrg
2574af69d88dSmrg      t = ctx->ImageUnits[index].TexObj;
2575af69d88dSmrg      v->value_int = (t ? t->Name : 0);
2576af69d88dSmrg      return TYPE_INT;
2577af69d88dSmrg   }
2578af69d88dSmrg
2579af69d88dSmrg   case GL_IMAGE_BINDING_LEVEL:
2580af69d88dSmrg      if (!ctx->Extensions.ARB_shader_image_load_store)
2581af69d88dSmrg         goto invalid_enum;
2582af69d88dSmrg      if (index >= ctx->Const.MaxImageUnits)
2583af69d88dSmrg         goto invalid_value;
2584af69d88dSmrg
2585af69d88dSmrg      v->value_int = ctx->ImageUnits[index].Level;
2586af69d88dSmrg      return TYPE_INT;
2587af69d88dSmrg
2588af69d88dSmrg   case GL_IMAGE_BINDING_LAYERED:
2589af69d88dSmrg      if (!ctx->Extensions.ARB_shader_image_load_store)
2590af69d88dSmrg         goto invalid_enum;
2591af69d88dSmrg      if (index >= ctx->Const.MaxImageUnits)
2592af69d88dSmrg         goto invalid_value;
2593af69d88dSmrg
2594af69d88dSmrg      v->value_int = ctx->ImageUnits[index].Layered;
2595af69d88dSmrg      return TYPE_INT;
2596af69d88dSmrg
2597af69d88dSmrg   case GL_IMAGE_BINDING_LAYER:
2598af69d88dSmrg      if (!ctx->Extensions.ARB_shader_image_load_store)
2599af69d88dSmrg         goto invalid_enum;
2600af69d88dSmrg      if (index >= ctx->Const.MaxImageUnits)
2601af69d88dSmrg         goto invalid_value;
2602af69d88dSmrg
2603af69d88dSmrg      v->value_int = ctx->ImageUnits[index].Layer;
2604af69d88dSmrg      return TYPE_INT;
2605af69d88dSmrg
2606af69d88dSmrg   case GL_IMAGE_BINDING_ACCESS:
2607af69d88dSmrg      if (!ctx->Extensions.ARB_shader_image_load_store)
2608af69d88dSmrg         goto invalid_enum;
2609af69d88dSmrg      if (index >= ctx->Const.MaxImageUnits)
2610af69d88dSmrg         goto invalid_value;
2611af69d88dSmrg
2612af69d88dSmrg      v->value_int = ctx->ImageUnits[index].Access;
2613af69d88dSmrg      return TYPE_INT;
2614af69d88dSmrg
2615af69d88dSmrg   case GL_IMAGE_BINDING_FORMAT:
2616af69d88dSmrg      if (!ctx->Extensions.ARB_shader_image_load_store)
2617af69d88dSmrg         goto invalid_enum;
2618af69d88dSmrg      if (index >= ctx->Const.MaxImageUnits)
2619af69d88dSmrg         goto invalid_value;
2620af69d88dSmrg
2621af69d88dSmrg      v->value_int = ctx->ImageUnits[index].Format;
2622af69d88dSmrg      return TYPE_INT;
2623af69d88dSmrg
262401e04c3fSmrg   /* ARB_direct_state_access */
262501e04c3fSmrg   case GL_TEXTURE_BINDING_1D:
262601e04c3fSmrg   case GL_TEXTURE_BINDING_1D_ARRAY:
262701e04c3fSmrg   case GL_TEXTURE_BINDING_2D:
262801e04c3fSmrg   case GL_TEXTURE_BINDING_2D_ARRAY:
262901e04c3fSmrg   case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
263001e04c3fSmrg   case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
263101e04c3fSmrg   case GL_TEXTURE_BINDING_3D:
263201e04c3fSmrg   case GL_TEXTURE_BINDING_BUFFER:
263301e04c3fSmrg   case GL_TEXTURE_BINDING_CUBE_MAP:
263401e04c3fSmrg   case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
263501e04c3fSmrg   case GL_TEXTURE_BINDING_RECTANGLE: {
263601e04c3fSmrg      int target;
263701e04c3fSmrg
263801e04c3fSmrg      if (ctx->API != API_OPENGL_CORE)
263901e04c3fSmrg         goto invalid_enum;
264001e04c3fSmrg      target = tex_binding_to_index(ctx, pname);
264101e04c3fSmrg      if (target < 0)
264201e04c3fSmrg         goto invalid_enum;
264301e04c3fSmrg      if (index >= _mesa_max_tex_unit(ctx))
264401e04c3fSmrg         goto invalid_value;
264501e04c3fSmrg
264601e04c3fSmrg      v->value_int = ctx->Texture.Unit[index].CurrentTex[target]->Name;
264701e04c3fSmrg      return TYPE_INT;
264801e04c3fSmrg   }
264901e04c3fSmrg
265001e04c3fSmrg   case GL_SAMPLER_BINDING: {
265101e04c3fSmrg      struct gl_sampler_object *samp;
265201e04c3fSmrg
265301e04c3fSmrg      if (!_mesa_is_desktop_gl(ctx) || ctx->Version < 33)
265401e04c3fSmrg         goto invalid_enum;
265501e04c3fSmrg      if (index >= _mesa_max_tex_unit(ctx))
265601e04c3fSmrg         goto invalid_value;
265701e04c3fSmrg
265801e04c3fSmrg      samp = ctx->Texture.Unit[index].Sampler;
265901e04c3fSmrg      v->value_int = samp ? samp->Name : 0;
266001e04c3fSmrg      return TYPE_INT;
266101e04c3fSmrg   }
266201e04c3fSmrg
2663af69d88dSmrg   case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
266401e04c3fSmrg      if (!_mesa_has_compute_shaders(ctx))
2665af69d88dSmrg         goto invalid_enum;
2666af69d88dSmrg      if (index >= 3)
2667af69d88dSmrg         goto invalid_value;
2668af69d88dSmrg      v->value_int = ctx->Const.MaxComputeWorkGroupCount[index];
2669af69d88dSmrg      return TYPE_INT;
2670af69d88dSmrg
2671af69d88dSmrg   case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
267201e04c3fSmrg      if (!_mesa_has_compute_shaders(ctx))
2673af69d88dSmrg         goto invalid_enum;
2674af69d88dSmrg      if (index >= 3)
2675af69d88dSmrg         goto invalid_value;
2676af69d88dSmrg      v->value_int = ctx->Const.MaxComputeWorkGroupSize[index];
26773464ebd5Sriastradh      return TYPE_INT;
267801e04c3fSmrg
267901e04c3fSmrg   /* ARB_compute_variable_group_size */
268001e04c3fSmrg   case GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB:
268101e04c3fSmrg      if (!ctx->Extensions.ARB_compute_variable_group_size)
268201e04c3fSmrg         goto invalid_enum;
268301e04c3fSmrg      if (index >= 3)
268401e04c3fSmrg         goto invalid_value;
268501e04c3fSmrg      v->value_int = ctx->Const.MaxComputeVariableGroupSize[index];
268601e04c3fSmrg      return TYPE_INT;
268701e04c3fSmrg
268801e04c3fSmrg   /* GL_EXT_external_objects */
268901e04c3fSmrg   case GL_NUM_DEVICE_UUIDS_EXT:
269001e04c3fSmrg      v->value_int = 1;
269101e04c3fSmrg      return TYPE_INT;
269201e04c3fSmrg   case GL_DRIVER_UUID_EXT:
269301e04c3fSmrg      if (index >= 1)
269401e04c3fSmrg         goto invalid_value;
269501e04c3fSmrg      _mesa_get_driver_uuid(ctx, v->value_int_4);
269601e04c3fSmrg      return TYPE_INT_4;
269701e04c3fSmrg   case GL_DEVICE_UUID_EXT:
269801e04c3fSmrg      if (index >= 1)
269901e04c3fSmrg         goto invalid_value;
270001e04c3fSmrg      _mesa_get_device_uuid(ctx, v->value_int_4);
270101e04c3fSmrg      return TYPE_INT_4;
27023464ebd5Sriastradh   }
27033464ebd5Sriastradh
27043464ebd5Sriastradh invalid_enum:
27053464ebd5Sriastradh   _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)", func,
270601e04c3fSmrg               _mesa_enum_to_string(pname));
27073464ebd5Sriastradh   return TYPE_INVALID;
27083464ebd5Sriastradh invalid_value:
27093464ebd5Sriastradh   _mesa_error(ctx, GL_INVALID_VALUE, "%s(pname=%s)", func,
271001e04c3fSmrg               _mesa_enum_to_string(pname));
27113464ebd5Sriastradh   return TYPE_INVALID;
27123464ebd5Sriastradh}
27133464ebd5Sriastradh
27143464ebd5Sriastradhvoid GLAPIENTRY
2715af69d88dSmrg_mesa_GetBooleani_v( GLenum pname, GLuint index, GLboolean *params )
27163464ebd5Sriastradh{
27173464ebd5Sriastradh   union value v;
27183464ebd5Sriastradh   enum value_type type =
2719af69d88dSmrg      find_value_indexed("glGetBooleani_v", pname, index, &v);
27203464ebd5Sriastradh
27213464ebd5Sriastradh   switch (type) {
27223464ebd5Sriastradh   case TYPE_INT:
272301e04c3fSmrg   case TYPE_UINT:
27243464ebd5Sriastradh      params[0] = INT_TO_BOOLEAN(v.value_int);
27253464ebd5Sriastradh      break;
27263464ebd5Sriastradh   case TYPE_INT_4:
272701e04c3fSmrg   case TYPE_UINT_4:
27283464ebd5Sriastradh      params[0] = INT_TO_BOOLEAN(v.value_int_4[0]);
27293464ebd5Sriastradh      params[1] = INT_TO_BOOLEAN(v.value_int_4[1]);
27303464ebd5Sriastradh      params[2] = INT_TO_BOOLEAN(v.value_int_4[2]);
27313464ebd5Sriastradh      params[3] = INT_TO_BOOLEAN(v.value_int_4[3]);
27323464ebd5Sriastradh      break;
27333464ebd5Sriastradh   case TYPE_INT64:
2734af69d88dSmrg      params[0] = INT64_TO_BOOLEAN(v.value_int64);
27353464ebd5Sriastradh      break;
27363464ebd5Sriastradh   default:
27373464ebd5Sriastradh      ; /* nothing - GL error was recorded */
27383464ebd5Sriastradh   }
27393464ebd5Sriastradh}
27403464ebd5Sriastradh
27413464ebd5Sriastradhvoid GLAPIENTRY
2742af69d88dSmrg_mesa_GetIntegeri_v( GLenum pname, GLuint index, GLint *params )
27433464ebd5Sriastradh{
27443464ebd5Sriastradh   union value v;
27453464ebd5Sriastradh   enum value_type type =
2746af69d88dSmrg      find_value_indexed("glGetIntegeri_v", pname, index, &v);
27473464ebd5Sriastradh
27483464ebd5Sriastradh   switch (type) {
2749af69d88dSmrg   case TYPE_FLOAT_4:
2750af69d88dSmrg   case TYPE_FLOATN_4:
2751af69d88dSmrg      params[3] = IROUND(v.value_float_4[3]);
2752af69d88dSmrg   case TYPE_FLOAT_3:
2753af69d88dSmrg   case TYPE_FLOATN_3:
2754af69d88dSmrg      params[2] = IROUND(v.value_float_4[2]);
2755af69d88dSmrg   case TYPE_FLOAT_2:
2756af69d88dSmrg   case TYPE_FLOATN_2:
2757af69d88dSmrg      params[1] = IROUND(v.value_float_4[1]);
2758af69d88dSmrg   case TYPE_FLOAT:
2759af69d88dSmrg   case TYPE_FLOATN:
2760af69d88dSmrg      params[0] = IROUND(v.value_float_4[0]);
2761af69d88dSmrg      break;
2762af69d88dSmrg
2763af69d88dSmrg   case TYPE_DOUBLEN_2:
2764af69d88dSmrg      params[1] = IROUND(v.value_double_2[1]);
2765af69d88dSmrg   case TYPE_DOUBLEN:
2766af69d88dSmrg      params[0] = IROUND(v.value_double_2[0]);
2767af69d88dSmrg      break;
2768af69d88dSmrg
27693464ebd5Sriastradh   case TYPE_INT:
277001e04c3fSmrg   case TYPE_UINT:
27713464ebd5Sriastradh      params[0] = v.value_int;
27723464ebd5Sriastradh      break;
27733464ebd5Sriastradh   case TYPE_INT_4:
277401e04c3fSmrg   case TYPE_UINT_4:
27753464ebd5Sriastradh      params[0] = v.value_int_4[0];
27763464ebd5Sriastradh      params[1] = v.value_int_4[1];
27773464ebd5Sriastradh      params[2] = v.value_int_4[2];
27783464ebd5Sriastradh      params[3] = v.value_int_4[3];
27793464ebd5Sriastradh      break;
27803464ebd5Sriastradh   case TYPE_INT64:
2781af69d88dSmrg      params[0] = INT64_TO_INT(v.value_int64);
27823464ebd5Sriastradh      break;
27833464ebd5Sriastradh   default:
27843464ebd5Sriastradh      ; /* nothing - GL error was recorded */
27853464ebd5Sriastradh   }
27863464ebd5Sriastradh}
27873464ebd5Sriastradh
27883464ebd5Sriastradhvoid GLAPIENTRY
2789af69d88dSmrg_mesa_GetInteger64i_v( GLenum pname, GLuint index, GLint64 *params )
27903464ebd5Sriastradh{
27913464ebd5Sriastradh   union value v;
27923464ebd5Sriastradh   enum value_type type =
2793af69d88dSmrg      find_value_indexed("glGetInteger64i_v", pname, index, &v);
27943464ebd5Sriastradh
27953464ebd5Sriastradh   switch (type) {
27963464ebd5Sriastradh   case TYPE_INT:
27973464ebd5Sriastradh      params[0] = v.value_int;
27983464ebd5Sriastradh      break;
27993464ebd5Sriastradh   case TYPE_INT_4:
28003464ebd5Sriastradh      params[0] = v.value_int_4[0];
28013464ebd5Sriastradh      params[1] = v.value_int_4[1];
28023464ebd5Sriastradh      params[2] = v.value_int_4[2];
28033464ebd5Sriastradh      params[3] = v.value_int_4[3];
28043464ebd5Sriastradh      break;
280501e04c3fSmrg   case TYPE_UINT:
280601e04c3fSmrg      params[0] = (GLuint) v.value_int;
280701e04c3fSmrg      break;
280801e04c3fSmrg   case TYPE_UINT_4:
280901e04c3fSmrg      params[0] = (GLuint) v.value_int_4[0];
281001e04c3fSmrg      params[1] = (GLuint) v.value_int_4[1];
281101e04c3fSmrg      params[2] = (GLuint) v.value_int_4[2];
281201e04c3fSmrg      params[3] = (GLuint) v.value_int_4[3];
281301e04c3fSmrg      break;
28143464ebd5Sriastradh   case TYPE_INT64:
2815af69d88dSmrg      params[0] = v.value_int64;
28163464ebd5Sriastradh      break;
28173464ebd5Sriastradh   default:
28183464ebd5Sriastradh      ; /* nothing - GL error was recorded */
2819cdc920a0Smrg   }
2820cdc920a0Smrg}
2821cdc920a0Smrg
2822af69d88dSmrgvoid GLAPIENTRY
2823af69d88dSmrg_mesa_GetFloati_v(GLenum pname, GLuint index, GLfloat *params)
2824af69d88dSmrg{
2825af69d88dSmrg   int i;
2826af69d88dSmrg   GLmatrix *m;
2827af69d88dSmrg   union value v;
2828af69d88dSmrg   enum value_type type =
2829af69d88dSmrg      find_value_indexed("glGetFloati_v", pname, index, &v);
2830af69d88dSmrg
2831af69d88dSmrg   switch (type) {
2832af69d88dSmrg   case TYPE_FLOAT_4:
2833af69d88dSmrg   case TYPE_FLOATN_4:
2834af69d88dSmrg      params[3] = v.value_float_4[3];
2835af69d88dSmrg   case TYPE_FLOAT_3:
2836af69d88dSmrg   case TYPE_FLOATN_3:
2837af69d88dSmrg      params[2] = v.value_float_4[2];
2838af69d88dSmrg   case TYPE_FLOAT_2:
2839af69d88dSmrg   case TYPE_FLOATN_2:
2840af69d88dSmrg      params[1] = v.value_float_4[1];
2841af69d88dSmrg   case TYPE_FLOAT:
2842af69d88dSmrg   case TYPE_FLOATN:
2843af69d88dSmrg      params[0] = v.value_float_4[0];
2844af69d88dSmrg      break;
2845af69d88dSmrg
2846af69d88dSmrg   case TYPE_DOUBLEN_2:
2847af69d88dSmrg      params[1] = (GLfloat) v.value_double_2[1];
2848af69d88dSmrg   case TYPE_DOUBLEN:
2849af69d88dSmrg      params[0] = (GLfloat) v.value_double_2[0];
2850af69d88dSmrg      break;
2851af69d88dSmrg
2852af69d88dSmrg   case TYPE_INT_4:
2853af69d88dSmrg      params[3] = (GLfloat) v.value_int_4[3];
2854af69d88dSmrg   case TYPE_INT_3:
2855af69d88dSmrg      params[2] = (GLfloat) v.value_int_4[2];
2856af69d88dSmrg   case TYPE_INT_2:
2857af69d88dSmrg   case TYPE_ENUM_2:
2858af69d88dSmrg      params[1] = (GLfloat) v.value_int_4[1];
2859af69d88dSmrg   case TYPE_INT:
2860af69d88dSmrg   case TYPE_ENUM:
286101e04c3fSmrg   case TYPE_ENUM16:
2862af69d88dSmrg      params[0] = (GLfloat) v.value_int_4[0];
2863af69d88dSmrg      break;
2864af69d88dSmrg
2865af69d88dSmrg   case TYPE_INT_N:
2866af69d88dSmrg      for (i = 0; i < v.value_int_n.n; i++)
286701e04c3fSmrg         params[i] = (GLfloat) v.value_int_n.ints[i];
286801e04c3fSmrg      break;
286901e04c3fSmrg
287001e04c3fSmrg   case TYPE_UINT_4:
287101e04c3fSmrg      params[3] = (GLfloat) ((GLuint) v.value_int_4[3]);
287201e04c3fSmrg   case TYPE_UINT_3:
287301e04c3fSmrg      params[2] = (GLfloat) ((GLuint) v.value_int_4[2]);
287401e04c3fSmrg   case TYPE_UINT_2:
287501e04c3fSmrg      params[1] = (GLfloat) ((GLuint) v.value_int_4[1]);
287601e04c3fSmrg   case TYPE_UINT:
287701e04c3fSmrg      params[0] = (GLfloat) ((GLuint) v.value_int_4[0]);
2878af69d88dSmrg      break;
2879af69d88dSmrg
2880af69d88dSmrg   case TYPE_INT64:
2881af69d88dSmrg      params[0] = (GLfloat) v.value_int64;
2882af69d88dSmrg      break;
2883af69d88dSmrg
2884af69d88dSmrg   case TYPE_BOOLEAN:
2885af69d88dSmrg      params[0] = BOOLEAN_TO_FLOAT(v.value_bool);
2886af69d88dSmrg      break;
2887af69d88dSmrg
288801e04c3fSmrg   case TYPE_UBYTE:
288901e04c3fSmrg      params[0] = (GLfloat) v.value_ubyte;
289001e04c3fSmrg      break;
289101e04c3fSmrg
289201e04c3fSmrg   case TYPE_SHORT:
289301e04c3fSmrg      params[0] = (GLfloat) v.value_short;
289401e04c3fSmrg      break;
289501e04c3fSmrg
2896af69d88dSmrg   case TYPE_MATRIX:
2897af69d88dSmrg      m = *(GLmatrix **) &v;
2898af69d88dSmrg      for (i = 0; i < 16; i++)
289901e04c3fSmrg         params[i] = m->m[i];
2900af69d88dSmrg      break;
2901af69d88dSmrg
2902af69d88dSmrg   case TYPE_MATRIX_T:
2903af69d88dSmrg      m = *(GLmatrix **) &v;
2904af69d88dSmrg      for (i = 0; i < 16; i++)
290501e04c3fSmrg         params[i] = m->m[transpose[i]];
2906af69d88dSmrg      break;
2907af69d88dSmrg
2908af69d88dSmrg   default:
2909af69d88dSmrg      ;
2910af69d88dSmrg   }
2911af69d88dSmrg}
2912af69d88dSmrg
2913af69d88dSmrgvoid GLAPIENTRY
2914af69d88dSmrg_mesa_GetDoublei_v(GLenum pname, GLuint index, GLdouble *params)
2915af69d88dSmrg{
2916af69d88dSmrg   int i;
2917af69d88dSmrg   GLmatrix *m;
2918af69d88dSmrg   union value v;
2919af69d88dSmrg   enum value_type type =
2920af69d88dSmrg      find_value_indexed("glGetDoublei_v", pname, index, &v);
2921af69d88dSmrg
2922af69d88dSmrg   switch (type) {
2923af69d88dSmrg   case TYPE_FLOAT_4:
2924af69d88dSmrg   case TYPE_FLOATN_4:
2925af69d88dSmrg      params[3] = (GLdouble) v.value_float_4[3];
2926af69d88dSmrg   case TYPE_FLOAT_3:
2927af69d88dSmrg   case TYPE_FLOATN_3:
2928af69d88dSmrg      params[2] = (GLdouble) v.value_float_4[2];
2929af69d88dSmrg   case TYPE_FLOAT_2:
2930af69d88dSmrg   case TYPE_FLOATN_2:
2931af69d88dSmrg      params[1] = (GLdouble) v.value_float_4[1];
2932af69d88dSmrg   case TYPE_FLOAT:
2933af69d88dSmrg   case TYPE_FLOATN:
2934af69d88dSmrg      params[0] = (GLdouble) v.value_float_4[0];
2935af69d88dSmrg      break;
2936af69d88dSmrg
2937af69d88dSmrg   case TYPE_DOUBLEN_2:
2938af69d88dSmrg      params[1] = v.value_double_2[1];
2939af69d88dSmrg   case TYPE_DOUBLEN:
2940af69d88dSmrg      params[0] = v.value_double_2[0];
2941af69d88dSmrg      break;
2942af69d88dSmrg
2943af69d88dSmrg   case TYPE_INT_4:
2944af69d88dSmrg      params[3] = (GLdouble) v.value_int_4[3];
2945af69d88dSmrg   case TYPE_INT_3:
2946af69d88dSmrg      params[2] = (GLdouble) v.value_int_4[2];
2947af69d88dSmrg   case TYPE_INT_2:
2948af69d88dSmrg   case TYPE_ENUM_2:
2949af69d88dSmrg      params[1] = (GLdouble) v.value_int_4[1];
2950af69d88dSmrg   case TYPE_INT:
2951af69d88dSmrg   case TYPE_ENUM:
295201e04c3fSmrg   case TYPE_ENUM16:
2953af69d88dSmrg      params[0] = (GLdouble) v.value_int_4[0];
2954af69d88dSmrg      break;
2955af69d88dSmrg
2956af69d88dSmrg   case TYPE_INT_N:
2957af69d88dSmrg      for (i = 0; i < v.value_int_n.n; i++)
295801e04c3fSmrg         params[i] = (GLdouble) v.value_int_n.ints[i];
295901e04c3fSmrg      break;
296001e04c3fSmrg
296101e04c3fSmrg   case TYPE_UINT_4:
296201e04c3fSmrg      params[3] = (GLdouble) ((GLuint) v.value_int_4[3]);
296301e04c3fSmrg   case TYPE_UINT_3:
296401e04c3fSmrg      params[2] = (GLdouble) ((GLuint) v.value_int_4[2]);
296501e04c3fSmrg   case TYPE_UINT_2:
296601e04c3fSmrg      params[1] = (GLdouble) ((GLuint) v.value_int_4[1]);
296701e04c3fSmrg   case TYPE_UINT:
296801e04c3fSmrg      params[0] = (GLdouble) ((GLuint) v.value_int_4[0]);
2969af69d88dSmrg      break;
2970af69d88dSmrg
2971af69d88dSmrg   case TYPE_INT64:
2972af69d88dSmrg      params[0] = (GLdouble) v.value_int64;
2973af69d88dSmrg      break;
2974af69d88dSmrg
2975af69d88dSmrg   case TYPE_BOOLEAN:
2976af69d88dSmrg      params[0] = (GLdouble) BOOLEAN_TO_FLOAT(v.value_bool);
2977af69d88dSmrg      break;
2978af69d88dSmrg
297901e04c3fSmrg   case TYPE_UBYTE:
298001e04c3fSmrg      params[0] = (GLdouble) v.value_ubyte;
298101e04c3fSmrg      break;
298201e04c3fSmrg
298301e04c3fSmrg   case TYPE_SHORT:
298401e04c3fSmrg      params[0] = (GLdouble) v.value_short;
298501e04c3fSmrg      break;
298601e04c3fSmrg
2987af69d88dSmrg   case TYPE_MATRIX:
2988af69d88dSmrg      m = *(GLmatrix **) &v;
2989af69d88dSmrg      for (i = 0; i < 16; i++)
299001e04c3fSmrg         params[i] = (GLdouble) m->m[i];
2991af69d88dSmrg      break;
2992af69d88dSmrg
2993af69d88dSmrg   case TYPE_MATRIX_T:
2994af69d88dSmrg      m = *(GLmatrix **) &v;
2995af69d88dSmrg      for (i = 0; i < 16; i++)
299601e04c3fSmrg         params[i] = (GLdouble) m->m[transpose[i]];
2997af69d88dSmrg      break;
2998af69d88dSmrg
2999af69d88dSmrg   default:
3000af69d88dSmrg      ;
3001af69d88dSmrg   }
3002af69d88dSmrg}
3003af69d88dSmrg
300401e04c3fSmrgvoid GLAPIENTRY
300501e04c3fSmrg_mesa_GetUnsignedBytei_vEXT(GLenum target, GLuint index, GLubyte *data)
300601e04c3fSmrg{
300701e04c3fSmrg   GLsizei size;
300801e04c3fSmrg   union value v;
300901e04c3fSmrg   enum value_type type;
301001e04c3fSmrg   const char *func = "glGetUnsignedBytei_vEXT";
301101e04c3fSmrg
301201e04c3fSmrg   GET_CURRENT_CONTEXT(ctx);
301301e04c3fSmrg
301401e04c3fSmrg   if (!ctx->Extensions.EXT_memory_object) {
301501e04c3fSmrg      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
301601e04c3fSmrg      return;
301701e04c3fSmrg   }
301801e04c3fSmrg
301901e04c3fSmrg   type = find_value_indexed(func, target, index, &v);
302001e04c3fSmrg   size = get_value_size(type, &v);
302101e04c3fSmrg   if (size <= 0) {
302201e04c3fSmrg      _mesa_problem(ctx, "invalid value type in GetUnsignedBytei_vEXT()");
302301e04c3fSmrg   }
302401e04c3fSmrg
302501e04c3fSmrg   switch (type) {
302601e04c3fSmrg   case TYPE_UINT:
302701e04c3fSmrg   case TYPE_INT:
302801e04c3fSmrg   case TYPE_INT_2:
302901e04c3fSmrg   case TYPE_UINT_2:
303001e04c3fSmrg   case TYPE_INT_3:
303101e04c3fSmrg   case TYPE_UINT_3:
303201e04c3fSmrg   case TYPE_INT_4:
303301e04c3fSmrg   case TYPE_UINT_4:
303401e04c3fSmrg   case TYPE_INT64:
303501e04c3fSmrg   case TYPE_ENUM16:
303601e04c3fSmrg   case TYPE_ENUM:
303701e04c3fSmrg   case TYPE_ENUM_2:
303801e04c3fSmrg   case TYPE_BOOLEAN:
303901e04c3fSmrg   case TYPE_UBYTE:
304001e04c3fSmrg   case TYPE_SHORT:
304101e04c3fSmrg   case TYPE_FLOAT:
304201e04c3fSmrg   case TYPE_FLOATN:
304301e04c3fSmrg   case TYPE_FLOAT_2:
304401e04c3fSmrg   case TYPE_FLOATN_2:
304501e04c3fSmrg   case TYPE_FLOAT_3:
304601e04c3fSmrg   case TYPE_FLOATN_3:
304701e04c3fSmrg   case TYPE_FLOAT_4:
304801e04c3fSmrg   case TYPE_FLOATN_4:
304901e04c3fSmrg   case TYPE_FLOAT_8:
305001e04c3fSmrg   case TYPE_DOUBLEN:
305101e04c3fSmrg   case TYPE_DOUBLEN_2:
305201e04c3fSmrg   case TYPE_MATRIX:
305301e04c3fSmrg   case TYPE_MATRIX_T:
305401e04c3fSmrg      memcpy(data, &v.value_int, size);
305501e04c3fSmrg      break;
305601e04c3fSmrg   case TYPE_INT_N:
305701e04c3fSmrg      memcpy(data, &v.value_int_n.ints, size);
305801e04c3fSmrg      break;
305901e04c3fSmrg   default:
306001e04c3fSmrg      break; /* nothing - GL error was recorded */
306101e04c3fSmrg   }
306201e04c3fSmrg}
306301e04c3fSmrg
30643464ebd5Sriastradhvoid GLAPIENTRY
30653464ebd5Sriastradh_mesa_GetFixedv(GLenum pname, GLfixed *params)
30663464ebd5Sriastradh{
30673464ebd5Sriastradh   const struct value_desc *d;
30683464ebd5Sriastradh   union value v;
30693464ebd5Sriastradh   GLmatrix *m;
30703464ebd5Sriastradh   int shift, i;
30713464ebd5Sriastradh   void *p;
30723464ebd5Sriastradh
30733464ebd5Sriastradh   d = find_value("glGetDoublev", pname, &p, &v);
30743464ebd5Sriastradh   switch (d->type) {
30753464ebd5Sriastradh   case TYPE_INVALID:
30763464ebd5Sriastradh      break;
30773464ebd5Sriastradh   case TYPE_CONST:
30783464ebd5Sriastradh      params[0] = INT_TO_FIXED(d->offset);
30793464ebd5Sriastradh      break;
30803464ebd5Sriastradh
30813464ebd5Sriastradh   case TYPE_FLOAT_4:
30823464ebd5Sriastradh   case TYPE_FLOATN_4:
30833464ebd5Sriastradh      params[3] = FLOAT_TO_FIXED(((GLfloat *) p)[3]);
30843464ebd5Sriastradh   case TYPE_FLOAT_3:
30853464ebd5Sriastradh   case TYPE_FLOATN_3:
30863464ebd5Sriastradh      params[2] = FLOAT_TO_FIXED(((GLfloat *) p)[2]);
30873464ebd5Sriastradh   case TYPE_FLOAT_2:
30883464ebd5Sriastradh   case TYPE_FLOATN_2:
30893464ebd5Sriastradh      params[1] = FLOAT_TO_FIXED(((GLfloat *) p)[1]);
30903464ebd5Sriastradh   case TYPE_FLOAT:
30913464ebd5Sriastradh   case TYPE_FLOATN:
30923464ebd5Sriastradh      params[0] = FLOAT_TO_FIXED(((GLfloat *) p)[0]);
30933464ebd5Sriastradh      break;
30943464ebd5Sriastradh
3095af69d88dSmrg   case TYPE_DOUBLEN_2:
3096af69d88dSmrg      params[1] = FLOAT_TO_FIXED(((GLdouble *) p)[1]);
30973464ebd5Sriastradh   case TYPE_DOUBLEN:
30983464ebd5Sriastradh      params[0] = FLOAT_TO_FIXED(((GLdouble *) p)[0]);
30993464ebd5Sriastradh      break;
31003464ebd5Sriastradh
31013464ebd5Sriastradh   case TYPE_INT_4:
310201e04c3fSmrg   case TYPE_UINT_4:
31033464ebd5Sriastradh      params[3] = INT_TO_FIXED(((GLint *) p)[3]);
31043464ebd5Sriastradh   case TYPE_INT_3:
310501e04c3fSmrg   case TYPE_UINT_3:
31063464ebd5Sriastradh      params[2] = INT_TO_FIXED(((GLint *) p)[2]);
31073464ebd5Sriastradh   case TYPE_INT_2:
310801e04c3fSmrg   case TYPE_UINT_2:
31093464ebd5Sriastradh   case TYPE_ENUM_2:
31103464ebd5Sriastradh      params[1] = INT_TO_FIXED(((GLint *) p)[1]);
31113464ebd5Sriastradh   case TYPE_INT:
311201e04c3fSmrg   case TYPE_UINT:
31133464ebd5Sriastradh   case TYPE_ENUM:
31143464ebd5Sriastradh      params[0] = INT_TO_FIXED(((GLint *) p)[0]);
31153464ebd5Sriastradh      break;
31163464ebd5Sriastradh
311701e04c3fSmrg   case TYPE_ENUM16:
311801e04c3fSmrg      params[0] = INT_TO_FIXED((GLint)(((GLenum16 *) p)[0]));
311901e04c3fSmrg      break;
312001e04c3fSmrg
31213464ebd5Sriastradh   case TYPE_INT_N:
31223464ebd5Sriastradh      for (i = 0; i < v.value_int_n.n; i++)
312301e04c3fSmrg         params[i] = INT_TO_FIXED(v.value_int_n.ints[i]);
31243464ebd5Sriastradh      break;
31253464ebd5Sriastradh
31263464ebd5Sriastradh   case TYPE_INT64:
31273464ebd5Sriastradh      params[0] = ((GLint64 *) p)[0];
31283464ebd5Sriastradh      break;
31293464ebd5Sriastradh
31303464ebd5Sriastradh   case TYPE_BOOLEAN:
31313464ebd5Sriastradh      params[0] = BOOLEAN_TO_FIXED(((GLboolean*) p)[0]);
313201e04c3fSmrg      break;
313301e04c3fSmrg
313401e04c3fSmrg   case TYPE_UBYTE:
313501e04c3fSmrg      params[0] = INT_TO_FIXED(((GLubyte *) p)[0]);
313601e04c3fSmrg      break;
313701e04c3fSmrg
313801e04c3fSmrg   case TYPE_SHORT:
313901e04c3fSmrg      params[0] = INT_TO_FIXED(((GLshort *) p)[0]);
314001e04c3fSmrg      break;
31413464ebd5Sriastradh
31423464ebd5Sriastradh   case TYPE_MATRIX:
31433464ebd5Sriastradh      m = *(GLmatrix **) p;
31443464ebd5Sriastradh      for (i = 0; i < 16; i++)
314501e04c3fSmrg         params[i] = FLOAT_TO_FIXED(m->m[i]);
31463464ebd5Sriastradh      break;
31473464ebd5Sriastradh
31483464ebd5Sriastradh   case TYPE_MATRIX_T:
31493464ebd5Sriastradh      m = *(GLmatrix **) p;
31503464ebd5Sriastradh      for (i = 0; i < 16; i++)
315101e04c3fSmrg         params[i] = FLOAT_TO_FIXED(m->m[transpose[i]]);
31523464ebd5Sriastradh      break;
31533464ebd5Sriastradh
31543464ebd5Sriastradh   case TYPE_BIT_0:
31553464ebd5Sriastradh   case TYPE_BIT_1:
31563464ebd5Sriastradh   case TYPE_BIT_2:
31573464ebd5Sriastradh   case TYPE_BIT_3:
31583464ebd5Sriastradh   case TYPE_BIT_4:
31593464ebd5Sriastradh   case TYPE_BIT_5:
3160af69d88dSmrg   case TYPE_BIT_6:
3161af69d88dSmrg   case TYPE_BIT_7:
31623464ebd5Sriastradh      shift = d->type - TYPE_BIT_0;
31633464ebd5Sriastradh      params[0] = BOOLEAN_TO_FIXED((*(GLbitfield *) p >> shift) & 1);
31643464ebd5Sriastradh      break;
31653464ebd5Sriastradh   }
31663464ebd5Sriastradh}
3167