1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright (C) 2010 Brian Paul All Rights Reserved.
3*61046927SAndroid Build Coastguard Worker * Copyright (C) 2010 Intel Corporation
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
6*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
7*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
8*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
10*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
11*61046927SAndroid Build Coastguard Worker *
12*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
13*61046927SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19*61046927SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*61046927SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*61046927SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker *
23*61046927SAndroid Build Coastguard Worker * Author: Kristian Høgsberg <[email protected]>
24*61046927SAndroid Build Coastguard Worker */
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
27*61046927SAndroid Build Coastguard Worker #include "context.h"
28*61046927SAndroid Build Coastguard Worker #include "blend.h"
29*61046927SAndroid Build Coastguard Worker #include "debug_output.h"
30*61046927SAndroid Build Coastguard Worker #include "enable.h"
31*61046927SAndroid Build Coastguard Worker #include "enums.h"
32*61046927SAndroid Build Coastguard Worker #include "errors.h"
33*61046927SAndroid Build Coastguard Worker #include "extensions.h"
34*61046927SAndroid Build Coastguard Worker #include "get.h"
35*61046927SAndroid Build Coastguard Worker #include "macros.h"
36*61046927SAndroid Build Coastguard Worker #include "multisample.h"
37*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
38*61046927SAndroid Build Coastguard Worker #include "queryobj.h"
39*61046927SAndroid Build Coastguard Worker #include "spirv_extensions.h"
40*61046927SAndroid Build Coastguard Worker #include "state.h"
41*61046927SAndroid Build Coastguard Worker #include "texcompress.h"
42*61046927SAndroid Build Coastguard Worker #include "texstate.h"
43*61046927SAndroid Build Coastguard Worker #include "framebuffer.h"
44*61046927SAndroid Build Coastguard Worker #include "samplerobj.h"
45*61046927SAndroid Build Coastguard Worker #include "stencil.h"
46*61046927SAndroid Build Coastguard Worker #include "version.h"
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_context.h"
49*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker /* This is a table driven implemetation of the glGet*v() functions.
52*61046927SAndroid Build Coastguard Worker * The basic idea is that most getters just look up an int somewhere
53*61046927SAndroid Build Coastguard Worker * in struct gl_context and then convert it to a bool or float according to
54*61046927SAndroid Build Coastguard Worker * which of glGetIntegerv() glGetBooleanv() etc is being called.
55*61046927SAndroid Build Coastguard Worker * Instead of generating code to do this, we can just record the enum
56*61046927SAndroid Build Coastguard Worker * value and the offset into struct gl_context in an array of structs. Then
57*61046927SAndroid Build Coastguard Worker * in glGet*(), we lookup the struct for the enum in question, and use
58*61046927SAndroid Build Coastguard Worker * the offset to get the int we need.
59*61046927SAndroid Build Coastguard Worker *
60*61046927SAndroid Build Coastguard Worker * Sometimes we need to look up a float, a boolean, a bit in a
61*61046927SAndroid Build Coastguard Worker * bitfield, a matrix or other types instead, so we need to track the
62*61046927SAndroid Build Coastguard Worker * type of the value in struct gl_context. And sometimes the value isn't in
63*61046927SAndroid Build Coastguard Worker * struct gl_context but in the drawbuffer, the array object, current texture
64*61046927SAndroid Build Coastguard Worker * unit, or maybe it's a computed value. So we need to also track
65*61046927SAndroid Build Coastguard Worker * where or how to find the value. Finally, we sometimes need to
66*61046927SAndroid Build Coastguard Worker * check that one of a number of extensions are enabled, the GL
67*61046927SAndroid Build Coastguard Worker * version or flush or call _mesa_update_state(). This is done by
68*61046927SAndroid Build Coastguard Worker * attaching optional extra information to the value description
69*61046927SAndroid Build Coastguard Worker * struct, it's sort of like an array of opcodes that describe extra
70*61046927SAndroid Build Coastguard Worker * checks or actions.
71*61046927SAndroid Build Coastguard Worker *
72*61046927SAndroid Build Coastguard Worker * Putting all this together we end up with struct value_desc below,
73*61046927SAndroid Build Coastguard Worker * and with a couple of macros to help, the table of struct value_desc
74*61046927SAndroid Build Coastguard Worker * is about as concise as the specification in the old python script.
75*61046927SAndroid Build Coastguard Worker */
76*61046927SAndroid Build Coastguard Worker
77*61046927SAndroid Build Coastguard Worker static inline GLboolean
FLOAT_TO_BOOLEAN(GLfloat X)78*61046927SAndroid Build Coastguard Worker FLOAT_TO_BOOLEAN(GLfloat X)
79*61046927SAndroid Build Coastguard Worker {
80*61046927SAndroid Build Coastguard Worker return ( (X) ? GL_TRUE : GL_FALSE );
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Worker static inline GLint
FLOAT_TO_FIXED(GLfloat F)84*61046927SAndroid Build Coastguard Worker FLOAT_TO_FIXED(GLfloat F)
85*61046927SAndroid Build Coastguard Worker {
86*61046927SAndroid Build Coastguard Worker return ( ((F) * 65536.0f > (float)INT32_MAX) ? INT32_MAX :
87*61046927SAndroid Build Coastguard Worker ((F) * 65536.0f < (float)INT32_MIN) ? INT32_MIN :
88*61046927SAndroid Build Coastguard Worker (GLint) ((F) * 65536.0f) );
89*61046927SAndroid Build Coastguard Worker }
90*61046927SAndroid Build Coastguard Worker
91*61046927SAndroid Build Coastguard Worker static inline GLboolean
INT_TO_BOOLEAN(GLint I)92*61046927SAndroid Build Coastguard Worker INT_TO_BOOLEAN(GLint I)
93*61046927SAndroid Build Coastguard Worker {
94*61046927SAndroid Build Coastguard Worker return ( (I) ? GL_TRUE : GL_FALSE );
95*61046927SAndroid Build Coastguard Worker }
96*61046927SAndroid Build Coastguard Worker
97*61046927SAndroid Build Coastguard Worker static inline GLfixed
INT_TO_FIXED(GLint I)98*61046927SAndroid Build Coastguard Worker INT_TO_FIXED(GLint I)
99*61046927SAndroid Build Coastguard Worker {
100*61046927SAndroid Build Coastguard Worker return (((I) > SHRT_MAX) ? INT_MAX :
101*61046927SAndroid Build Coastguard Worker ((I) < SHRT_MIN) ? INT_MIN :
102*61046927SAndroid Build Coastguard Worker (GLint) ((I) * 65536) );
103*61046927SAndroid Build Coastguard Worker }
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker
106*61046927SAndroid Build Coastguard Worker static inline GLboolean
INT64_TO_BOOLEAN(GLint64 I)107*61046927SAndroid Build Coastguard Worker INT64_TO_BOOLEAN(GLint64 I)
108*61046927SAndroid Build Coastguard Worker {
109*61046927SAndroid Build Coastguard Worker return ( (I) ? GL_TRUE : GL_FALSE );
110*61046927SAndroid Build Coastguard Worker }
111*61046927SAndroid Build Coastguard Worker
112*61046927SAndroid Build Coastguard Worker static inline GLint
INT64_TO_INT(GLint64 I)113*61046927SAndroid Build Coastguard Worker INT64_TO_INT(GLint64 I)
114*61046927SAndroid Build Coastguard Worker {
115*61046927SAndroid Build Coastguard Worker return ( (GLint)((I > INT_MAX) ? INT_MAX : ((I < INT_MIN) ? INT_MIN : (I))) );
116*61046927SAndroid Build Coastguard Worker }
117*61046927SAndroid Build Coastguard Worker
118*61046927SAndroid Build Coastguard Worker static inline GLint
BOOLEAN_TO_INT(GLboolean B)119*61046927SAndroid Build Coastguard Worker BOOLEAN_TO_INT(GLboolean B)
120*61046927SAndroid Build Coastguard Worker {
121*61046927SAndroid Build Coastguard Worker return ( (GLint) (B) );
122*61046927SAndroid Build Coastguard Worker }
123*61046927SAndroid Build Coastguard Worker
124*61046927SAndroid Build Coastguard Worker static inline GLfloat
BOOLEAN_TO_FLOAT(GLboolean B)125*61046927SAndroid Build Coastguard Worker BOOLEAN_TO_FLOAT(GLboolean B)
126*61046927SAndroid Build Coastguard Worker {
127*61046927SAndroid Build Coastguard Worker return ( (B) ? 1.0F : 0.0F );
128*61046927SAndroid Build Coastguard Worker }
129*61046927SAndroid Build Coastguard Worker
130*61046927SAndroid Build Coastguard Worker static inline GLfixed
BOOLEAN_TO_FIXED(GLboolean B)131*61046927SAndroid Build Coastguard Worker BOOLEAN_TO_FIXED(GLboolean B)
132*61046927SAndroid Build Coastguard Worker {
133*61046927SAndroid Build Coastguard Worker return ( (GLint) ((B) ? 1 : 0) << 16 );
134*61046927SAndroid Build Coastguard Worker }
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard Worker enum value_type {
137*61046927SAndroid Build Coastguard Worker TYPE_INVALID,
138*61046927SAndroid Build Coastguard Worker TYPE_INT,
139*61046927SAndroid Build Coastguard Worker TYPE_INT_2,
140*61046927SAndroid Build Coastguard Worker TYPE_INT_3,
141*61046927SAndroid Build Coastguard Worker TYPE_INT_4,
142*61046927SAndroid Build Coastguard Worker TYPE_INT_N,
143*61046927SAndroid Build Coastguard Worker TYPE_UINT,
144*61046927SAndroid Build Coastguard Worker TYPE_UINT_2,
145*61046927SAndroid Build Coastguard Worker TYPE_UINT_3,
146*61046927SAndroid Build Coastguard Worker TYPE_UINT_4,
147*61046927SAndroid Build Coastguard Worker TYPE_INT64,
148*61046927SAndroid Build Coastguard Worker TYPE_ENUM16,
149*61046927SAndroid Build Coastguard Worker TYPE_ENUM,
150*61046927SAndroid Build Coastguard Worker TYPE_ENUM_2,
151*61046927SAndroid Build Coastguard Worker TYPE_BOOLEAN,
152*61046927SAndroid Build Coastguard Worker TYPE_UBYTE,
153*61046927SAndroid Build Coastguard Worker TYPE_SHORT,
154*61046927SAndroid Build Coastguard Worker TYPE_BIT_0,
155*61046927SAndroid Build Coastguard Worker TYPE_BIT_1,
156*61046927SAndroid Build Coastguard Worker TYPE_BIT_2,
157*61046927SAndroid Build Coastguard Worker TYPE_BIT_3,
158*61046927SAndroid Build Coastguard Worker TYPE_BIT_4,
159*61046927SAndroid Build Coastguard Worker TYPE_BIT_5,
160*61046927SAndroid Build Coastguard Worker TYPE_BIT_6,
161*61046927SAndroid Build Coastguard Worker TYPE_BIT_7,
162*61046927SAndroid Build Coastguard Worker TYPE_FLOAT,
163*61046927SAndroid Build Coastguard Worker TYPE_FLOAT_2,
164*61046927SAndroid Build Coastguard Worker TYPE_FLOAT_3,
165*61046927SAndroid Build Coastguard Worker TYPE_FLOAT_4,
166*61046927SAndroid Build Coastguard Worker TYPE_FLOAT_8,
167*61046927SAndroid Build Coastguard Worker TYPE_FLOATN,
168*61046927SAndroid Build Coastguard Worker TYPE_FLOATN_2,
169*61046927SAndroid Build Coastguard Worker TYPE_FLOATN_3,
170*61046927SAndroid Build Coastguard Worker TYPE_FLOATN_4,
171*61046927SAndroid Build Coastguard Worker TYPE_DOUBLEN,
172*61046927SAndroid Build Coastguard Worker TYPE_DOUBLEN_2,
173*61046927SAndroid Build Coastguard Worker TYPE_MATRIX,
174*61046927SAndroid Build Coastguard Worker TYPE_MATRIX_T,
175*61046927SAndroid Build Coastguard Worker TYPE_CONST
176*61046927SAndroid Build Coastguard Worker };
177*61046927SAndroid Build Coastguard Worker
178*61046927SAndroid Build Coastguard Worker enum value_location {
179*61046927SAndroid Build Coastguard Worker LOC_BUFFER,
180*61046927SAndroid Build Coastguard Worker LOC_CONTEXT,
181*61046927SAndroid Build Coastguard Worker LOC_ARRAY,
182*61046927SAndroid Build Coastguard Worker LOC_TEXUNIT,
183*61046927SAndroid Build Coastguard Worker LOC_CUSTOM
184*61046927SAndroid Build Coastguard Worker };
185*61046927SAndroid Build Coastguard Worker
186*61046927SAndroid Build Coastguard Worker enum value_extra {
187*61046927SAndroid Build Coastguard Worker EXTRA_END = 0x8000,
188*61046927SAndroid Build Coastguard Worker EXTRA_VERSION_30,
189*61046927SAndroid Build Coastguard Worker EXTRA_VERSION_31,
190*61046927SAndroid Build Coastguard Worker EXTRA_VERSION_32,
191*61046927SAndroid Build Coastguard Worker EXTRA_VERSION_40,
192*61046927SAndroid Build Coastguard Worker EXTRA_VERSION_43,
193*61046927SAndroid Build Coastguard Worker EXTRA_API_GL,
194*61046927SAndroid Build Coastguard Worker EXTRA_API_GL_CORE,
195*61046927SAndroid Build Coastguard Worker EXTRA_API_GL_COMPAT,
196*61046927SAndroid Build Coastguard Worker EXTRA_API_ES,
197*61046927SAndroid Build Coastguard Worker EXTRA_API_ES2,
198*61046927SAndroid Build Coastguard Worker EXTRA_API_ES3,
199*61046927SAndroid Build Coastguard Worker EXTRA_API_ES31,
200*61046927SAndroid Build Coastguard Worker EXTRA_API_ES32,
201*61046927SAndroid Build Coastguard Worker EXTRA_NEW_BUFFERS,
202*61046927SAndroid Build Coastguard Worker EXTRA_VALID_DRAW_BUFFER,
203*61046927SAndroid Build Coastguard Worker EXTRA_VALID_TEXTURE_UNIT,
204*61046927SAndroid Build Coastguard Worker EXTRA_VALID_CLIP_DISTANCE,
205*61046927SAndroid Build Coastguard Worker EXTRA_FLUSH_CURRENT,
206*61046927SAndroid Build Coastguard Worker EXTRA_GLSL_130,
207*61046927SAndroid Build Coastguard Worker EXTRA_EXT_UBO_GS,
208*61046927SAndroid Build Coastguard Worker EXTRA_EXT_ATOMICS_GS,
209*61046927SAndroid Build Coastguard Worker EXTRA_EXT_SHADER_IMAGE_GS,
210*61046927SAndroid Build Coastguard Worker EXTRA_EXT_ATOMICS_TESS,
211*61046927SAndroid Build Coastguard Worker EXTRA_EXT_SHADER_IMAGE_TESS,
212*61046927SAndroid Build Coastguard Worker EXTRA_EXT_SSBO_GS,
213*61046927SAndroid Build Coastguard Worker EXTRA_EXT_FB_NO_ATTACH_GS,
214*61046927SAndroid Build Coastguard Worker EXTRA_EXT_ES_GS,
215*61046927SAndroid Build Coastguard Worker EXTRA_EXT_PROVOKING_VERTEX_32,
216*61046927SAndroid Build Coastguard Worker };
217*61046927SAndroid Build Coastguard Worker
218*61046927SAndroid Build Coastguard Worker #define NO_EXTRA NULL
219*61046927SAndroid Build Coastguard Worker #define NO_OFFSET 0
220*61046927SAndroid Build Coastguard Worker
221*61046927SAndroid Build Coastguard Worker struct value_desc {
222*61046927SAndroid Build Coastguard Worker GLenum pname;
223*61046927SAndroid Build Coastguard Worker GLubyte location; /**< enum value_location */
224*61046927SAndroid Build Coastguard Worker GLubyte type; /**< enum value_type */
225*61046927SAndroid Build Coastguard Worker int offset;
226*61046927SAndroid Build Coastguard Worker const int *extra;
227*61046927SAndroid Build Coastguard Worker };
228*61046927SAndroid Build Coastguard Worker
229*61046927SAndroid Build Coastguard Worker union value {
230*61046927SAndroid Build Coastguard Worker GLfloat value_float;
231*61046927SAndroid Build Coastguard Worker GLfloat value_float_4[4];
232*61046927SAndroid Build Coastguard Worker GLdouble value_double_2[2];
233*61046927SAndroid Build Coastguard Worker GLmatrix *value_matrix;
234*61046927SAndroid Build Coastguard Worker GLint value_int;
235*61046927SAndroid Build Coastguard Worker GLint value_int_2[2];
236*61046927SAndroid Build Coastguard Worker GLint value_int_4[4];
237*61046927SAndroid Build Coastguard Worker GLint64 value_int64;
238*61046927SAndroid Build Coastguard Worker GLenum value_enum;
239*61046927SAndroid Build Coastguard Worker GLenum16 value_enum16;
240*61046927SAndroid Build Coastguard Worker GLubyte value_ubyte;
241*61046927SAndroid Build Coastguard Worker GLshort value_short;
242*61046927SAndroid Build Coastguard Worker GLuint value_uint;
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker /* Sigh, see GL_COMPRESSED_TEXTURE_FORMATS_ARB handling */
245*61046927SAndroid Build Coastguard Worker struct {
246*61046927SAndroid Build Coastguard Worker GLint n, ints[100];
247*61046927SAndroid Build Coastguard Worker } value_int_n;
248*61046927SAndroid Build Coastguard Worker GLboolean value_bool;
249*61046927SAndroid Build Coastguard Worker };
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Worker #define BUFFER_FIELD(field, type) \
252*61046927SAndroid Build Coastguard Worker LOC_BUFFER, type, offsetof(struct gl_framebuffer, field)
253*61046927SAndroid Build Coastguard Worker #define CONTEXT_FIELD(field, type) \
254*61046927SAndroid Build Coastguard Worker LOC_CONTEXT, type, offsetof(struct gl_context, field)
255*61046927SAndroid Build Coastguard Worker #define ARRAY_FIELD(field, type) \
256*61046927SAndroid Build Coastguard Worker LOC_ARRAY, type, offsetof(struct gl_vertex_array_object, field)
257*61046927SAndroid Build Coastguard Worker #undef CONST /* already defined through windows.h */
258*61046927SAndroid Build Coastguard Worker #define CONST(value) \
259*61046927SAndroid Build Coastguard Worker LOC_CONTEXT, TYPE_CONST, value
260*61046927SAndroid Build Coastguard Worker
261*61046927SAndroid Build Coastguard Worker #define BUFFER_INT(field) BUFFER_FIELD(field, TYPE_INT)
262*61046927SAndroid Build Coastguard Worker #define BUFFER_ENUM(field) BUFFER_FIELD(field, TYPE_ENUM)
263*61046927SAndroid Build Coastguard Worker #define BUFFER_ENUM16(field) BUFFER_FIELD(field, TYPE_ENUM16)
264*61046927SAndroid Build Coastguard Worker #define BUFFER_BOOL(field) BUFFER_FIELD(field, TYPE_BOOLEAN)
265*61046927SAndroid Build Coastguard Worker
266*61046927SAndroid Build Coastguard Worker #define CONTEXT_INT(field) CONTEXT_FIELD(field, TYPE_INT)
267*61046927SAndroid Build Coastguard Worker #define CONTEXT_INT2(field) CONTEXT_FIELD(field, TYPE_INT_2)
268*61046927SAndroid Build Coastguard Worker #define CONTEXT_INT64(field) CONTEXT_FIELD(field, TYPE_INT64)
269*61046927SAndroid Build Coastguard Worker #define CONTEXT_UINT(field) CONTEXT_FIELD(field, TYPE_UINT)
270*61046927SAndroid Build Coastguard Worker #define CONTEXT_ENUM16(field) CONTEXT_FIELD(field, TYPE_ENUM16)
271*61046927SAndroid Build Coastguard Worker #define CONTEXT_ENUM(field) CONTEXT_FIELD(field, TYPE_ENUM)
272*61046927SAndroid Build Coastguard Worker #define CONTEXT_ENUM2(field) CONTEXT_FIELD(field, TYPE_ENUM_2)
273*61046927SAndroid Build Coastguard Worker #define CONTEXT_BOOL(field) CONTEXT_FIELD(field, TYPE_BOOLEAN)
274*61046927SAndroid Build Coastguard Worker #define CONTEXT_BIT0(field) CONTEXT_FIELD(field, TYPE_BIT_0)
275*61046927SAndroid Build Coastguard Worker #define CONTEXT_BIT1(field) CONTEXT_FIELD(field, TYPE_BIT_1)
276*61046927SAndroid Build Coastguard Worker #define CONTEXT_BIT2(field) CONTEXT_FIELD(field, TYPE_BIT_2)
277*61046927SAndroid Build Coastguard Worker #define CONTEXT_BIT3(field) CONTEXT_FIELD(field, TYPE_BIT_3)
278*61046927SAndroid Build Coastguard Worker #define CONTEXT_BIT4(field) CONTEXT_FIELD(field, TYPE_BIT_4)
279*61046927SAndroid Build Coastguard Worker #define CONTEXT_BIT5(field) CONTEXT_FIELD(field, TYPE_BIT_5)
280*61046927SAndroid Build Coastguard Worker #define CONTEXT_BIT6(field) CONTEXT_FIELD(field, TYPE_BIT_6)
281*61046927SAndroid Build Coastguard Worker #define CONTEXT_BIT7(field) CONTEXT_FIELD(field, TYPE_BIT_7)
282*61046927SAndroid Build Coastguard Worker #define CONTEXT_FLOAT(field) CONTEXT_FIELD(field, TYPE_FLOAT)
283*61046927SAndroid Build Coastguard Worker #define CONTEXT_FLOAT2(field) CONTEXT_FIELD(field, TYPE_FLOAT_2)
284*61046927SAndroid Build Coastguard Worker #define CONTEXT_FLOAT3(field) CONTEXT_FIELD(field, TYPE_FLOAT_3)
285*61046927SAndroid Build Coastguard Worker #define CONTEXT_FLOAT4(field) CONTEXT_FIELD(field, TYPE_FLOAT_4)
286*61046927SAndroid Build Coastguard Worker #define CONTEXT_FLOAT8(field) CONTEXT_FIELD(field, TYPE_FLOAT_8)
287*61046927SAndroid Build Coastguard Worker #define CONTEXT_MATRIX(field) CONTEXT_FIELD(field, TYPE_MATRIX)
288*61046927SAndroid Build Coastguard Worker #define CONTEXT_MATRIX_T(field) CONTEXT_FIELD(field, TYPE_MATRIX_T)
289*61046927SAndroid Build Coastguard Worker
290*61046927SAndroid Build Coastguard Worker /* Vertex array fields */
291*61046927SAndroid Build Coastguard Worker #define ARRAY_INT(field) ARRAY_FIELD(field, TYPE_INT)
292*61046927SAndroid Build Coastguard Worker #define ARRAY_ENUM(field) ARRAY_FIELD(field, TYPE_ENUM)
293*61046927SAndroid Build Coastguard Worker #define ARRAY_ENUM16(field) ARRAY_FIELD(field, TYPE_ENUM16)
294*61046927SAndroid Build Coastguard Worker #define ARRAY_BOOL(field) ARRAY_FIELD(field, TYPE_BOOLEAN)
295*61046927SAndroid Build Coastguard Worker #define ARRAY_UBYTE(field) ARRAY_FIELD(field, TYPE_UBYTE)
296*61046927SAndroid Build Coastguard Worker #define ARRAY_SHORT(field) ARRAY_FIELD(field, TYPE_SHORT)
297*61046927SAndroid Build Coastguard Worker
298*61046927SAndroid Build Coastguard Worker #define EXT(f) \
299*61046927SAndroid Build Coastguard Worker offsetof(struct gl_extensions, f)
300*61046927SAndroid Build Coastguard Worker
301*61046927SAndroid Build Coastguard Worker #define EXTRA_EXT(e) \
302*61046927SAndroid Build Coastguard Worker static const int extra_##e[] = { \
303*61046927SAndroid Build Coastguard Worker EXT(e), EXTRA_END \
304*61046927SAndroid Build Coastguard Worker }
305*61046927SAndroid Build Coastguard Worker
306*61046927SAndroid Build Coastguard Worker #define EXTRA_EXT2(e1, e2) \
307*61046927SAndroid Build Coastguard Worker static const int extra_##e1##_##e2[] = { \
308*61046927SAndroid Build Coastguard Worker EXT(e1), EXT(e2), EXTRA_END \
309*61046927SAndroid Build Coastguard Worker }
310*61046927SAndroid Build Coastguard Worker
311*61046927SAndroid Build Coastguard Worker /* The 'extra' mechanism is a way to specify extra checks (such as
312*61046927SAndroid Build Coastguard Worker * extensions or specific gl versions) or actions (flush current, new
313*61046927SAndroid Build Coastguard Worker * buffers) that we need to do before looking up an enum. We need to
314*61046927SAndroid Build Coastguard Worker * declare them all up front so we can refer to them in the value_desc
315*61046927SAndroid Build Coastguard Worker * structs below.
316*61046927SAndroid Build Coastguard Worker *
317*61046927SAndroid Build Coastguard Worker * Each EXTRA_ will be executed. For EXTRA_* enums of extensions and API
318*61046927SAndroid Build Coastguard Worker * versions, listing multiple ones in an array means an error will be thrown
319*61046927SAndroid Build Coastguard Worker * only if none of them are available. If you need to check for "AND"
320*61046927SAndroid Build Coastguard Worker * behavior, you would need to make a custom EXTRA_ enum.
321*61046927SAndroid Build Coastguard Worker */
322*61046927SAndroid Build Coastguard Worker
323*61046927SAndroid Build Coastguard Worker static const int extra_new_buffers_compat_es[] = {
324*61046927SAndroid Build Coastguard Worker EXTRA_API_GL_COMPAT,
325*61046927SAndroid Build Coastguard Worker EXTRA_API_ES,
326*61046927SAndroid Build Coastguard Worker EXTRA_NEW_BUFFERS,
327*61046927SAndroid Build Coastguard Worker EXTRA_END
328*61046927SAndroid Build Coastguard Worker };
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker static const int extra_new_buffers[] = {
331*61046927SAndroid Build Coastguard Worker EXTRA_NEW_BUFFERS,
332*61046927SAndroid Build Coastguard Worker EXTRA_END
333*61046927SAndroid Build Coastguard Worker };
334*61046927SAndroid Build Coastguard Worker
335*61046927SAndroid Build Coastguard Worker static const int extra_valid_draw_buffer[] = {
336*61046927SAndroid Build Coastguard Worker EXTRA_VALID_DRAW_BUFFER,
337*61046927SAndroid Build Coastguard Worker EXTRA_END
338*61046927SAndroid Build Coastguard Worker };
339*61046927SAndroid Build Coastguard Worker
340*61046927SAndroid Build Coastguard Worker static const int extra_valid_texture_unit[] = {
341*61046927SAndroid Build Coastguard Worker EXTRA_VALID_TEXTURE_UNIT,
342*61046927SAndroid Build Coastguard Worker EXTRA_END
343*61046927SAndroid Build Coastguard Worker };
344*61046927SAndroid Build Coastguard Worker
345*61046927SAndroid Build Coastguard Worker static const int extra_valid_clip_distance[] = {
346*61046927SAndroid Build Coastguard Worker EXTRA_VALID_CLIP_DISTANCE,
347*61046927SAndroid Build Coastguard Worker EXTRA_END
348*61046927SAndroid Build Coastguard Worker };
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker static const int extra_flush_current_valid_texture_unit[] = {
351*61046927SAndroid Build Coastguard Worker EXTRA_FLUSH_CURRENT,
352*61046927SAndroid Build Coastguard Worker EXTRA_VALID_TEXTURE_UNIT,
353*61046927SAndroid Build Coastguard Worker EXTRA_END
354*61046927SAndroid Build Coastguard Worker };
355*61046927SAndroid Build Coastguard Worker
356*61046927SAndroid Build Coastguard Worker static const int extra_flush_current[] = {
357*61046927SAndroid Build Coastguard Worker EXTRA_FLUSH_CURRENT,
358*61046927SAndroid Build Coastguard Worker EXTRA_END
359*61046927SAndroid Build Coastguard Worker };
360*61046927SAndroid Build Coastguard Worker
361*61046927SAndroid Build Coastguard Worker static const int extra_EXT_texture_integer_and_new_buffers[] = {
362*61046927SAndroid Build Coastguard Worker EXT(EXT_texture_integer),
363*61046927SAndroid Build Coastguard Worker EXTRA_NEW_BUFFERS,
364*61046927SAndroid Build Coastguard Worker EXTRA_END
365*61046927SAndroid Build Coastguard Worker };
366*61046927SAndroid Build Coastguard Worker
367*61046927SAndroid Build Coastguard Worker static const int extra_GLSL_130_es3_gpushader4[] = {
368*61046927SAndroid Build Coastguard Worker EXTRA_GLSL_130,
369*61046927SAndroid Build Coastguard Worker EXTRA_API_ES3,
370*61046927SAndroid Build Coastguard Worker EXT(EXT_gpu_shader4),
371*61046927SAndroid Build Coastguard Worker EXTRA_END
372*61046927SAndroid Build Coastguard Worker };
373*61046927SAndroid Build Coastguard Worker
374*61046927SAndroid Build Coastguard Worker static const int extra_texture_buffer_object[] = {
375*61046927SAndroid Build Coastguard Worker EXT(ARB_texture_buffer_object),
376*61046927SAndroid Build Coastguard Worker EXTRA_END
377*61046927SAndroid Build Coastguard Worker };
378*61046927SAndroid Build Coastguard Worker
379*61046927SAndroid Build Coastguard Worker static const int extra_ARB_transform_feedback2_api_es3[] = {
380*61046927SAndroid Build Coastguard Worker EXT(ARB_transform_feedback2),
381*61046927SAndroid Build Coastguard Worker EXTRA_API_ES3,
382*61046927SAndroid Build Coastguard Worker EXTRA_END
383*61046927SAndroid Build Coastguard Worker };
384*61046927SAndroid Build Coastguard Worker
385*61046927SAndroid Build Coastguard Worker static const int extra_ARB_uniform_buffer_object_and_geometry_shader[] = {
386*61046927SAndroid Build Coastguard Worker EXTRA_EXT_UBO_GS,
387*61046927SAndroid Build Coastguard Worker EXTRA_END
388*61046927SAndroid Build Coastguard Worker };
389*61046927SAndroid Build Coastguard Worker
390*61046927SAndroid Build Coastguard Worker static const int extra_ARB_ES2_compatibility_api_es2[] = {
391*61046927SAndroid Build Coastguard Worker EXT(ARB_ES2_compatibility),
392*61046927SAndroid Build Coastguard Worker EXTRA_API_ES2,
393*61046927SAndroid Build Coastguard Worker EXTRA_END
394*61046927SAndroid Build Coastguard Worker };
395*61046927SAndroid Build Coastguard Worker
396*61046927SAndroid Build Coastguard Worker static const int extra_ARB_ES3_compatibility_api_es3[] = {
397*61046927SAndroid Build Coastguard Worker EXT(ARB_ES3_compatibility),
398*61046927SAndroid Build Coastguard Worker EXTRA_API_ES3,
399*61046927SAndroid Build Coastguard Worker EXTRA_END
400*61046927SAndroid Build Coastguard Worker };
401*61046927SAndroid Build Coastguard Worker
402*61046927SAndroid Build Coastguard Worker static const int extra_EXT_framebuffer_sRGB_and_new_buffers[] = {
403*61046927SAndroid Build Coastguard Worker EXT(EXT_framebuffer_sRGB),
404*61046927SAndroid Build Coastguard Worker EXTRA_NEW_BUFFERS,
405*61046927SAndroid Build Coastguard Worker EXTRA_END
406*61046927SAndroid Build Coastguard Worker };
407*61046927SAndroid Build Coastguard Worker
408*61046927SAndroid Build Coastguard Worker static const int extra_EXT_packed_float[] = {
409*61046927SAndroid Build Coastguard Worker EXT(EXT_packed_float),
410*61046927SAndroid Build Coastguard Worker EXTRA_NEW_BUFFERS,
411*61046927SAndroid Build Coastguard Worker EXTRA_END
412*61046927SAndroid Build Coastguard Worker };
413*61046927SAndroid Build Coastguard Worker
414*61046927SAndroid Build Coastguard Worker static const int extra_EXT_texture_array_es3[] = {
415*61046927SAndroid Build Coastguard Worker EXT(EXT_texture_array),
416*61046927SAndroid Build Coastguard Worker EXTRA_API_ES3,
417*61046927SAndroid Build Coastguard Worker EXTRA_END
418*61046927SAndroid Build Coastguard Worker };
419*61046927SAndroid Build Coastguard Worker
420*61046927SAndroid Build Coastguard Worker static const int extra_ARB_shader_atomic_counters_and_geometry_shader[] = {
421*61046927SAndroid Build Coastguard Worker EXTRA_EXT_ATOMICS_GS,
422*61046927SAndroid Build Coastguard Worker EXTRA_END
423*61046927SAndroid Build Coastguard Worker };
424*61046927SAndroid Build Coastguard Worker
425*61046927SAndroid Build Coastguard Worker static const int extra_ARB_shader_atomic_counters_es31[] = {
426*61046927SAndroid Build Coastguard Worker EXT(ARB_shader_atomic_counters),
427*61046927SAndroid Build Coastguard Worker EXTRA_API_ES31,
428*61046927SAndroid Build Coastguard Worker EXTRA_END
429*61046927SAndroid Build Coastguard Worker };
430*61046927SAndroid Build Coastguard Worker
431*61046927SAndroid Build Coastguard Worker static const int extra_ARB_shader_image_load_store_and_geometry_shader[] = {
432*61046927SAndroid Build Coastguard Worker EXTRA_EXT_SHADER_IMAGE_GS,
433*61046927SAndroid Build Coastguard Worker EXTRA_END
434*61046927SAndroid Build Coastguard Worker };
435*61046927SAndroid Build Coastguard Worker
436*61046927SAndroid Build Coastguard Worker static const int extra_ARB_shader_atomic_counters_and_tessellation[] = {
437*61046927SAndroid Build Coastguard Worker EXTRA_EXT_ATOMICS_TESS,
438*61046927SAndroid Build Coastguard Worker EXTRA_END
439*61046927SAndroid Build Coastguard Worker };
440*61046927SAndroid Build Coastguard Worker
441*61046927SAndroid Build Coastguard Worker static const int extra_ARB_shader_image_load_store_and_tessellation[] = {
442*61046927SAndroid Build Coastguard Worker EXTRA_EXT_SHADER_IMAGE_TESS,
443*61046927SAndroid Build Coastguard Worker EXTRA_END
444*61046927SAndroid Build Coastguard Worker };
445*61046927SAndroid Build Coastguard Worker
446*61046927SAndroid Build Coastguard Worker static const int extra_ARB_shader_image_load_store_es31[] = {
447*61046927SAndroid Build Coastguard Worker EXT(ARB_shader_image_load_store),
448*61046927SAndroid Build Coastguard Worker EXTRA_API_ES31,
449*61046927SAndroid Build Coastguard Worker EXTRA_END
450*61046927SAndroid Build Coastguard Worker };
451*61046927SAndroid Build Coastguard Worker
452*61046927SAndroid Build Coastguard Worker /* HACK: remove when ARB_compute_shader is actually supported */
453*61046927SAndroid Build Coastguard Worker static const int extra_ARB_compute_shader_es31[] = {
454*61046927SAndroid Build Coastguard Worker EXT(ARB_compute_shader),
455*61046927SAndroid Build Coastguard Worker EXTRA_API_ES31,
456*61046927SAndroid Build Coastguard Worker EXTRA_END
457*61046927SAndroid Build Coastguard Worker };
458*61046927SAndroid Build Coastguard Worker
459*61046927SAndroid Build Coastguard Worker static const int extra_ARB_shader_storage_buffer_object_es31[] = {
460*61046927SAndroid Build Coastguard Worker EXT(ARB_shader_storage_buffer_object),
461*61046927SAndroid Build Coastguard Worker EXTRA_API_ES31,
462*61046927SAndroid Build Coastguard Worker EXTRA_END
463*61046927SAndroid Build Coastguard Worker };
464*61046927SAndroid Build Coastguard Worker
465*61046927SAndroid Build Coastguard Worker static const int extra_ARB_shader_storage_buffer_object_and_geometry_shader[] = {
466*61046927SAndroid Build Coastguard Worker EXTRA_EXT_SSBO_GS,
467*61046927SAndroid Build Coastguard Worker EXTRA_END
468*61046927SAndroid Build Coastguard Worker };
469*61046927SAndroid Build Coastguard Worker
470*61046927SAndroid Build Coastguard Worker static const int extra_ARB_shader_image_load_store_shader_storage_buffer_object_es31[] = {
471*61046927SAndroid Build Coastguard Worker EXT(ARB_shader_image_load_store),
472*61046927SAndroid Build Coastguard Worker EXT(ARB_shader_storage_buffer_object),
473*61046927SAndroid Build Coastguard Worker EXTRA_API_ES31,
474*61046927SAndroid Build Coastguard Worker EXTRA_END
475*61046927SAndroid Build Coastguard Worker };
476*61046927SAndroid Build Coastguard Worker
477*61046927SAndroid Build Coastguard Worker static const int extra_ARB_framebuffer_no_attachments_and_geometry_shader[] = {
478*61046927SAndroid Build Coastguard Worker EXTRA_EXT_FB_NO_ATTACH_GS,
479*61046927SAndroid Build Coastguard Worker EXTRA_END
480*61046927SAndroid Build Coastguard Worker };
481*61046927SAndroid Build Coastguard Worker
482*61046927SAndroid Build Coastguard Worker static const int extra_ARB_viewport_array_or_oes_geometry_shader[] = {
483*61046927SAndroid Build Coastguard Worker EXT(ARB_viewport_array),
484*61046927SAndroid Build Coastguard Worker EXTRA_EXT_ES_GS,
485*61046927SAndroid Build Coastguard Worker EXTRA_END
486*61046927SAndroid Build Coastguard Worker };
487*61046927SAndroid Build Coastguard Worker
488*61046927SAndroid Build Coastguard Worker static const int extra_ARB_viewport_array_or_oes_viewport_array[] = {
489*61046927SAndroid Build Coastguard Worker EXT(ARB_viewport_array),
490*61046927SAndroid Build Coastguard Worker EXT(OES_viewport_array),
491*61046927SAndroid Build Coastguard Worker EXTRA_END
492*61046927SAndroid Build Coastguard Worker };
493*61046927SAndroid Build Coastguard Worker
494*61046927SAndroid Build Coastguard Worker static const int extra_ARB_gpu_shader5_or_oes_geometry_shader[] = {
495*61046927SAndroid Build Coastguard Worker EXT(ARB_gpu_shader5),
496*61046927SAndroid Build Coastguard Worker EXTRA_EXT_ES_GS,
497*61046927SAndroid Build Coastguard Worker EXTRA_END
498*61046927SAndroid Build Coastguard Worker };
499*61046927SAndroid Build Coastguard Worker
500*61046927SAndroid Build Coastguard Worker static const int extra_ARB_gpu_shader5_or_OES_sample_variables[] = {
501*61046927SAndroid Build Coastguard Worker EXT(ARB_gpu_shader5),
502*61046927SAndroid Build Coastguard Worker EXT(OES_sample_variables),
503*61046927SAndroid Build Coastguard Worker EXTRA_END
504*61046927SAndroid Build Coastguard Worker };
505*61046927SAndroid Build Coastguard Worker
506*61046927SAndroid Build Coastguard Worker static const int extra_ES32[] = {
507*61046927SAndroid Build Coastguard Worker EXT(ARB_ES3_2_compatibility),
508*61046927SAndroid Build Coastguard Worker EXTRA_API_ES32,
509*61046927SAndroid Build Coastguard Worker EXTRA_END
510*61046927SAndroid Build Coastguard Worker };
511*61046927SAndroid Build Coastguard Worker
512*61046927SAndroid Build Coastguard Worker static const int extra_KHR_robustness_or_GL[] = {
513*61046927SAndroid Build Coastguard Worker EXT(KHR_robustness),
514*61046927SAndroid Build Coastguard Worker EXTRA_API_GL,
515*61046927SAndroid Build Coastguard Worker EXTRA_API_GL_CORE,
516*61046927SAndroid Build Coastguard Worker EXTRA_END
517*61046927SAndroid Build Coastguard Worker };
518*61046927SAndroid Build Coastguard Worker
519*61046927SAndroid Build Coastguard Worker static const int extra_INTEL_conservative_rasterization[] = {
520*61046927SAndroid Build Coastguard Worker EXT(INTEL_conservative_rasterization),
521*61046927SAndroid Build Coastguard Worker EXTRA_END
522*61046927SAndroid Build Coastguard Worker };
523*61046927SAndroid Build Coastguard Worker
524*61046927SAndroid Build Coastguard Worker static const int extra_ARB_timer_query_or_EXT_disjoint_timer_query[] = {
525*61046927SAndroid Build Coastguard Worker EXT(ARB_timer_query),
526*61046927SAndroid Build Coastguard Worker EXT(EXT_disjoint_timer_query),
527*61046927SAndroid Build Coastguard Worker EXTRA_END
528*61046927SAndroid Build Coastguard Worker };
529*61046927SAndroid Build Coastguard Worker
530*61046927SAndroid Build Coastguard Worker static const int extra_ARB_framebuffer_object_or_EXT_framebuffer_multisample_or_EXT_multisampled_render_to_texture[] = {
531*61046927SAndroid Build Coastguard Worker EXT(ARB_framebuffer_object),
532*61046927SAndroid Build Coastguard Worker EXT(EXT_framebuffer_multisample),
533*61046927SAndroid Build Coastguard Worker EXT(EXT_multisampled_render_to_texture),
534*61046927SAndroid Build Coastguard Worker EXTRA_END
535*61046927SAndroid Build Coastguard Worker };
536*61046927SAndroid Build Coastguard Worker
537*61046927SAndroid Build Coastguard Worker EXTRA_EXT(EXT_texture_array);
538*61046927SAndroid Build Coastguard Worker EXTRA_EXT(NV_fog_distance);
539*61046927SAndroid Build Coastguard Worker EXTRA_EXT(EXT_texture_filter_anisotropic);
540*61046927SAndroid Build Coastguard Worker EXTRA_EXT(NV_texture_rectangle);
541*61046927SAndroid Build Coastguard Worker EXTRA_EXT(EXT_stencil_two_side);
542*61046927SAndroid Build Coastguard Worker EXTRA_EXT(EXT_depth_bounds_test);
543*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_depth_clamp);
544*61046927SAndroid Build Coastguard Worker EXTRA_EXT(AMD_depth_clamp_separate);
545*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ATI_fragment_shader);
546*61046927SAndroid Build Coastguard Worker EXTRA_EXT(EXT_provoking_vertex);
547*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_fragment_shader);
548*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_fragment_program);
549*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_seamless_cube_map);
550*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_sync);
551*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_vertex_shader);
552*61046927SAndroid Build Coastguard Worker EXTRA_EXT(EXT_transform_feedback);
553*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_transform_feedback3);
554*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_vertex_program);
555*61046927SAndroid Build Coastguard Worker EXTRA_EXT2(ARB_vertex_program, ARB_fragment_program);
556*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_color_buffer_float);
557*61046927SAndroid Build Coastguard Worker EXTRA_EXT(EXT_framebuffer_sRGB);
558*61046927SAndroid Build Coastguard Worker EXTRA_EXT(OES_EGL_image_external);
559*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_blend_func_extended);
560*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_uniform_buffer_object);
561*61046927SAndroid Build Coastguard Worker EXTRA_EXT2(ARB_texture_cube_map_array, OES_texture_cube_map_array);
562*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_texture_buffer_range);
563*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_texture_multisample);
564*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_texture_gather);
565*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_draw_indirect);
566*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_shader_image_load_store);
567*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_query_buffer_object);
568*61046927SAndroid Build Coastguard Worker EXTRA_EXT2(ARB_transform_feedback3, ARB_gpu_shader5);
569*61046927SAndroid Build Coastguard Worker EXTRA_EXT(INTEL_performance_query);
570*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_explicit_uniform_location);
571*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_clip_control);
572*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_polygon_offset_clamp);
573*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_framebuffer_no_attachments);
574*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_tessellation_shader);
575*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_shader_storage_buffer_object);
576*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_indirect_parameters);
577*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ATI_meminfo);
578*61046927SAndroid Build Coastguard Worker EXTRA_EXT(NVX_gpu_memory_info);
579*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_cull_distance);
580*61046927SAndroid Build Coastguard Worker EXTRA_EXT(EXT_window_rectangles);
581*61046927SAndroid Build Coastguard Worker EXTRA_EXT(KHR_blend_equation_advanced_coherent);
582*61046927SAndroid Build Coastguard Worker EXTRA_EXT(OES_primitive_bounding_box);
583*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_compute_variable_group_size);
584*61046927SAndroid Build Coastguard Worker EXTRA_EXT(KHR_robustness);
585*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_sparse_buffer);
586*61046927SAndroid Build Coastguard Worker EXTRA_EXT(NV_conservative_raster);
587*61046927SAndroid Build Coastguard Worker EXTRA_EXT(NV_conservative_raster_dilate);
588*61046927SAndroid Build Coastguard Worker EXTRA_EXT(NV_conservative_raster_pre_snap_triangles);
589*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_sample_locations);
590*61046927SAndroid Build Coastguard Worker EXTRA_EXT(AMD_framebuffer_multisample_advanced);
591*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_spirv_extensions);
592*61046927SAndroid Build Coastguard Worker EXTRA_EXT(NV_viewport_swizzle);
593*61046927SAndroid Build Coastguard Worker EXTRA_EXT(ARB_sparse_texture);
594*61046927SAndroid Build Coastguard Worker EXTRA_EXT(KHR_shader_subgroup);
595*61046927SAndroid Build Coastguard Worker
596*61046927SAndroid Build Coastguard Worker static const int extra_ARB_gl_spirv_or_es2_compat[] = {
597*61046927SAndroid Build Coastguard Worker EXT(ARB_gl_spirv),
598*61046927SAndroid Build Coastguard Worker EXT(ARB_ES2_compatibility),
599*61046927SAndroid Build Coastguard Worker EXTRA_API_ES2,
600*61046927SAndroid Build Coastguard Worker EXTRA_END
601*61046927SAndroid Build Coastguard Worker };
602*61046927SAndroid Build Coastguard Worker
603*61046927SAndroid Build Coastguard Worker static const int
604*61046927SAndroid Build Coastguard Worker extra_ARB_color_buffer_float_or_glcore[] = {
605*61046927SAndroid Build Coastguard Worker EXT(ARB_color_buffer_float),
606*61046927SAndroid Build Coastguard Worker EXTRA_API_GL_CORE,
607*61046927SAndroid Build Coastguard Worker EXTRA_END
608*61046927SAndroid Build Coastguard Worker };
609*61046927SAndroid Build Coastguard Worker
610*61046927SAndroid Build Coastguard Worker static const int
611*61046927SAndroid Build Coastguard Worker extra_NV_primitive_restart[] = {
612*61046927SAndroid Build Coastguard Worker EXT(NV_primitive_restart),
613*61046927SAndroid Build Coastguard Worker EXTRA_END
614*61046927SAndroid Build Coastguard Worker };
615*61046927SAndroid Build Coastguard Worker
616*61046927SAndroid Build Coastguard Worker static const int extra_version_30[] = { EXTRA_VERSION_30, EXTRA_END };
617*61046927SAndroid Build Coastguard Worker static const int extra_version_31[] = { EXTRA_VERSION_31, EXTRA_END };
618*61046927SAndroid Build Coastguard Worker static const int extra_version_32[] = { EXTRA_VERSION_32, EXTRA_END };
619*61046927SAndroid Build Coastguard Worker static const int extra_version_43[] = { EXTRA_VERSION_43, EXTRA_END };
620*61046927SAndroid Build Coastguard Worker
621*61046927SAndroid Build Coastguard Worker static const int extra_gl30_es3[] = {
622*61046927SAndroid Build Coastguard Worker EXTRA_VERSION_30,
623*61046927SAndroid Build Coastguard Worker EXTRA_API_ES3,
624*61046927SAndroid Build Coastguard Worker EXTRA_END,
625*61046927SAndroid Build Coastguard Worker };
626*61046927SAndroid Build Coastguard Worker
627*61046927SAndroid Build Coastguard Worker static const int extra_gl32_es3[] = {
628*61046927SAndroid Build Coastguard Worker EXTRA_VERSION_32,
629*61046927SAndroid Build Coastguard Worker EXTRA_API_ES3,
630*61046927SAndroid Build Coastguard Worker EXTRA_END,
631*61046927SAndroid Build Coastguard Worker };
632*61046927SAndroid Build Coastguard Worker
633*61046927SAndroid Build Coastguard Worker static const int extra_version_32_OES_geometry_shader[] = {
634*61046927SAndroid Build Coastguard Worker EXTRA_VERSION_32,
635*61046927SAndroid Build Coastguard Worker EXTRA_EXT_ES_GS,
636*61046927SAndroid Build Coastguard Worker EXTRA_END
637*61046927SAndroid Build Coastguard Worker };
638*61046927SAndroid Build Coastguard Worker
639*61046927SAndroid Build Coastguard Worker static const int extra_gl40_ARB_sample_shading[] = {
640*61046927SAndroid Build Coastguard Worker EXTRA_VERSION_40,
641*61046927SAndroid Build Coastguard Worker EXT(ARB_sample_shading),
642*61046927SAndroid Build Coastguard Worker EXTRA_END
643*61046927SAndroid Build Coastguard Worker };
644*61046927SAndroid Build Coastguard Worker
645*61046927SAndroid Build Coastguard Worker static const int
646*61046927SAndroid Build Coastguard Worker extra_ARB_vertex_program_api_es2[] = {
647*61046927SAndroid Build Coastguard Worker EXT(ARB_vertex_program),
648*61046927SAndroid Build Coastguard Worker EXTRA_API_ES2,
649*61046927SAndroid Build Coastguard Worker EXTRA_END
650*61046927SAndroid Build Coastguard Worker };
651*61046927SAndroid Build Coastguard Worker
652*61046927SAndroid Build Coastguard Worker /* The ReadBuffer get token is valid under either full GL or under
653*61046927SAndroid Build Coastguard Worker * GLES2 if the NV_read_buffer extension is available. */
654*61046927SAndroid Build Coastguard Worker static const int
655*61046927SAndroid Build Coastguard Worker extra_NV_read_buffer_api_gl[] = {
656*61046927SAndroid Build Coastguard Worker EXTRA_API_ES2,
657*61046927SAndroid Build Coastguard Worker EXTRA_API_GL,
658*61046927SAndroid Build Coastguard Worker EXTRA_END
659*61046927SAndroid Build Coastguard Worker };
660*61046927SAndroid Build Coastguard Worker
661*61046927SAndroid Build Coastguard Worker static const int extra_core_ARB_color_buffer_float_and_new_buffers[] = {
662*61046927SAndroid Build Coastguard Worker EXTRA_API_GL_CORE,
663*61046927SAndroid Build Coastguard Worker EXT(ARB_color_buffer_float),
664*61046927SAndroid Build Coastguard Worker EXTRA_NEW_BUFFERS,
665*61046927SAndroid Build Coastguard Worker EXTRA_END
666*61046927SAndroid Build Coastguard Worker };
667*61046927SAndroid Build Coastguard Worker
668*61046927SAndroid Build Coastguard Worker static const int extra_EXT_shader_framebuffer_fetch[] = {
669*61046927SAndroid Build Coastguard Worker EXTRA_API_ES2,
670*61046927SAndroid Build Coastguard Worker EXTRA_API_ES3,
671*61046927SAndroid Build Coastguard Worker EXT(EXT_shader_framebuffer_fetch),
672*61046927SAndroid Build Coastguard Worker EXTRA_END
673*61046927SAndroid Build Coastguard Worker };
674*61046927SAndroid Build Coastguard Worker
675*61046927SAndroid Build Coastguard Worker static const int extra_EXT_provoking_vertex_32[] = {
676*61046927SAndroid Build Coastguard Worker EXTRA_EXT_PROVOKING_VERTEX_32,
677*61046927SAndroid Build Coastguard Worker EXTRA_END
678*61046927SAndroid Build Coastguard Worker };
679*61046927SAndroid Build Coastguard Worker
680*61046927SAndroid Build Coastguard Worker static const int extra_EXT_disjoint_timer_query[] = {
681*61046927SAndroid Build Coastguard Worker EXTRA_API_ES2,
682*61046927SAndroid Build Coastguard Worker EXTRA_API_ES3,
683*61046927SAndroid Build Coastguard Worker EXT(EXT_disjoint_timer_query),
684*61046927SAndroid Build Coastguard Worker EXTRA_END
685*61046927SAndroid Build Coastguard Worker };
686*61046927SAndroid Build Coastguard Worker
687*61046927SAndroid Build Coastguard Worker
688*61046927SAndroid Build Coastguard Worker /* This is the big table describing all the enums we accept in
689*61046927SAndroid Build Coastguard Worker * glGet*v(). The table is partitioned into six parts: enums
690*61046927SAndroid Build Coastguard Worker * understood by all GL APIs (OpenGL, GLES and GLES2), enums shared
691*61046927SAndroid Build Coastguard Worker * between OpenGL and GLES, enums exclusive to GLES, etc for the
692*61046927SAndroid Build Coastguard Worker * remaining combinations. To look up the enums valid in a given API
693*61046927SAndroid Build Coastguard Worker * we will use a hash table specific to that API. These tables are in
694*61046927SAndroid Build Coastguard Worker * turn generated at build time and included through get_hash.h.
695*61046927SAndroid Build Coastguard Worker */
696*61046927SAndroid Build Coastguard Worker
697*61046927SAndroid Build Coastguard Worker #include "get_hash.h"
698*61046927SAndroid Build Coastguard Worker
699*61046927SAndroid Build Coastguard Worker /* All we need now is a way to look up the value struct from the enum.
700*61046927SAndroid Build Coastguard Worker * The code generated by gcc for the old generated big switch
701*61046927SAndroid Build Coastguard Worker * statement is a big, balanced, open coded if/else tree, essentially
702*61046927SAndroid Build Coastguard Worker * an unrolled binary search. It would be natural to sort the new
703*61046927SAndroid Build Coastguard Worker * enum table and use bsearch(), but we will use a read-only hash
704*61046927SAndroid Build Coastguard Worker * table instead. bsearch() has a nice guaranteed worst case
705*61046927SAndroid Build Coastguard Worker * performance, but we're also guaranteed to hit that worst case
706*61046927SAndroid Build Coastguard Worker * (log2(n) iterations) for about half the enums. Instead, using an
707*61046927SAndroid Build Coastguard Worker * open addressing hash table, we can find the enum on the first try
708*61046927SAndroid Build Coastguard Worker * for 80% of the enums, 1 collision for 10% and never more than 5
709*61046927SAndroid Build Coastguard Worker * collisions for any enum (typical numbers). And the code is very
710*61046927SAndroid Build Coastguard Worker * simple, even though it feels a little magic. */
711*61046927SAndroid Build Coastguard Worker
712*61046927SAndroid Build Coastguard Worker /**
713*61046927SAndroid Build Coastguard Worker * Handle irregular enums
714*61046927SAndroid Build Coastguard Worker *
715*61046927SAndroid Build Coastguard Worker * Some values don't conform to the "well-known type at context
716*61046927SAndroid Build Coastguard Worker * pointer + offset" pattern, so we have this function to catch all
717*61046927SAndroid Build Coastguard Worker * the corner cases. Typically, it's a computed value or a one-off
718*61046927SAndroid Build Coastguard Worker * pointer to a custom struct or something.
719*61046927SAndroid Build Coastguard Worker *
720*61046927SAndroid Build Coastguard Worker * In this case we can't return a pointer to the value, so we'll have
721*61046927SAndroid Build Coastguard Worker * to use the temporary variable 'v' declared back in the calling
722*61046927SAndroid Build Coastguard Worker * glGet*v() function to store the result.
723*61046927SAndroid Build Coastguard Worker *
724*61046927SAndroid Build Coastguard Worker * \param ctx the current context
725*61046927SAndroid Build Coastguard Worker * \param d the struct value_desc that describes the enum
726*61046927SAndroid Build Coastguard Worker * \param v pointer to the tmp declared in the calling glGet*v() function
727*61046927SAndroid Build Coastguard Worker */
728*61046927SAndroid Build Coastguard Worker static void
find_custom_value(struct gl_context * ctx,const struct value_desc * d,union value * v)729*61046927SAndroid Build Coastguard Worker find_custom_value(struct gl_context *ctx, const struct value_desc *d, union value *v)
730*61046927SAndroid Build Coastguard Worker {
731*61046927SAndroid Build Coastguard Worker struct gl_buffer_object **buffer_obj, *buf;
732*61046927SAndroid Build Coastguard Worker struct gl_array_attributes *array;
733*61046927SAndroid Build Coastguard Worker GLuint unit, *p;
734*61046927SAndroid Build Coastguard Worker
735*61046927SAndroid Build Coastguard Worker switch (d->pname) {
736*61046927SAndroid Build Coastguard Worker case GL_MAJOR_VERSION:
737*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Version / 10;
738*61046927SAndroid Build Coastguard Worker break;
739*61046927SAndroid Build Coastguard Worker case GL_MINOR_VERSION:
740*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Version % 10;
741*61046927SAndroid Build Coastguard Worker break;
742*61046927SAndroid Build Coastguard Worker
743*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_1D:
744*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D:
745*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_3D:
746*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP:
747*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RECTANGLE_NV:
748*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_EXTERNAL_OES:
749*61046927SAndroid Build Coastguard Worker v->value_bool = _mesa_IsEnabled(d->pname);
750*61046927SAndroid Build Coastguard Worker break;
751*61046927SAndroid Build Coastguard Worker
752*61046927SAndroid Build Coastguard Worker case GL_LINE_STIPPLE_PATTERN:
753*61046927SAndroid Build Coastguard Worker /* This is the only GLushort, special case it here by promoting
754*61046927SAndroid Build Coastguard Worker * to an int rather than introducing a new type. */
755*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Line.StipplePattern;
756*61046927SAndroid Build Coastguard Worker break;
757*61046927SAndroid Build Coastguard Worker
758*61046927SAndroid Build Coastguard Worker case GL_CURRENT_RASTER_TEXTURE_COORDS:
759*61046927SAndroid Build Coastguard Worker unit = ctx->Texture.CurrentUnit;
760*61046927SAndroid Build Coastguard Worker v->value_float_4[0] = ctx->Current.RasterTexCoords[unit][0];
761*61046927SAndroid Build Coastguard Worker v->value_float_4[1] = ctx->Current.RasterTexCoords[unit][1];
762*61046927SAndroid Build Coastguard Worker v->value_float_4[2] = ctx->Current.RasterTexCoords[unit][2];
763*61046927SAndroid Build Coastguard Worker v->value_float_4[3] = ctx->Current.RasterTexCoords[unit][3];
764*61046927SAndroid Build Coastguard Worker break;
765*61046927SAndroid Build Coastguard Worker
766*61046927SAndroid Build Coastguard Worker case GL_CURRENT_TEXTURE_COORDS:
767*61046927SAndroid Build Coastguard Worker unit = ctx->Texture.CurrentUnit;
768*61046927SAndroid Build Coastguard Worker v->value_float_4[0] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][0];
769*61046927SAndroid Build Coastguard Worker v->value_float_4[1] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][1];
770*61046927SAndroid Build Coastguard Worker v->value_float_4[2] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][2];
771*61046927SAndroid Build Coastguard Worker v->value_float_4[3] = ctx->Current.Attrib[VERT_ATTRIB_TEX0 + unit][3];
772*61046927SAndroid Build Coastguard Worker break;
773*61046927SAndroid Build Coastguard Worker
774*61046927SAndroid Build Coastguard Worker case GL_COLOR_WRITEMASK:
775*61046927SAndroid Build Coastguard Worker v->value_int_4[0] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 0);
776*61046927SAndroid Build Coastguard Worker v->value_int_4[1] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 1);
777*61046927SAndroid Build Coastguard Worker v->value_int_4[2] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 2);
778*61046927SAndroid Build Coastguard Worker v->value_int_4[3] = GET_COLORMASK_BIT(ctx->Color.ColorMask, 0, 3);
779*61046927SAndroid Build Coastguard Worker break;
780*61046927SAndroid Build Coastguard Worker
781*61046927SAndroid Build Coastguard Worker case GL_DEPTH_CLAMP:
782*61046927SAndroid Build Coastguard Worker v->value_bool = ctx->Transform.DepthClampNear || ctx->Transform.DepthClampFar;
783*61046927SAndroid Build Coastguard Worker break;
784*61046927SAndroid Build Coastguard Worker
785*61046927SAndroid Build Coastguard Worker case GL_EDGE_FLAG:
786*61046927SAndroid Build Coastguard Worker v->value_bool = ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG][0] == 1.0F;
787*61046927SAndroid Build Coastguard Worker break;
788*61046927SAndroid Build Coastguard Worker
789*61046927SAndroid Build Coastguard Worker case GL_READ_BUFFER:
790*61046927SAndroid Build Coastguard Worker v->value_enum16 = ctx->ReadBuffer->ColorReadBuffer;
791*61046927SAndroid Build Coastguard Worker break;
792*61046927SAndroid Build Coastguard Worker
793*61046927SAndroid Build Coastguard Worker case GL_MAP2_GRID_DOMAIN:
794*61046927SAndroid Build Coastguard Worker v->value_float_4[0] = ctx->Eval.MapGrid2u1;
795*61046927SAndroid Build Coastguard Worker v->value_float_4[1] = ctx->Eval.MapGrid2u2;
796*61046927SAndroid Build Coastguard Worker v->value_float_4[2] = ctx->Eval.MapGrid2v1;
797*61046927SAndroid Build Coastguard Worker v->value_float_4[3] = ctx->Eval.MapGrid2v2;
798*61046927SAndroid Build Coastguard Worker break;
799*61046927SAndroid Build Coastguard Worker
800*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_STACK_DEPTH:
801*61046927SAndroid Build Coastguard Worker unit = ctx->Texture.CurrentUnit;
802*61046927SAndroid Build Coastguard Worker v->value_int = ctx->TextureMatrixStack[unit].Depth + 1;
803*61046927SAndroid Build Coastguard Worker break;
804*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MATRIX:
805*61046927SAndroid Build Coastguard Worker unit = ctx->Texture.CurrentUnit;
806*61046927SAndroid Build Coastguard Worker v->value_matrix = ctx->TextureMatrixStack[unit].Top;
807*61046927SAndroid Build Coastguard Worker break;
808*61046927SAndroid Build Coastguard Worker
809*61046927SAndroid Build Coastguard Worker case GL_VERTEX_ARRAY:
810*61046927SAndroid Build Coastguard Worker v->value_bool = !!(ctx->Array.VAO->Enabled & VERT_BIT_POS);
811*61046927SAndroid Build Coastguard Worker break;
812*61046927SAndroid Build Coastguard Worker case GL_NORMAL_ARRAY:
813*61046927SAndroid Build Coastguard Worker v->value_bool = !!(ctx->Array.VAO->Enabled & VERT_BIT_NORMAL);
814*61046927SAndroid Build Coastguard Worker break;
815*61046927SAndroid Build Coastguard Worker case GL_COLOR_ARRAY:
816*61046927SAndroid Build Coastguard Worker v->value_bool = !!(ctx->Array.VAO->Enabled & VERT_BIT_COLOR0);
817*61046927SAndroid Build Coastguard Worker break;
818*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COORD_ARRAY:
819*61046927SAndroid Build Coastguard Worker v->value_bool = !!(ctx->Array.VAO->Enabled & VERT_BIT_TEX(ctx->Array.ActiveTexture));
820*61046927SAndroid Build Coastguard Worker break;
821*61046927SAndroid Build Coastguard Worker case GL_INDEX_ARRAY:
822*61046927SAndroid Build Coastguard Worker v->value_bool = !!(ctx->Array.VAO->Enabled & VERT_BIT_COLOR_INDEX);
823*61046927SAndroid Build Coastguard Worker break;
824*61046927SAndroid Build Coastguard Worker case GL_EDGE_FLAG_ARRAY:
825*61046927SAndroid Build Coastguard Worker v->value_bool = !!(ctx->Array.VAO->Enabled & VERT_BIT_EDGEFLAG);
826*61046927SAndroid Build Coastguard Worker break;
827*61046927SAndroid Build Coastguard Worker case GL_SECONDARY_COLOR_ARRAY:
828*61046927SAndroid Build Coastguard Worker v->value_bool = !!(ctx->Array.VAO->Enabled & VERT_BIT_COLOR1);
829*61046927SAndroid Build Coastguard Worker break;
830*61046927SAndroid Build Coastguard Worker case GL_FOG_COORDINATE_ARRAY:
831*61046927SAndroid Build Coastguard Worker v->value_bool = !!(ctx->Array.VAO->Enabled & VERT_BIT_FOG);
832*61046927SAndroid Build Coastguard Worker break;
833*61046927SAndroid Build Coastguard Worker case GL_POINT_SIZE_ARRAY_OES:
834*61046927SAndroid Build Coastguard Worker v->value_bool = !!(ctx->Array.VAO->Enabled & VERT_BIT_POINT_SIZE);
835*61046927SAndroid Build Coastguard Worker break;
836*61046927SAndroid Build Coastguard Worker
837*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COORD_ARRAY_TYPE:
838*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COORD_ARRAY_STRIDE:
839*61046927SAndroid Build Coastguard Worker array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)];
840*61046927SAndroid Build Coastguard Worker v->value_int = *(GLuint *) ((char *) array + d->offset);
841*61046927SAndroid Build Coastguard Worker break;
842*61046927SAndroid Build Coastguard Worker
843*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COORD_ARRAY_SIZE:
844*61046927SAndroid Build Coastguard Worker array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)];
845*61046927SAndroid Build Coastguard Worker v->value_int = array->Format.User.Size;
846*61046927SAndroid Build Coastguard Worker break;
847*61046927SAndroid Build Coastguard Worker
848*61046927SAndroid Build Coastguard Worker case GL_VERTEX_ARRAY_SIZE:
849*61046927SAndroid Build Coastguard Worker array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_POS];
850*61046927SAndroid Build Coastguard Worker v->value_int = array->Format.User.Size;
851*61046927SAndroid Build Coastguard Worker break;
852*61046927SAndroid Build Coastguard Worker
853*61046927SAndroid Build Coastguard Worker case GL_ACTIVE_TEXTURE_ARB:
854*61046927SAndroid Build Coastguard Worker v->value_int = GL_TEXTURE0_ARB + ctx->Texture.CurrentUnit;
855*61046927SAndroid Build Coastguard Worker break;
856*61046927SAndroid Build Coastguard Worker case GL_CLIENT_ACTIVE_TEXTURE_ARB:
857*61046927SAndroid Build Coastguard Worker v->value_int = GL_TEXTURE0_ARB + ctx->Array.ActiveTexture;
858*61046927SAndroid Build Coastguard Worker break;
859*61046927SAndroid Build Coastguard Worker
860*61046927SAndroid Build Coastguard Worker case GL_MODELVIEW_STACK_DEPTH:
861*61046927SAndroid Build Coastguard Worker case GL_PROJECTION_STACK_DEPTH:
862*61046927SAndroid Build Coastguard Worker v->value_int = *(GLint *) ((char *) ctx + d->offset) + 1;
863*61046927SAndroid Build Coastguard Worker break;
864*61046927SAndroid Build Coastguard Worker
865*61046927SAndroid Build Coastguard Worker case GL_MAX_TEXTURE_SIZE:
866*61046927SAndroid Build Coastguard Worker case GL_MAX_3D_TEXTURE_SIZE:
867*61046927SAndroid Build Coastguard Worker case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:
868*61046927SAndroid Build Coastguard Worker p = (GLuint *) ((char *) ctx + d->offset);
869*61046927SAndroid Build Coastguard Worker v->value_int = 1 << (*p - 1);
870*61046927SAndroid Build Coastguard Worker break;
871*61046927SAndroid Build Coastguard Worker
872*61046927SAndroid Build Coastguard Worker case GL_SCISSOR_BOX:
873*61046927SAndroid Build Coastguard Worker v->value_int_4[0] = ctx->Scissor.ScissorArray[0].X;
874*61046927SAndroid Build Coastguard Worker v->value_int_4[1] = ctx->Scissor.ScissorArray[0].Y;
875*61046927SAndroid Build Coastguard Worker v->value_int_4[2] = ctx->Scissor.ScissorArray[0].Width;
876*61046927SAndroid Build Coastguard Worker v->value_int_4[3] = ctx->Scissor.ScissorArray[0].Height;
877*61046927SAndroid Build Coastguard Worker break;
878*61046927SAndroid Build Coastguard Worker
879*61046927SAndroid Build Coastguard Worker case GL_SCISSOR_TEST:
880*61046927SAndroid Build Coastguard Worker v->value_bool = ctx->Scissor.EnableFlags & 1;
881*61046927SAndroid Build Coastguard Worker break;
882*61046927SAndroid Build Coastguard Worker
883*61046927SAndroid Build Coastguard Worker case GL_LIST_INDEX:
884*61046927SAndroid Build Coastguard Worker v->value_int =
885*61046927SAndroid Build Coastguard Worker ctx->ListState.CurrentList ? ctx->ListState.CurrentList->Name : 0;
886*61046927SAndroid Build Coastguard Worker break;
887*61046927SAndroid Build Coastguard Worker case GL_LIST_MODE:
888*61046927SAndroid Build Coastguard Worker if (!ctx->CompileFlag)
889*61046927SAndroid Build Coastguard Worker v->value_enum16 = 0;
890*61046927SAndroid Build Coastguard Worker else if (ctx->ExecuteFlag)
891*61046927SAndroid Build Coastguard Worker v->value_enum16 = GL_COMPILE_AND_EXECUTE;
892*61046927SAndroid Build Coastguard Worker else
893*61046927SAndroid Build Coastguard Worker v->value_enum16 = GL_COMPILE;
894*61046927SAndroid Build Coastguard Worker break;
895*61046927SAndroid Build Coastguard Worker
896*61046927SAndroid Build Coastguard Worker case GL_VIEWPORT:
897*61046927SAndroid Build Coastguard Worker v->value_float_4[0] = ctx->ViewportArray[0].X;
898*61046927SAndroid Build Coastguard Worker v->value_float_4[1] = ctx->ViewportArray[0].Y;
899*61046927SAndroid Build Coastguard Worker v->value_float_4[2] = ctx->ViewportArray[0].Width;
900*61046927SAndroid Build Coastguard Worker v->value_float_4[3] = ctx->ViewportArray[0].Height;
901*61046927SAndroid Build Coastguard Worker break;
902*61046927SAndroid Build Coastguard Worker
903*61046927SAndroid Build Coastguard Worker case GL_DEPTH_RANGE:
904*61046927SAndroid Build Coastguard Worker v->value_double_2[0] = ctx->ViewportArray[0].Near;
905*61046927SAndroid Build Coastguard Worker v->value_double_2[1] = ctx->ViewportArray[0].Far;
906*61046927SAndroid Build Coastguard Worker break;
907*61046927SAndroid Build Coastguard Worker
908*61046927SAndroid Build Coastguard Worker case GL_ACTIVE_STENCIL_FACE_EXT:
909*61046927SAndroid Build Coastguard Worker v->value_enum16 = ctx->Stencil.ActiveFace ? GL_BACK : GL_FRONT;
910*61046927SAndroid Build Coastguard Worker break;
911*61046927SAndroid Build Coastguard Worker
912*61046927SAndroid Build Coastguard Worker case GL_STENCIL_FAIL:
913*61046927SAndroid Build Coastguard Worker v->value_enum16 = ctx->Stencil.FailFunc[ctx->Stencil.ActiveFace];
914*61046927SAndroid Build Coastguard Worker break;
915*61046927SAndroid Build Coastguard Worker case GL_STENCIL_FUNC:
916*61046927SAndroid Build Coastguard Worker v->value_enum16 = ctx->Stencil.Function[ctx->Stencil.ActiveFace];
917*61046927SAndroid Build Coastguard Worker break;
918*61046927SAndroid Build Coastguard Worker case GL_STENCIL_PASS_DEPTH_FAIL:
919*61046927SAndroid Build Coastguard Worker v->value_enum16 = ctx->Stencil.ZFailFunc[ctx->Stencil.ActiveFace];
920*61046927SAndroid Build Coastguard Worker break;
921*61046927SAndroid Build Coastguard Worker case GL_STENCIL_PASS_DEPTH_PASS:
922*61046927SAndroid Build Coastguard Worker v->value_enum16 = ctx->Stencil.ZPassFunc[ctx->Stencil.ActiveFace];
923*61046927SAndroid Build Coastguard Worker break;
924*61046927SAndroid Build Coastguard Worker case GL_STENCIL_REF:
925*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_get_stencil_ref(ctx, ctx->Stencil.ActiveFace);
926*61046927SAndroid Build Coastguard Worker break;
927*61046927SAndroid Build Coastguard Worker case GL_STENCIL_BACK_REF:
928*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_get_stencil_ref(ctx, 1);
929*61046927SAndroid Build Coastguard Worker break;
930*61046927SAndroid Build Coastguard Worker case GL_STENCIL_VALUE_MASK:
931*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Stencil.ValueMask[ctx->Stencil.ActiveFace];
932*61046927SAndroid Build Coastguard Worker break;
933*61046927SAndroid Build Coastguard Worker case GL_STENCIL_WRITEMASK:
934*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Stencil.WriteMask[ctx->Stencil.ActiveFace];
935*61046927SAndroid Build Coastguard Worker break;
936*61046927SAndroid Build Coastguard Worker
937*61046927SAndroid Build Coastguard Worker case GL_NUM_EXTENSIONS:
938*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_get_extension_count(ctx);
939*61046927SAndroid Build Coastguard Worker break;
940*61046927SAndroid Build Coastguard Worker
941*61046927SAndroid Build Coastguard Worker case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
942*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_get_color_read_type(ctx, NULL, "glGetIntegerv");
943*61046927SAndroid Build Coastguard Worker break;
944*61046927SAndroid Build Coastguard Worker case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
945*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_get_color_read_format(ctx, NULL, "glGetIntegerv");
946*61046927SAndroid Build Coastguard Worker break;
947*61046927SAndroid Build Coastguard Worker
948*61046927SAndroid Build Coastguard Worker case GL_CURRENT_MATRIX_STACK_DEPTH_ARB:
949*61046927SAndroid Build Coastguard Worker v->value_int = ctx->CurrentStack->Depth + 1;
950*61046927SAndroid Build Coastguard Worker break;
951*61046927SAndroid Build Coastguard Worker case GL_CURRENT_MATRIX_ARB:
952*61046927SAndroid Build Coastguard Worker case GL_TRANSPOSE_CURRENT_MATRIX_ARB:
953*61046927SAndroid Build Coastguard Worker v->value_matrix = ctx->CurrentStack->Top;
954*61046927SAndroid Build Coastguard Worker break;
955*61046927SAndroid Build Coastguard Worker
956*61046927SAndroid Build Coastguard Worker case GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB:
957*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_get_compressed_formats(ctx, NULL);
958*61046927SAndroid Build Coastguard Worker break;
959*61046927SAndroid Build Coastguard Worker case GL_COMPRESSED_TEXTURE_FORMATS_ARB:
960*61046927SAndroid Build Coastguard Worker v->value_int_n.n =
961*61046927SAndroid Build Coastguard Worker _mesa_get_compressed_formats(ctx, v->value_int_n.ints);
962*61046927SAndroid Build Coastguard Worker assert(v->value_int_n.n <= (int) ARRAY_SIZE(v->value_int_n.ints));
963*61046927SAndroid Build Coastguard Worker break;
964*61046927SAndroid Build Coastguard Worker
965*61046927SAndroid Build Coastguard Worker case GL_MAX_VARYING_FLOATS_ARB:
966*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Const.MaxVarying * 4;
967*61046927SAndroid Build Coastguard Worker break;
968*61046927SAndroid Build Coastguard Worker
969*61046927SAndroid Build Coastguard Worker /* Various object names */
970*61046927SAndroid Build Coastguard Worker
971*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_1D:
972*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_2D:
973*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_3D:
974*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_1D_ARRAY_EXT:
975*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_2D_ARRAY_EXT:
976*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_CUBE_MAP_ARB:
977*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_RECTANGLE_NV:
978*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_EXTERNAL_OES:
979*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
980*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
981*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
982*61046927SAndroid Build Coastguard Worker unit = ctx->Texture.CurrentUnit;
983*61046927SAndroid Build Coastguard Worker v->value_int =
984*61046927SAndroid Build Coastguard Worker ctx->Texture.Unit[unit].CurrentTex[d->offset]->Name;
985*61046927SAndroid Build Coastguard Worker break;
986*61046927SAndroid Build Coastguard Worker
987*61046927SAndroid Build Coastguard Worker /* GL_EXT_external_objects */
988*61046927SAndroid Build Coastguard Worker case GL_NUM_DEVICE_UUIDS_EXT:
989*61046927SAndroid Build Coastguard Worker v->value_int = 1;
990*61046927SAndroid Build Coastguard Worker break;
991*61046927SAndroid Build Coastguard Worker case GL_DRIVER_UUID_EXT:
992*61046927SAndroid Build Coastguard Worker _mesa_get_driver_uuid(ctx, v->value_int_4);
993*61046927SAndroid Build Coastguard Worker break;
994*61046927SAndroid Build Coastguard Worker case GL_DEVICE_UUID_EXT:
995*61046927SAndroid Build Coastguard Worker _mesa_get_device_uuid(ctx, v->value_int_4);
996*61046927SAndroid Build Coastguard Worker break;
997*61046927SAndroid Build Coastguard Worker
998*61046927SAndroid Build Coastguard Worker /* GL_EXT_memory_object_win32 */
999*61046927SAndroid Build Coastguard Worker case GL_DEVICE_LUID_EXT:
1000*61046927SAndroid Build Coastguard Worker _mesa_get_device_luid(ctx, v->value_int_2);
1001*61046927SAndroid Build Coastguard Worker break;
1002*61046927SAndroid Build Coastguard Worker case GL_DEVICE_NODE_MASK_EXT:
1003*61046927SAndroid Build Coastguard Worker v->value_int = ctx->pipe->screen->get_device_node_mask(ctx->pipe->screen);
1004*61046927SAndroid Build Coastguard Worker break;
1005*61046927SAndroid Build Coastguard Worker
1006*61046927SAndroid Build Coastguard Worker /* GL_EXT_packed_float */
1007*61046927SAndroid Build Coastguard Worker case GL_RGBA_SIGNED_COMPONENTS_EXT:
1008*61046927SAndroid Build Coastguard Worker {
1009*61046927SAndroid Build Coastguard Worker /* Note: we only check the 0th color attachment. */
1010*61046927SAndroid Build Coastguard Worker const struct gl_renderbuffer *rb =
1011*61046927SAndroid Build Coastguard Worker ctx->DrawBuffer->_ColorDrawBuffers[0];
1012*61046927SAndroid Build Coastguard Worker if (rb && _mesa_is_format_signed(rb->Format)) {
1013*61046927SAndroid Build Coastguard Worker /* Issue 17 of GL_EXT_packed_float: If a component (such as
1014*61046927SAndroid Build Coastguard Worker * alpha) has zero bits, the component should not be considered
1015*61046927SAndroid Build Coastguard Worker * signed and so the bit for the respective component should be
1016*61046927SAndroid Build Coastguard Worker * zeroed.
1017*61046927SAndroid Build Coastguard Worker */
1018*61046927SAndroid Build Coastguard Worker GLint r_bits =
1019*61046927SAndroid Build Coastguard Worker _mesa_get_format_bits(rb->Format, GL_RED_BITS);
1020*61046927SAndroid Build Coastguard Worker GLint g_bits =
1021*61046927SAndroid Build Coastguard Worker _mesa_get_format_bits(rb->Format, GL_GREEN_BITS);
1022*61046927SAndroid Build Coastguard Worker GLint b_bits =
1023*61046927SAndroid Build Coastguard Worker _mesa_get_format_bits(rb->Format, GL_BLUE_BITS);
1024*61046927SAndroid Build Coastguard Worker GLint a_bits =
1025*61046927SAndroid Build Coastguard Worker _mesa_get_format_bits(rb->Format, GL_ALPHA_BITS);
1026*61046927SAndroid Build Coastguard Worker GLint l_bits =
1027*61046927SAndroid Build Coastguard Worker _mesa_get_format_bits(rb->Format, GL_TEXTURE_LUMINANCE_SIZE);
1028*61046927SAndroid Build Coastguard Worker GLint i_bits =
1029*61046927SAndroid Build Coastguard Worker _mesa_get_format_bits(rb->Format, GL_TEXTURE_INTENSITY_SIZE);
1030*61046927SAndroid Build Coastguard Worker
1031*61046927SAndroid Build Coastguard Worker v->value_int_4[0] = r_bits + l_bits + i_bits > 0;
1032*61046927SAndroid Build Coastguard Worker v->value_int_4[1] = g_bits + l_bits + i_bits > 0;
1033*61046927SAndroid Build Coastguard Worker v->value_int_4[2] = b_bits + l_bits + i_bits > 0;
1034*61046927SAndroid Build Coastguard Worker v->value_int_4[3] = a_bits + i_bits > 0;
1035*61046927SAndroid Build Coastguard Worker }
1036*61046927SAndroid Build Coastguard Worker else {
1037*61046927SAndroid Build Coastguard Worker v->value_int_4[0] =
1038*61046927SAndroid Build Coastguard Worker v->value_int_4[1] =
1039*61046927SAndroid Build Coastguard Worker v->value_int_4[2] =
1040*61046927SAndroid Build Coastguard Worker v->value_int_4[3] = 0;
1041*61046927SAndroid Build Coastguard Worker }
1042*61046927SAndroid Build Coastguard Worker }
1043*61046927SAndroid Build Coastguard Worker break;
1044*61046927SAndroid Build Coastguard Worker
1045*61046927SAndroid Build Coastguard Worker /* GL_ARB_vertex_buffer_object */
1046*61046927SAndroid Build Coastguard Worker case GL_VERTEX_ARRAY_BUFFER_BINDING_ARB:
1047*61046927SAndroid Build Coastguard Worker case GL_NORMAL_ARRAY_BUFFER_BINDING_ARB:
1048*61046927SAndroid Build Coastguard Worker case GL_COLOR_ARRAY_BUFFER_BINDING_ARB:
1049*61046927SAndroid Build Coastguard Worker case GL_INDEX_ARRAY_BUFFER_BINDING_ARB:
1050*61046927SAndroid Build Coastguard Worker case GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB:
1051*61046927SAndroid Build Coastguard Worker case GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB:
1052*61046927SAndroid Build Coastguard Worker case GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB:
1053*61046927SAndroid Build Coastguard Worker buffer_obj = (struct gl_buffer_object **)
1054*61046927SAndroid Build Coastguard Worker ((char *) ctx->Array.VAO + d->offset);
1055*61046927SAndroid Build Coastguard Worker v->value_int = (*buffer_obj) ? (*buffer_obj)->Name : 0;
1056*61046927SAndroid Build Coastguard Worker break;
1057*61046927SAndroid Build Coastguard Worker case GL_ARRAY_BUFFER_BINDING_ARB:
1058*61046927SAndroid Build Coastguard Worker buf = ctx->Array.ArrayBufferObj;
1059*61046927SAndroid Build Coastguard Worker v->value_int = buf ? buf->Name : 0;
1060*61046927SAndroid Build Coastguard Worker break;
1061*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB:
1062*61046927SAndroid Build Coastguard Worker buf = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].BufferObj;
1063*61046927SAndroid Build Coastguard Worker v->value_int = buf ? buf->Name : 0;
1064*61046927SAndroid Build Coastguard Worker break;
1065*61046927SAndroid Build Coastguard Worker case GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB:
1066*61046927SAndroid Build Coastguard Worker buf = ctx->Array.VAO->IndexBufferObj;
1067*61046927SAndroid Build Coastguard Worker v->value_int = buf ? buf->Name : 0;
1068*61046927SAndroid Build Coastguard Worker break;
1069*61046927SAndroid Build Coastguard Worker
1070*61046927SAndroid Build Coastguard Worker /* ARB_vertex_array_bgra */
1071*61046927SAndroid Build Coastguard Worker case GL_COLOR_ARRAY_SIZE:
1072*61046927SAndroid Build Coastguard Worker array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR0];
1073*61046927SAndroid Build Coastguard Worker v->value_int = array->Format.User.Bgra ? GL_BGRA : array->Format.User.Size;
1074*61046927SAndroid Build Coastguard Worker break;
1075*61046927SAndroid Build Coastguard Worker case GL_SECONDARY_COLOR_ARRAY_SIZE:
1076*61046927SAndroid Build Coastguard Worker array = &ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR1];
1077*61046927SAndroid Build Coastguard Worker v->value_int = array->Format.User.Bgra ? GL_BGRA : array->Format.User.Size;
1078*61046927SAndroid Build Coastguard Worker break;
1079*61046927SAndroid Build Coastguard Worker
1080*61046927SAndroid Build Coastguard Worker /* ARB_copy_buffer */
1081*61046927SAndroid Build Coastguard Worker case GL_COPY_READ_BUFFER:
1082*61046927SAndroid Build Coastguard Worker v->value_int = ctx->CopyReadBuffer ? ctx->CopyReadBuffer->Name : 0;
1083*61046927SAndroid Build Coastguard Worker break;
1084*61046927SAndroid Build Coastguard Worker case GL_COPY_WRITE_BUFFER:
1085*61046927SAndroid Build Coastguard Worker v->value_int = ctx->CopyWriteBuffer ? ctx->CopyWriteBuffer->Name : 0;
1086*61046927SAndroid Build Coastguard Worker break;
1087*61046927SAndroid Build Coastguard Worker
1088*61046927SAndroid Build Coastguard Worker case GL_PIXEL_PACK_BUFFER_BINDING_EXT:
1089*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Pack.BufferObj ? ctx->Pack.BufferObj->Name : 0;
1090*61046927SAndroid Build Coastguard Worker break;
1091*61046927SAndroid Build Coastguard Worker case GL_PIXEL_UNPACK_BUFFER_BINDING_EXT:
1092*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Unpack.BufferObj ? ctx->Unpack.BufferObj->Name : 0;
1093*61046927SAndroid Build Coastguard Worker break;
1094*61046927SAndroid Build Coastguard Worker case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
1095*61046927SAndroid Build Coastguard Worker v->value_int = ctx->TransformFeedback.CurrentBuffer ?
1096*61046927SAndroid Build Coastguard Worker ctx->TransformFeedback.CurrentBuffer->Name : 0;
1097*61046927SAndroid Build Coastguard Worker break;
1098*61046927SAndroid Build Coastguard Worker case GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED:
1099*61046927SAndroid Build Coastguard Worker v->value_int = ctx->TransformFeedback.CurrentObject->Paused;
1100*61046927SAndroid Build Coastguard Worker break;
1101*61046927SAndroid Build Coastguard Worker case GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE:
1102*61046927SAndroid Build Coastguard Worker v->value_int = ctx->TransformFeedback.CurrentObject->Active;
1103*61046927SAndroid Build Coastguard Worker break;
1104*61046927SAndroid Build Coastguard Worker case GL_TRANSFORM_FEEDBACK_BINDING:
1105*61046927SAndroid Build Coastguard Worker v->value_int = ctx->TransformFeedback.CurrentObject->Name;
1106*61046927SAndroid Build Coastguard Worker break;
1107*61046927SAndroid Build Coastguard Worker case GL_CURRENT_PROGRAM:
1108*61046927SAndroid Build Coastguard Worker /* The Changelog of the ARB_separate_shader_objects spec says:
1109*61046927SAndroid Build Coastguard Worker *
1110*61046927SAndroid Build Coastguard Worker * 24 25 Jul 2011 pbrown Remove the language erroneously deleting
1111*61046927SAndroid Build Coastguard Worker * CURRENT_PROGRAM. In the EXT extension, this
1112*61046927SAndroid Build Coastguard Worker * token was aliased to ACTIVE_PROGRAM_EXT, and
1113*61046927SAndroid Build Coastguard Worker * was used to indicate the last program set by
1114*61046927SAndroid Build Coastguard Worker * either ActiveProgramEXT or UseProgram. In
1115*61046927SAndroid Build Coastguard Worker * the ARB extension, the SSO active programs
1116*61046927SAndroid Build Coastguard Worker * are now program pipeline object state and
1117*61046927SAndroid Build Coastguard Worker * CURRENT_PROGRAM should still be used to query
1118*61046927SAndroid Build Coastguard Worker * the last program set by UseProgram (bug 7822).
1119*61046927SAndroid Build Coastguard Worker */
1120*61046927SAndroid Build Coastguard Worker v->value_int =
1121*61046927SAndroid Build Coastguard Worker ctx->Shader.ActiveProgram ? ctx->Shader.ActiveProgram->Name : 0;
1122*61046927SAndroid Build Coastguard Worker break;
1123*61046927SAndroid Build Coastguard Worker case GL_READ_FRAMEBUFFER_BINDING_EXT:
1124*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ReadBuffer->Name;
1125*61046927SAndroid Build Coastguard Worker break;
1126*61046927SAndroid Build Coastguard Worker case GL_RENDERBUFFER_BINDING_EXT:
1127*61046927SAndroid Build Coastguard Worker v->value_int =
1128*61046927SAndroid Build Coastguard Worker ctx->CurrentRenderbuffer ? ctx->CurrentRenderbuffer->Name : 0;
1129*61046927SAndroid Build Coastguard Worker break;
1130*61046927SAndroid Build Coastguard Worker case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
1131*61046927SAndroid Build Coastguard Worker buf = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_POINT_SIZE].BufferObj;
1132*61046927SAndroid Build Coastguard Worker v->value_int = buf ? buf->Name : 0;
1133*61046927SAndroid Build Coastguard Worker break;
1134*61046927SAndroid Build Coastguard Worker
1135*61046927SAndroid Build Coastguard Worker case GL_FOG_COLOR:
1136*61046927SAndroid Build Coastguard Worker if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer))
1137*61046927SAndroid Build Coastguard Worker COPY_4FV(v->value_float_4, ctx->Fog.Color);
1138*61046927SAndroid Build Coastguard Worker else
1139*61046927SAndroid Build Coastguard Worker COPY_4FV(v->value_float_4, ctx->Fog.ColorUnclamped);
1140*61046927SAndroid Build Coastguard Worker break;
1141*61046927SAndroid Build Coastguard Worker case GL_COLOR_CLEAR_VALUE:
1142*61046927SAndroid Build Coastguard Worker if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer)) {
1143*61046927SAndroid Build Coastguard Worker v->value_float_4[0] = CLAMP(ctx->Color.ClearColor.f[0], 0.0F, 1.0F);
1144*61046927SAndroid Build Coastguard Worker v->value_float_4[1] = CLAMP(ctx->Color.ClearColor.f[1], 0.0F, 1.0F);
1145*61046927SAndroid Build Coastguard Worker v->value_float_4[2] = CLAMP(ctx->Color.ClearColor.f[2], 0.0F, 1.0F);
1146*61046927SAndroid Build Coastguard Worker v->value_float_4[3] = CLAMP(ctx->Color.ClearColor.f[3], 0.0F, 1.0F);
1147*61046927SAndroid Build Coastguard Worker } else
1148*61046927SAndroid Build Coastguard Worker COPY_4FV(v->value_float_4, ctx->Color.ClearColor.f);
1149*61046927SAndroid Build Coastguard Worker break;
1150*61046927SAndroid Build Coastguard Worker case GL_BLEND_COLOR_EXT:
1151*61046927SAndroid Build Coastguard Worker if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer))
1152*61046927SAndroid Build Coastguard Worker COPY_4FV(v->value_float_4, ctx->Color.BlendColor);
1153*61046927SAndroid Build Coastguard Worker else
1154*61046927SAndroid Build Coastguard Worker COPY_4FV(v->value_float_4, ctx->Color.BlendColorUnclamped);
1155*61046927SAndroid Build Coastguard Worker break;
1156*61046927SAndroid Build Coastguard Worker case GL_ALPHA_TEST_REF:
1157*61046927SAndroid Build Coastguard Worker if (_mesa_get_clamp_fragment_color(ctx, ctx->DrawBuffer))
1158*61046927SAndroid Build Coastguard Worker v->value_float = ctx->Color.AlphaRef;
1159*61046927SAndroid Build Coastguard Worker else
1160*61046927SAndroid Build Coastguard Worker v->value_float = ctx->Color.AlphaRefUnclamped;
1161*61046927SAndroid Build Coastguard Worker break;
1162*61046927SAndroid Build Coastguard Worker case GL_MAX_VERTEX_UNIFORM_VECTORS:
1163*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents / 4;
1164*61046927SAndroid Build Coastguard Worker break;
1165*61046927SAndroid Build Coastguard Worker
1166*61046927SAndroid Build Coastguard Worker case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
1167*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents / 4;
1168*61046927SAndroid Build Coastguard Worker break;
1169*61046927SAndroid Build Coastguard Worker
1170*61046927SAndroid Build Coastguard Worker /* GL_ARB_texture_buffer_object */
1171*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BUFFER_ARB:
1172*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Texture.BufferObject ? ctx->Texture.BufferObject->Name : 0;
1173*61046927SAndroid Build Coastguard Worker break;
1174*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_BUFFER_ARB:
1175*61046927SAndroid Build Coastguard Worker unit = ctx->Texture.CurrentUnit;
1176*61046927SAndroid Build Coastguard Worker v->value_int =
1177*61046927SAndroid Build Coastguard Worker ctx->Texture.Unit[unit].CurrentTex[TEXTURE_BUFFER_INDEX]->Name;
1178*61046927SAndroid Build Coastguard Worker break;
1179*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB:
1180*61046927SAndroid Build Coastguard Worker {
1181*61046927SAndroid Build Coastguard Worker struct gl_buffer_object *buf =
1182*61046927SAndroid Build Coastguard Worker ctx->Texture.Unit[ctx->Texture.CurrentUnit]
1183*61046927SAndroid Build Coastguard Worker .CurrentTex[TEXTURE_BUFFER_INDEX]->BufferObject;
1184*61046927SAndroid Build Coastguard Worker v->value_int = buf ? buf->Name : 0;
1185*61046927SAndroid Build Coastguard Worker }
1186*61046927SAndroid Build Coastguard Worker break;
1187*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BUFFER_FORMAT_ARB:
1188*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Texture.Unit[ctx->Texture.CurrentUnit]
1189*61046927SAndroid Build Coastguard Worker .CurrentTex[TEXTURE_BUFFER_INDEX]->BufferObjectFormat;
1190*61046927SAndroid Build Coastguard Worker break;
1191*61046927SAndroid Build Coastguard Worker
1192*61046927SAndroid Build Coastguard Worker /* GL_ARB_sampler_objects */
1193*61046927SAndroid Build Coastguard Worker case GL_SAMPLER_BINDING:
1194*61046927SAndroid Build Coastguard Worker {
1195*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *samp =
1196*61046927SAndroid Build Coastguard Worker ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler;
1197*61046927SAndroid Build Coastguard Worker v->value_int = samp ? samp->Name : 0;
1198*61046927SAndroid Build Coastguard Worker }
1199*61046927SAndroid Build Coastguard Worker break;
1200*61046927SAndroid Build Coastguard Worker /* GL_ARB_uniform_buffer_object */
1201*61046927SAndroid Build Coastguard Worker case GL_UNIFORM_BUFFER_BINDING:
1202*61046927SAndroid Build Coastguard Worker v->value_int = ctx->UniformBuffer ? ctx->UniformBuffer->Name : 0;
1203*61046927SAndroid Build Coastguard Worker break;
1204*61046927SAndroid Build Coastguard Worker /* GL_ARB_shader_storage_buffer_object */
1205*61046927SAndroid Build Coastguard Worker case GL_SHADER_STORAGE_BUFFER_BINDING:
1206*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ShaderStorageBuffer ? ctx->ShaderStorageBuffer->Name : 0;
1207*61046927SAndroid Build Coastguard Worker break;
1208*61046927SAndroid Build Coastguard Worker /* GL_ARB_query_buffer_object */
1209*61046927SAndroid Build Coastguard Worker case GL_QUERY_BUFFER_BINDING:
1210*61046927SAndroid Build Coastguard Worker v->value_int = ctx->QueryBuffer ? ctx->QueryBuffer->Name : 0;
1211*61046927SAndroid Build Coastguard Worker break;
1212*61046927SAndroid Build Coastguard Worker /* GL_ARB_timer_query */
1213*61046927SAndroid Build Coastguard Worker case GL_TIMESTAMP:
1214*61046927SAndroid Build Coastguard Worker v->value_int64 = _mesa_get_timestamp(ctx);
1215*61046927SAndroid Build Coastguard Worker break;
1216*61046927SAndroid Build Coastguard Worker /* GL_KHR_DEBUG */
1217*61046927SAndroid Build Coastguard Worker case GL_DEBUG_OUTPUT:
1218*61046927SAndroid Build Coastguard Worker case GL_DEBUG_OUTPUT_SYNCHRONOUS:
1219*61046927SAndroid Build Coastguard Worker case GL_DEBUG_LOGGED_MESSAGES:
1220*61046927SAndroid Build Coastguard Worker case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
1221*61046927SAndroid Build Coastguard Worker case GL_DEBUG_GROUP_STACK_DEPTH:
1222*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_get_debug_state_int(ctx, d->pname);
1223*61046927SAndroid Build Coastguard Worker break;
1224*61046927SAndroid Build Coastguard Worker /* GL_ARB_shader_atomic_counters */
1225*61046927SAndroid Build Coastguard Worker case GL_ATOMIC_COUNTER_BUFFER_BINDING:
1226*61046927SAndroid Build Coastguard Worker v->value_int = ctx->AtomicBuffer ? ctx->AtomicBuffer->Name : 0;
1227*61046927SAndroid Build Coastguard Worker break;
1228*61046927SAndroid Build Coastguard Worker /* GL 4.3 */
1229*61046927SAndroid Build Coastguard Worker case GL_NUM_SHADING_LANGUAGE_VERSIONS:
1230*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_get_shading_language_version(ctx, -1, NULL);
1231*61046927SAndroid Build Coastguard Worker break;
1232*61046927SAndroid Build Coastguard Worker /* GL_ARB_draw_indirect */
1233*61046927SAndroid Build Coastguard Worker case GL_DRAW_INDIRECT_BUFFER_BINDING:
1234*61046927SAndroid Build Coastguard Worker v->value_int = ctx->DrawIndirectBuffer ? ctx->DrawIndirectBuffer->Name: 0;
1235*61046927SAndroid Build Coastguard Worker break;
1236*61046927SAndroid Build Coastguard Worker /* GL_ARB_indirect_parameters */
1237*61046927SAndroid Build Coastguard Worker case GL_PARAMETER_BUFFER_BINDING_ARB:
1238*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ParameterBuffer ? ctx->ParameterBuffer->Name : 0;
1239*61046927SAndroid Build Coastguard Worker break;
1240*61046927SAndroid Build Coastguard Worker /* GL_ARB_separate_shader_objects */
1241*61046927SAndroid Build Coastguard Worker case GL_PROGRAM_PIPELINE_BINDING:
1242*61046927SAndroid Build Coastguard Worker if (ctx->Pipeline.Current) {
1243*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Pipeline.Current->Name;
1244*61046927SAndroid Build Coastguard Worker } else {
1245*61046927SAndroid Build Coastguard Worker v->value_int = 0;
1246*61046927SAndroid Build Coastguard Worker }
1247*61046927SAndroid Build Coastguard Worker break;
1248*61046927SAndroid Build Coastguard Worker /* GL_ARB_compute_shader */
1249*61046927SAndroid Build Coastguard Worker case GL_DISPATCH_INDIRECT_BUFFER_BINDING:
1250*61046927SAndroid Build Coastguard Worker v->value_int = ctx->DispatchIndirectBuffer ?
1251*61046927SAndroid Build Coastguard Worker ctx->DispatchIndirectBuffer->Name : 0;
1252*61046927SAndroid Build Coastguard Worker break;
1253*61046927SAndroid Build Coastguard Worker /* GL_ARB_multisample */
1254*61046927SAndroid Build Coastguard Worker case GL_SAMPLES:
1255*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_geometric_samples(ctx->DrawBuffer);
1256*61046927SAndroid Build Coastguard Worker break;
1257*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_BUFFERS:
1258*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_geometric_samples(ctx->DrawBuffer) > 0;
1259*61046927SAndroid Build Coastguard Worker break;
1260*61046927SAndroid Build Coastguard Worker /* GL_EXT_textrue_integer */
1261*61046927SAndroid Build Coastguard Worker case GL_RGBA_INTEGER_MODE_EXT:
1262*61046927SAndroid Build Coastguard Worker v->value_int = (ctx->DrawBuffer->_IntegerBuffers != 0);
1263*61046927SAndroid Build Coastguard Worker break;
1264*61046927SAndroid Build Coastguard Worker /* GL_ATI_meminfo & GL_NVX_gpu_memory_info */
1265*61046927SAndroid Build Coastguard Worker case GL_VBO_FREE_MEMORY_ATI:
1266*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_FREE_MEMORY_ATI:
1267*61046927SAndroid Build Coastguard Worker case GL_RENDERBUFFER_FREE_MEMORY_ATI:
1268*61046927SAndroid Build Coastguard Worker case GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX:
1269*61046927SAndroid Build Coastguard Worker case GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX:
1270*61046927SAndroid Build Coastguard Worker case GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX:
1271*61046927SAndroid Build Coastguard Worker case GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX:
1272*61046927SAndroid Build Coastguard Worker case GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX:
1273*61046927SAndroid Build Coastguard Worker {
1274*61046927SAndroid Build Coastguard Worker struct pipe_memory_info info;
1275*61046927SAndroid Build Coastguard Worker struct pipe_screen *screen = ctx->pipe->screen;
1276*61046927SAndroid Build Coastguard Worker
1277*61046927SAndroid Build Coastguard Worker assert(screen->query_memory_info);
1278*61046927SAndroid Build Coastguard Worker screen->query_memory_info(screen, &info);
1279*61046927SAndroid Build Coastguard Worker
1280*61046927SAndroid Build Coastguard Worker if (d->pname == GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX)
1281*61046927SAndroid Build Coastguard Worker v->value_int = info.total_device_memory;
1282*61046927SAndroid Build Coastguard Worker else if (d->pname == GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX)
1283*61046927SAndroid Build Coastguard Worker v->value_int = info.total_device_memory +
1284*61046927SAndroid Build Coastguard Worker info.total_staging_memory;
1285*61046927SAndroid Build Coastguard Worker else if (d->pname == GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX)
1286*61046927SAndroid Build Coastguard Worker v->value_int = info.avail_device_memory;
1287*61046927SAndroid Build Coastguard Worker else if (d->pname == GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX)
1288*61046927SAndroid Build Coastguard Worker v->value_int = info.nr_device_memory_evictions;
1289*61046927SAndroid Build Coastguard Worker else if (d->pname == GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX)
1290*61046927SAndroid Build Coastguard Worker v->value_int = info.device_memory_evicted;
1291*61046927SAndroid Build Coastguard Worker else {
1292*61046927SAndroid Build Coastguard Worker /* ATI free memory enums.
1293*61046927SAndroid Build Coastguard Worker *
1294*61046927SAndroid Build Coastguard Worker * Since the GPU memory is (usually) page-table based, every two
1295*61046927SAndroid Build Coastguard Worker * consecutive elements are equal. From the GL_ATI_meminfo
1296*61046927SAndroid Build Coastguard Worker * specification:
1297*61046927SAndroid Build Coastguard Worker *
1298*61046927SAndroid Build Coastguard Worker * "param[0] - total memory free in the pool
1299*61046927SAndroid Build Coastguard Worker * param[1] - largest available free block in the pool
1300*61046927SAndroid Build Coastguard Worker * param[2] - total auxiliary memory free
1301*61046927SAndroid Build Coastguard Worker * param[3] - largest auxiliary free block"
1302*61046927SAndroid Build Coastguard Worker *
1303*61046927SAndroid Build Coastguard Worker * All three (VBO, TEXTURE, RENDERBUFFER) queries return
1304*61046927SAndroid Build Coastguard Worker * the same numbers here.
1305*61046927SAndroid Build Coastguard Worker */
1306*61046927SAndroid Build Coastguard Worker v->value_int_4[0] = info.avail_device_memory;
1307*61046927SAndroid Build Coastguard Worker v->value_int_4[1] = info.avail_device_memory;
1308*61046927SAndroid Build Coastguard Worker v->value_int_4[2] = info.avail_staging_memory;
1309*61046927SAndroid Build Coastguard Worker v->value_int_4[3] = info.avail_staging_memory;
1310*61046927SAndroid Build Coastguard Worker }
1311*61046927SAndroid Build Coastguard Worker }
1312*61046927SAndroid Build Coastguard Worker break;
1313*61046927SAndroid Build Coastguard Worker
1314*61046927SAndroid Build Coastguard Worker /* GL_ARB_get_program_binary */
1315*61046927SAndroid Build Coastguard Worker case GL_PROGRAM_BINARY_FORMATS:
1316*61046927SAndroid Build Coastguard Worker assert(ctx->Const.NumProgramBinaryFormats <= 1);
1317*61046927SAndroid Build Coastguard Worker v->value_int_n.n = MIN2(ctx->Const.NumProgramBinaryFormats, 1);
1318*61046927SAndroid Build Coastguard Worker if (ctx->Const.NumProgramBinaryFormats > 0) {
1319*61046927SAndroid Build Coastguard Worker v->value_int_n.ints[0] = GL_PROGRAM_BINARY_FORMAT_MESA;
1320*61046927SAndroid Build Coastguard Worker }
1321*61046927SAndroid Build Coastguard Worker break;
1322*61046927SAndroid Build Coastguard Worker /* GL_ARB_gl_spirv */
1323*61046927SAndroid Build Coastguard Worker case GL_SHADER_BINARY_FORMATS:
1324*61046927SAndroid Build Coastguard Worker assert(ctx->Const.NumShaderBinaryFormats <= 1);
1325*61046927SAndroid Build Coastguard Worker v->value_int_n.n = MIN2(ctx->Const.NumShaderBinaryFormats, 1);
1326*61046927SAndroid Build Coastguard Worker if (ctx->Const.NumShaderBinaryFormats > 0) {
1327*61046927SAndroid Build Coastguard Worker v->value_int_n.ints[0] = GL_SHADER_BINARY_FORMAT_SPIR_V;
1328*61046927SAndroid Build Coastguard Worker }
1329*61046927SAndroid Build Coastguard Worker break;
1330*61046927SAndroid Build Coastguard Worker /* ARB_spirv_extensions */
1331*61046927SAndroid Build Coastguard Worker case GL_NUM_SPIR_V_EXTENSIONS:
1332*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_get_spirv_extension_count(ctx);
1333*61046927SAndroid Build Coastguard Worker break;
1334*61046927SAndroid Build Coastguard Worker /* GL_EXT_disjoint_timer_query */
1335*61046927SAndroid Build Coastguard Worker case GL_GPU_DISJOINT_EXT:
1336*61046927SAndroid Build Coastguard Worker {
1337*61046927SAndroid Build Coastguard Worker v->value_int = 0;
1338*61046927SAndroid Build Coastguard Worker }
1339*61046927SAndroid Build Coastguard Worker break;
1340*61046927SAndroid Build Coastguard Worker /* GL_ARB_sample_locations */
1341*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB:
1342*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB:
1343*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB:
1344*61046927SAndroid Build Coastguard Worker {
1345*61046927SAndroid Build Coastguard Worker GLuint bits, width, height;
1346*61046927SAndroid Build Coastguard Worker
1347*61046927SAndroid Build Coastguard Worker if (ctx->NewState & _NEW_BUFFERS)
1348*61046927SAndroid Build Coastguard Worker _mesa_update_state(ctx);
1349*61046927SAndroid Build Coastguard Worker
1350*61046927SAndroid Build Coastguard Worker if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE) {
1351*61046927SAndroid Build Coastguard Worker v->value_uint = 0;
1352*61046927SAndroid Build Coastguard Worker break;
1353*61046927SAndroid Build Coastguard Worker }
1354*61046927SAndroid Build Coastguard Worker
1355*61046927SAndroid Build Coastguard Worker _mesa_GetProgrammableSampleCaps(ctx, ctx->DrawBuffer,
1356*61046927SAndroid Build Coastguard Worker &bits, &width, &height);
1357*61046927SAndroid Build Coastguard Worker
1358*61046927SAndroid Build Coastguard Worker if (d->pname == GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB)
1359*61046927SAndroid Build Coastguard Worker v->value_uint = width;
1360*61046927SAndroid Build Coastguard Worker else if (d->pname == GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB)
1361*61046927SAndroid Build Coastguard Worker v->value_uint = height;
1362*61046927SAndroid Build Coastguard Worker else
1363*61046927SAndroid Build Coastguard Worker v->value_uint = bits;
1364*61046927SAndroid Build Coastguard Worker }
1365*61046927SAndroid Build Coastguard Worker break;
1366*61046927SAndroid Build Coastguard Worker case GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB:
1367*61046927SAndroid Build Coastguard Worker v->value_uint = MAX_SAMPLE_LOCATION_TABLE_SIZE;
1368*61046927SAndroid Build Coastguard Worker break;
1369*61046927SAndroid Build Coastguard Worker
1370*61046927SAndroid Build Coastguard Worker /* GL_AMD_framebuffer_multisample_advanced */
1371*61046927SAndroid Build Coastguard Worker case GL_SUPPORTED_MULTISAMPLE_MODES_AMD:
1372*61046927SAndroid Build Coastguard Worker v->value_int_n.n = ctx->Const.NumSupportedMultisampleModes * 3;
1373*61046927SAndroid Build Coastguard Worker memcpy(v->value_int_n.ints, ctx->Const.SupportedMultisampleModes,
1374*61046927SAndroid Build Coastguard Worker v->value_int_n.n * sizeof(GLint));
1375*61046927SAndroid Build Coastguard Worker break;
1376*61046927SAndroid Build Coastguard Worker
1377*61046927SAndroid Build Coastguard Worker /* GL_NV_viewport_swizzle */
1378*61046927SAndroid Build Coastguard Worker case GL_VIEWPORT_SWIZZLE_X_NV:
1379*61046927SAndroid Build Coastguard Worker v->value_enum = ctx->ViewportArray[0].SwizzleX;
1380*61046927SAndroid Build Coastguard Worker break;
1381*61046927SAndroid Build Coastguard Worker case GL_VIEWPORT_SWIZZLE_Y_NV:
1382*61046927SAndroid Build Coastguard Worker v->value_enum = ctx->ViewportArray[0].SwizzleY;
1383*61046927SAndroid Build Coastguard Worker break;
1384*61046927SAndroid Build Coastguard Worker case GL_VIEWPORT_SWIZZLE_Z_NV:
1385*61046927SAndroid Build Coastguard Worker v->value_enum = ctx->ViewportArray[0].SwizzleZ;
1386*61046927SAndroid Build Coastguard Worker break;
1387*61046927SAndroid Build Coastguard Worker case GL_VIEWPORT_SWIZZLE_W_NV:
1388*61046927SAndroid Build Coastguard Worker v->value_enum = ctx->ViewportArray[0].SwizzleW;
1389*61046927SAndroid Build Coastguard Worker break;
1390*61046927SAndroid Build Coastguard Worker }
1391*61046927SAndroid Build Coastguard Worker }
1392*61046927SAndroid Build Coastguard Worker
1393*61046927SAndroid Build Coastguard Worker /**
1394*61046927SAndroid Build Coastguard Worker * Check extra constraints on a struct value_desc descriptor
1395*61046927SAndroid Build Coastguard Worker *
1396*61046927SAndroid Build Coastguard Worker * If a struct value_desc has a non-NULL extra pointer, it means that
1397*61046927SAndroid Build Coastguard Worker * there are a number of extra constraints to check or actions to
1398*61046927SAndroid Build Coastguard Worker * perform. The extras is just an integer array where each integer
1399*61046927SAndroid Build Coastguard Worker * encode different constraints or actions.
1400*61046927SAndroid Build Coastguard Worker *
1401*61046927SAndroid Build Coastguard Worker * \param ctx current context
1402*61046927SAndroid Build Coastguard Worker * \param func name of calling glGet*v() function for error reporting
1403*61046927SAndroid Build Coastguard Worker * \param d the struct value_desc that has the extra constraints
1404*61046927SAndroid Build Coastguard Worker *
1405*61046927SAndroid Build Coastguard Worker * \return GL_FALSE if all of the constraints were not satisfied,
1406*61046927SAndroid Build Coastguard Worker * otherwise GL_TRUE.
1407*61046927SAndroid Build Coastguard Worker */
1408*61046927SAndroid Build Coastguard Worker static GLboolean
check_extra(struct gl_context * ctx,const char * func,const struct value_desc * d)1409*61046927SAndroid Build Coastguard Worker check_extra(struct gl_context *ctx, const char *func, const struct value_desc *d)
1410*61046927SAndroid Build Coastguard Worker {
1411*61046927SAndroid Build Coastguard Worker const GLuint version = ctx->Version;
1412*61046927SAndroid Build Coastguard Worker GLboolean api_check = GL_FALSE;
1413*61046927SAndroid Build Coastguard Worker GLboolean api_found = GL_FALSE;
1414*61046927SAndroid Build Coastguard Worker const int *e;
1415*61046927SAndroid Build Coastguard Worker
1416*61046927SAndroid Build Coastguard Worker for (e = d->extra; *e != EXTRA_END; e++) {
1417*61046927SAndroid Build Coastguard Worker switch (*e) {
1418*61046927SAndroid Build Coastguard Worker case EXTRA_VERSION_30:
1419*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1420*61046927SAndroid Build Coastguard Worker if (version >= 30)
1421*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1422*61046927SAndroid Build Coastguard Worker break;
1423*61046927SAndroid Build Coastguard Worker case EXTRA_VERSION_31:
1424*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1425*61046927SAndroid Build Coastguard Worker if (version >= 31)
1426*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1427*61046927SAndroid Build Coastguard Worker break;
1428*61046927SAndroid Build Coastguard Worker case EXTRA_VERSION_32:
1429*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1430*61046927SAndroid Build Coastguard Worker if (version >= 32)
1431*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1432*61046927SAndroid Build Coastguard Worker break;
1433*61046927SAndroid Build Coastguard Worker case EXTRA_VERSION_40:
1434*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1435*61046927SAndroid Build Coastguard Worker if (version >= 40)
1436*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1437*61046927SAndroid Build Coastguard Worker break;
1438*61046927SAndroid Build Coastguard Worker case EXTRA_VERSION_43:
1439*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1440*61046927SAndroid Build Coastguard Worker if (_mesa_is_desktop_gl(ctx) && version >= 43)
1441*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1442*61046927SAndroid Build Coastguard Worker break;
1443*61046927SAndroid Build Coastguard Worker case EXTRA_API_ES:
1444*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1445*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles(ctx))
1446*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1447*61046927SAndroid Build Coastguard Worker break;
1448*61046927SAndroid Build Coastguard Worker case EXTRA_API_ES2:
1449*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1450*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles2(ctx))
1451*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1452*61046927SAndroid Build Coastguard Worker break;
1453*61046927SAndroid Build Coastguard Worker case EXTRA_API_ES3:
1454*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1455*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles3(ctx))
1456*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1457*61046927SAndroid Build Coastguard Worker break;
1458*61046927SAndroid Build Coastguard Worker case EXTRA_API_ES31:
1459*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1460*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles31(ctx))
1461*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1462*61046927SAndroid Build Coastguard Worker break;
1463*61046927SAndroid Build Coastguard Worker case EXTRA_API_ES32:
1464*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1465*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles32(ctx))
1466*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1467*61046927SAndroid Build Coastguard Worker break;
1468*61046927SAndroid Build Coastguard Worker case EXTRA_API_GL:
1469*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1470*61046927SAndroid Build Coastguard Worker if (_mesa_is_desktop_gl(ctx))
1471*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1472*61046927SAndroid Build Coastguard Worker break;
1473*61046927SAndroid Build Coastguard Worker case EXTRA_API_GL_CORE:
1474*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1475*61046927SAndroid Build Coastguard Worker if (_mesa_is_desktop_gl_core(ctx))
1476*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1477*61046927SAndroid Build Coastguard Worker break;
1478*61046927SAndroid Build Coastguard Worker case EXTRA_API_GL_COMPAT:
1479*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1480*61046927SAndroid Build Coastguard Worker if (_mesa_is_desktop_gl_compat(ctx))
1481*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1482*61046927SAndroid Build Coastguard Worker break;
1483*61046927SAndroid Build Coastguard Worker case EXTRA_NEW_BUFFERS:
1484*61046927SAndroid Build Coastguard Worker if (ctx->NewState & _NEW_BUFFERS)
1485*61046927SAndroid Build Coastguard Worker _mesa_update_state(ctx);
1486*61046927SAndroid Build Coastguard Worker break;
1487*61046927SAndroid Build Coastguard Worker case EXTRA_FLUSH_CURRENT:
1488*61046927SAndroid Build Coastguard Worker FLUSH_CURRENT(ctx, 0);
1489*61046927SAndroid Build Coastguard Worker break;
1490*61046927SAndroid Build Coastguard Worker case EXTRA_VALID_DRAW_BUFFER:
1491*61046927SAndroid Build Coastguard Worker if (d->pname - GL_DRAW_BUFFER0_ARB >= ctx->Const.MaxDrawBuffers) {
1492*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "%s(draw buffer %u)",
1493*61046927SAndroid Build Coastguard Worker func, d->pname - GL_DRAW_BUFFER0_ARB);
1494*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1495*61046927SAndroid Build Coastguard Worker }
1496*61046927SAndroid Build Coastguard Worker break;
1497*61046927SAndroid Build Coastguard Worker case EXTRA_VALID_TEXTURE_UNIT:
1498*61046927SAndroid Build Coastguard Worker if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
1499*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "%s(texture %u)",
1500*61046927SAndroid Build Coastguard Worker func, ctx->Texture.CurrentUnit);
1501*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1502*61046927SAndroid Build Coastguard Worker }
1503*61046927SAndroid Build Coastguard Worker break;
1504*61046927SAndroid Build Coastguard Worker case EXTRA_VALID_CLIP_DISTANCE:
1505*61046927SAndroid Build Coastguard Worker if (d->pname - GL_CLIP_DISTANCE0 >= ctx->Const.MaxClipPlanes) {
1506*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "%s(clip distance %u)",
1507*61046927SAndroid Build Coastguard Worker func, d->pname - GL_CLIP_DISTANCE0);
1508*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1509*61046927SAndroid Build Coastguard Worker }
1510*61046927SAndroid Build Coastguard Worker break;
1511*61046927SAndroid Build Coastguard Worker case EXTRA_GLSL_130:
1512*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1513*61046927SAndroid Build Coastguard Worker if (ctx->Const.GLSLVersion >= 130)
1514*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1515*61046927SAndroid Build Coastguard Worker break;
1516*61046927SAndroid Build Coastguard Worker case EXTRA_EXT_UBO_GS:
1517*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1518*61046927SAndroid Build Coastguard Worker if (ctx->Extensions.ARB_uniform_buffer_object &&
1519*61046927SAndroid Build Coastguard Worker _mesa_has_geometry_shaders(ctx))
1520*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1521*61046927SAndroid Build Coastguard Worker break;
1522*61046927SAndroid Build Coastguard Worker case EXTRA_EXT_ATOMICS_GS:
1523*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1524*61046927SAndroid Build Coastguard Worker if (ctx->Extensions.ARB_shader_atomic_counters &&
1525*61046927SAndroid Build Coastguard Worker _mesa_has_geometry_shaders(ctx))
1526*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1527*61046927SAndroid Build Coastguard Worker break;
1528*61046927SAndroid Build Coastguard Worker case EXTRA_EXT_SHADER_IMAGE_GS:
1529*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1530*61046927SAndroid Build Coastguard Worker if ((ctx->Extensions.ARB_shader_image_load_store ||
1531*61046927SAndroid Build Coastguard Worker _mesa_is_gles31(ctx)) &&
1532*61046927SAndroid Build Coastguard Worker _mesa_has_geometry_shaders(ctx))
1533*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1534*61046927SAndroid Build Coastguard Worker break;
1535*61046927SAndroid Build Coastguard Worker case EXTRA_EXT_ATOMICS_TESS:
1536*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1537*61046927SAndroid Build Coastguard Worker api_found = ctx->Extensions.ARB_shader_atomic_counters &&
1538*61046927SAndroid Build Coastguard Worker _mesa_has_tessellation(ctx);
1539*61046927SAndroid Build Coastguard Worker break;
1540*61046927SAndroid Build Coastguard Worker case EXTRA_EXT_SHADER_IMAGE_TESS:
1541*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1542*61046927SAndroid Build Coastguard Worker api_found = ctx->Extensions.ARB_shader_image_load_store &&
1543*61046927SAndroid Build Coastguard Worker _mesa_has_tessellation(ctx);
1544*61046927SAndroid Build Coastguard Worker break;
1545*61046927SAndroid Build Coastguard Worker case EXTRA_EXT_SSBO_GS:
1546*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1547*61046927SAndroid Build Coastguard Worker if (ctx->Extensions.ARB_shader_storage_buffer_object &&
1548*61046927SAndroid Build Coastguard Worker _mesa_has_geometry_shaders(ctx))
1549*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1550*61046927SAndroid Build Coastguard Worker break;
1551*61046927SAndroid Build Coastguard Worker case EXTRA_EXT_FB_NO_ATTACH_GS:
1552*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1553*61046927SAndroid Build Coastguard Worker if (ctx->Extensions.ARB_framebuffer_no_attachments &&
1554*61046927SAndroid Build Coastguard Worker (_mesa_is_desktop_gl(ctx) ||
1555*61046927SAndroid Build Coastguard Worker _mesa_has_OES_geometry_shader(ctx)))
1556*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1557*61046927SAndroid Build Coastguard Worker break;
1558*61046927SAndroid Build Coastguard Worker case EXTRA_EXT_ES_GS:
1559*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1560*61046927SAndroid Build Coastguard Worker if (_mesa_has_OES_geometry_shader(ctx))
1561*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1562*61046927SAndroid Build Coastguard Worker break;
1563*61046927SAndroid Build Coastguard Worker case EXTRA_EXT_PROVOKING_VERTEX_32:
1564*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1565*61046927SAndroid Build Coastguard Worker if (_mesa_is_desktop_gl_compat(ctx) || version == 32)
1566*61046927SAndroid Build Coastguard Worker api_found = ctx->Extensions.EXT_provoking_vertex;
1567*61046927SAndroid Build Coastguard Worker break;
1568*61046927SAndroid Build Coastguard Worker case EXTRA_END:
1569*61046927SAndroid Build Coastguard Worker break;
1570*61046927SAndroid Build Coastguard Worker default: /* *e is a offset into the extension struct */
1571*61046927SAndroid Build Coastguard Worker api_check = GL_TRUE;
1572*61046927SAndroid Build Coastguard Worker if (*(GLboolean *) ((char *) &ctx->Extensions + *e))
1573*61046927SAndroid Build Coastguard Worker api_found = GL_TRUE;
1574*61046927SAndroid Build Coastguard Worker break;
1575*61046927SAndroid Build Coastguard Worker }
1576*61046927SAndroid Build Coastguard Worker }
1577*61046927SAndroid Build Coastguard Worker
1578*61046927SAndroid Build Coastguard Worker if (api_check && !api_found) {
1579*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)", func,
1580*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(d->pname));
1581*61046927SAndroid Build Coastguard Worker return GL_FALSE;
1582*61046927SAndroid Build Coastguard Worker }
1583*61046927SAndroid Build Coastguard Worker
1584*61046927SAndroid Build Coastguard Worker return GL_TRUE;
1585*61046927SAndroid Build Coastguard Worker }
1586*61046927SAndroid Build Coastguard Worker
1587*61046927SAndroid Build Coastguard Worker static const struct value_desc error_value =
1588*61046927SAndroid Build Coastguard Worker { 0, 0, TYPE_INVALID, NO_OFFSET, NO_EXTRA };
1589*61046927SAndroid Build Coastguard Worker
1590*61046927SAndroid Build Coastguard Worker /**
1591*61046927SAndroid Build Coastguard Worker * Find the struct value_desc corresponding to the enum 'pname'.
1592*61046927SAndroid Build Coastguard Worker *
1593*61046927SAndroid Build Coastguard Worker * We hash the enum value to get an index into the 'table' array,
1594*61046927SAndroid Build Coastguard Worker * which holds the index in the 'values' array of struct value_desc.
1595*61046927SAndroid Build Coastguard Worker * Once we've found the entry, we do the extra checks, if any, then
1596*61046927SAndroid Build Coastguard Worker * look up the value and return a pointer to it.
1597*61046927SAndroid Build Coastguard Worker *
1598*61046927SAndroid Build Coastguard Worker * If the value has to be computed (for example, it's the result of a
1599*61046927SAndroid Build Coastguard Worker * function call or we need to add 1 to it), we use the tmp 'v' to
1600*61046927SAndroid Build Coastguard Worker * store the result.
1601*61046927SAndroid Build Coastguard Worker *
1602*61046927SAndroid Build Coastguard Worker * \param func name of glGet*v() func for error reporting
1603*61046927SAndroid Build Coastguard Worker * \param pname the enum value we're looking up
1604*61046927SAndroid Build Coastguard Worker * \param p is were we return the pointer to the value
1605*61046927SAndroid Build Coastguard Worker * \param v a tmp union value variable in the calling glGet*v() function
1606*61046927SAndroid Build Coastguard Worker *
1607*61046927SAndroid Build Coastguard Worker * \return the struct value_desc corresponding to the enum or a struct
1608*61046927SAndroid Build Coastguard Worker * value_desc of TYPE_INVALID if not found. This lets the calling
1609*61046927SAndroid Build Coastguard Worker * glGet*v() function jump right into a switch statement and
1610*61046927SAndroid Build Coastguard Worker * handle errors there instead of having to check for NULL.
1611*61046927SAndroid Build Coastguard Worker */
1612*61046927SAndroid Build Coastguard Worker static const struct value_desc *
find_value(const char * func,GLenum pname,void ** p,union value * v)1613*61046927SAndroid Build Coastguard Worker find_value(const char *func, GLenum pname, void **p, union value *v)
1614*61046927SAndroid Build Coastguard Worker {
1615*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
1616*61046927SAndroid Build Coastguard Worker int mask, hash;
1617*61046927SAndroid Build Coastguard Worker const struct value_desc *d;
1618*61046927SAndroid Build Coastguard Worker int api;
1619*61046927SAndroid Build Coastguard Worker
1620*61046927SAndroid Build Coastguard Worker *p = NULL;
1621*61046927SAndroid Build Coastguard Worker
1622*61046927SAndroid Build Coastguard Worker api = ctx->API;
1623*61046927SAndroid Build Coastguard Worker /* We index into the table_set[] list of per-API hash tables using the API's
1624*61046927SAndroid Build Coastguard Worker * value in the gl_api enum. Since GLES 3 doesn't have an API_OPENGL* enum
1625*61046927SAndroid Build Coastguard Worker * value since it's compatible with GLES2 its entry in table_set[] is at the
1626*61046927SAndroid Build Coastguard Worker * end.
1627*61046927SAndroid Build Coastguard Worker */
1628*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(ARRAY_SIZE(table_set) == API_OPENGL_LAST + 4);
1629*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles2(ctx)) {
1630*61046927SAndroid Build Coastguard Worker if (ctx->Version >= 32)
1631*61046927SAndroid Build Coastguard Worker api = API_OPENGL_LAST + 3;
1632*61046927SAndroid Build Coastguard Worker else if (ctx->Version >= 31)
1633*61046927SAndroid Build Coastguard Worker api = API_OPENGL_LAST + 2;
1634*61046927SAndroid Build Coastguard Worker else if (ctx->Version >= 30)
1635*61046927SAndroid Build Coastguard Worker api = API_OPENGL_LAST + 1;
1636*61046927SAndroid Build Coastguard Worker }
1637*61046927SAndroid Build Coastguard Worker mask = ARRAY_SIZE(table(api)) - 1;
1638*61046927SAndroid Build Coastguard Worker hash = (pname * prime_factor);
1639*61046927SAndroid Build Coastguard Worker while (1) {
1640*61046927SAndroid Build Coastguard Worker int idx = table(api)[hash & mask];
1641*61046927SAndroid Build Coastguard Worker
1642*61046927SAndroid Build Coastguard Worker /* If the enum isn't valid, the hash walk ends with index 0,
1643*61046927SAndroid Build Coastguard Worker * pointing to the first entry of values[] which doesn't hold
1644*61046927SAndroid Build Coastguard Worker * any valid enum. */
1645*61046927SAndroid Build Coastguard Worker if (unlikely(idx == 0)) {
1646*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)", func,
1647*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
1648*61046927SAndroid Build Coastguard Worker return &error_value;
1649*61046927SAndroid Build Coastguard Worker }
1650*61046927SAndroid Build Coastguard Worker
1651*61046927SAndroid Build Coastguard Worker d = &values[idx];
1652*61046927SAndroid Build Coastguard Worker if (likely(d->pname == pname))
1653*61046927SAndroid Build Coastguard Worker break;
1654*61046927SAndroid Build Coastguard Worker
1655*61046927SAndroid Build Coastguard Worker hash += prime_step;
1656*61046927SAndroid Build Coastguard Worker }
1657*61046927SAndroid Build Coastguard Worker
1658*61046927SAndroid Build Coastguard Worker if (unlikely(d->extra && !check_extra(ctx, func, d)))
1659*61046927SAndroid Build Coastguard Worker return &error_value;
1660*61046927SAndroid Build Coastguard Worker
1661*61046927SAndroid Build Coastguard Worker switch (d->location) {
1662*61046927SAndroid Build Coastguard Worker case LOC_BUFFER:
1663*61046927SAndroid Build Coastguard Worker *p = ((char *) ctx->DrawBuffer + d->offset);
1664*61046927SAndroid Build Coastguard Worker return d;
1665*61046927SAndroid Build Coastguard Worker case LOC_CONTEXT:
1666*61046927SAndroid Build Coastguard Worker *p = ((char *) ctx + d->offset);
1667*61046927SAndroid Build Coastguard Worker return d;
1668*61046927SAndroid Build Coastguard Worker case LOC_ARRAY:
1669*61046927SAndroid Build Coastguard Worker *p = ((char *) ctx->Array.VAO + d->offset);
1670*61046927SAndroid Build Coastguard Worker return d;
1671*61046927SAndroid Build Coastguard Worker case LOC_TEXUNIT:
1672*61046927SAndroid Build Coastguard Worker if (ctx->Texture.CurrentUnit < ARRAY_SIZE(ctx->Texture.FixedFuncUnit)) {
1673*61046927SAndroid Build Coastguard Worker unsigned index = ctx->Texture.CurrentUnit;
1674*61046927SAndroid Build Coastguard Worker *p = ((char *)&ctx->Texture.FixedFuncUnit[index] + d->offset);
1675*61046927SAndroid Build Coastguard Worker return d;
1676*61046927SAndroid Build Coastguard Worker }
1677*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "%s(pname=%s,unit=%d)", func,
1678*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname),
1679*61046927SAndroid Build Coastguard Worker ctx->Texture.CurrentUnit);
1680*61046927SAndroid Build Coastguard Worker return &error_value;
1681*61046927SAndroid Build Coastguard Worker case LOC_CUSTOM:
1682*61046927SAndroid Build Coastguard Worker find_custom_value(ctx, d, v);
1683*61046927SAndroid Build Coastguard Worker *p = v;
1684*61046927SAndroid Build Coastguard Worker return d;
1685*61046927SAndroid Build Coastguard Worker default:
1686*61046927SAndroid Build Coastguard Worker assert(0);
1687*61046927SAndroid Build Coastguard Worker break;
1688*61046927SAndroid Build Coastguard Worker }
1689*61046927SAndroid Build Coastguard Worker
1690*61046927SAndroid Build Coastguard Worker /* silence warning */
1691*61046927SAndroid Build Coastguard Worker return &error_value;
1692*61046927SAndroid Build Coastguard Worker }
1693*61046927SAndroid Build Coastguard Worker
1694*61046927SAndroid Build Coastguard Worker static const int transpose[] = {
1695*61046927SAndroid Build Coastguard Worker 0, 4, 8, 12,
1696*61046927SAndroid Build Coastguard Worker 1, 5, 9, 13,
1697*61046927SAndroid Build Coastguard Worker 2, 6, 10, 14,
1698*61046927SAndroid Build Coastguard Worker 3, 7, 11, 15
1699*61046927SAndroid Build Coastguard Worker };
1700*61046927SAndroid Build Coastguard Worker
1701*61046927SAndroid Build Coastguard Worker static GLsizei
get_value_size(enum value_type type,const union value * v)1702*61046927SAndroid Build Coastguard Worker get_value_size(enum value_type type, const union value *v)
1703*61046927SAndroid Build Coastguard Worker {
1704*61046927SAndroid Build Coastguard Worker switch (type) {
1705*61046927SAndroid Build Coastguard Worker case TYPE_INVALID:
1706*61046927SAndroid Build Coastguard Worker return 0;
1707*61046927SAndroid Build Coastguard Worker case TYPE_CONST:
1708*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
1709*61046927SAndroid Build Coastguard Worker case TYPE_INT:
1710*61046927SAndroid Build Coastguard Worker return sizeof(GLint);
1711*61046927SAndroid Build Coastguard Worker case TYPE_INT_2:
1712*61046927SAndroid Build Coastguard Worker case TYPE_UINT_2:
1713*61046927SAndroid Build Coastguard Worker return sizeof(GLint) * 2;
1714*61046927SAndroid Build Coastguard Worker case TYPE_INT_3:
1715*61046927SAndroid Build Coastguard Worker case TYPE_UINT_3:
1716*61046927SAndroid Build Coastguard Worker return sizeof(GLint) * 3;
1717*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
1718*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
1719*61046927SAndroid Build Coastguard Worker return sizeof(GLint) * 4;
1720*61046927SAndroid Build Coastguard Worker case TYPE_INT_N:
1721*61046927SAndroid Build Coastguard Worker return sizeof(GLint) * v->value_int_n.n;
1722*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
1723*61046927SAndroid Build Coastguard Worker return sizeof(GLint64);
1724*61046927SAndroid Build Coastguard Worker break;
1725*61046927SAndroid Build Coastguard Worker case TYPE_ENUM16:
1726*61046927SAndroid Build Coastguard Worker return sizeof(GLenum16);
1727*61046927SAndroid Build Coastguard Worker case TYPE_ENUM:
1728*61046927SAndroid Build Coastguard Worker return sizeof(GLenum);
1729*61046927SAndroid Build Coastguard Worker case TYPE_ENUM_2:
1730*61046927SAndroid Build Coastguard Worker return sizeof(GLenum) * 2;
1731*61046927SAndroid Build Coastguard Worker case TYPE_BOOLEAN:
1732*61046927SAndroid Build Coastguard Worker return sizeof(GLboolean);
1733*61046927SAndroid Build Coastguard Worker case TYPE_UBYTE:
1734*61046927SAndroid Build Coastguard Worker return sizeof(GLubyte);
1735*61046927SAndroid Build Coastguard Worker case TYPE_SHORT:
1736*61046927SAndroid Build Coastguard Worker return sizeof(GLshort);
1737*61046927SAndroid Build Coastguard Worker case TYPE_BIT_0:
1738*61046927SAndroid Build Coastguard Worker case TYPE_BIT_1:
1739*61046927SAndroid Build Coastguard Worker case TYPE_BIT_2:
1740*61046927SAndroid Build Coastguard Worker case TYPE_BIT_3:
1741*61046927SAndroid Build Coastguard Worker case TYPE_BIT_4:
1742*61046927SAndroid Build Coastguard Worker case TYPE_BIT_5:
1743*61046927SAndroid Build Coastguard Worker case TYPE_BIT_6:
1744*61046927SAndroid Build Coastguard Worker case TYPE_BIT_7:
1745*61046927SAndroid Build Coastguard Worker return 1;
1746*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
1747*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN:
1748*61046927SAndroid Build Coastguard Worker return sizeof(GLfloat);
1749*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_2:
1750*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_2:
1751*61046927SAndroid Build Coastguard Worker return sizeof(GLfloat) * 2;
1752*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_3:
1753*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_3:
1754*61046927SAndroid Build Coastguard Worker return sizeof(GLfloat) * 3;
1755*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_4:
1756*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_4:
1757*61046927SAndroid Build Coastguard Worker return sizeof(GLfloat) * 4;
1758*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_8:
1759*61046927SAndroid Build Coastguard Worker return sizeof(GLfloat) * 8;
1760*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN:
1761*61046927SAndroid Build Coastguard Worker return sizeof(GLdouble);
1762*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN_2:
1763*61046927SAndroid Build Coastguard Worker return sizeof(GLdouble) * 2;
1764*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX:
1765*61046927SAndroid Build Coastguard Worker return sizeof (GLfloat) * 16;
1766*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX_T:
1767*61046927SAndroid Build Coastguard Worker return sizeof (GLfloat) * 16;
1768*61046927SAndroid Build Coastguard Worker default:
1769*61046927SAndroid Build Coastguard Worker assert(!"invalid value_type given for get_value_size()");
1770*61046927SAndroid Build Coastguard Worker return -1;
1771*61046927SAndroid Build Coastguard Worker }
1772*61046927SAndroid Build Coastguard Worker }
1773*61046927SAndroid Build Coastguard Worker
1774*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetBooleanv(GLenum pname,GLboolean * params)1775*61046927SAndroid Build Coastguard Worker _mesa_GetBooleanv(GLenum pname, GLboolean *params)
1776*61046927SAndroid Build Coastguard Worker {
1777*61046927SAndroid Build Coastguard Worker const struct value_desc *d;
1778*61046927SAndroid Build Coastguard Worker union value v;
1779*61046927SAndroid Build Coastguard Worker GLmatrix *m;
1780*61046927SAndroid Build Coastguard Worker int shift, i;
1781*61046927SAndroid Build Coastguard Worker void *p;
1782*61046927SAndroid Build Coastguard Worker
1783*61046927SAndroid Build Coastguard Worker d = find_value("glGetBooleanv", pname, &p, &v);
1784*61046927SAndroid Build Coastguard Worker switch (d->type) {
1785*61046927SAndroid Build Coastguard Worker case TYPE_INVALID:
1786*61046927SAndroid Build Coastguard Worker break;
1787*61046927SAndroid Build Coastguard Worker case TYPE_CONST:
1788*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_BOOLEAN(d->offset);
1789*61046927SAndroid Build Coastguard Worker break;
1790*61046927SAndroid Build Coastguard Worker
1791*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_8:
1792*61046927SAndroid Build Coastguard Worker params[7] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[7]);
1793*61046927SAndroid Build Coastguard Worker params[6] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[6]);
1794*61046927SAndroid Build Coastguard Worker params[5] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[5]);
1795*61046927SAndroid Build Coastguard Worker params[4] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[4]);
1796*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1797*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_4:
1798*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_4:
1799*61046927SAndroid Build Coastguard Worker params[3] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[3]);
1800*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1801*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_3:
1802*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_3:
1803*61046927SAndroid Build Coastguard Worker params[2] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[2]);
1804*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1805*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_2:
1806*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_2:
1807*61046927SAndroid Build Coastguard Worker params[1] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[1]);
1808*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1809*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
1810*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN:
1811*61046927SAndroid Build Coastguard Worker params[0] = FLOAT_TO_BOOLEAN(((GLfloat *) p)[0]);
1812*61046927SAndroid Build Coastguard Worker break;
1813*61046927SAndroid Build Coastguard Worker
1814*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN_2:
1815*61046927SAndroid Build Coastguard Worker params[1] = FLOAT_TO_BOOLEAN(((GLdouble *) p)[1]);
1816*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1817*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN:
1818*61046927SAndroid Build Coastguard Worker params[0] = FLOAT_TO_BOOLEAN(((GLdouble *) p)[0]);
1819*61046927SAndroid Build Coastguard Worker break;
1820*61046927SAndroid Build Coastguard Worker
1821*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
1822*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
1823*61046927SAndroid Build Coastguard Worker params[3] = INT_TO_BOOLEAN(((GLint *) p)[3]);
1824*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1825*61046927SAndroid Build Coastguard Worker case TYPE_INT_3:
1826*61046927SAndroid Build Coastguard Worker case TYPE_UINT_3:
1827*61046927SAndroid Build Coastguard Worker params[2] = INT_TO_BOOLEAN(((GLint *) p)[2]);
1828*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1829*61046927SAndroid Build Coastguard Worker case TYPE_INT_2:
1830*61046927SAndroid Build Coastguard Worker case TYPE_UINT_2:
1831*61046927SAndroid Build Coastguard Worker case TYPE_ENUM_2:
1832*61046927SAndroid Build Coastguard Worker params[1] = INT_TO_BOOLEAN(((GLint *) p)[1]);
1833*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1834*61046927SAndroid Build Coastguard Worker case TYPE_INT:
1835*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
1836*61046927SAndroid Build Coastguard Worker case TYPE_ENUM:
1837*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_BOOLEAN(((GLint *) p)[0]);
1838*61046927SAndroid Build Coastguard Worker break;
1839*61046927SAndroid Build Coastguard Worker
1840*61046927SAndroid Build Coastguard Worker case TYPE_ENUM16:
1841*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_BOOLEAN(((GLenum16 *) p)[0]);
1842*61046927SAndroid Build Coastguard Worker break;
1843*61046927SAndroid Build Coastguard Worker
1844*61046927SAndroid Build Coastguard Worker case TYPE_INT_N:
1845*61046927SAndroid Build Coastguard Worker for (i = 0; i < v.value_int_n.n; i++)
1846*61046927SAndroid Build Coastguard Worker params[i] = INT_TO_BOOLEAN(v.value_int_n.ints[i]);
1847*61046927SAndroid Build Coastguard Worker break;
1848*61046927SAndroid Build Coastguard Worker
1849*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
1850*61046927SAndroid Build Coastguard Worker params[0] = INT64_TO_BOOLEAN(((GLint64 *) p)[0]);
1851*61046927SAndroid Build Coastguard Worker break;
1852*61046927SAndroid Build Coastguard Worker
1853*61046927SAndroid Build Coastguard Worker case TYPE_BOOLEAN:
1854*61046927SAndroid Build Coastguard Worker params[0] = ((GLboolean*) p)[0];
1855*61046927SAndroid Build Coastguard Worker break;
1856*61046927SAndroid Build Coastguard Worker
1857*61046927SAndroid Build Coastguard Worker case TYPE_UBYTE:
1858*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_BOOLEAN(((GLubyte *) p)[0]);
1859*61046927SAndroid Build Coastguard Worker break;
1860*61046927SAndroid Build Coastguard Worker
1861*61046927SAndroid Build Coastguard Worker case TYPE_SHORT:
1862*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_BOOLEAN(((GLshort *) p)[0]);
1863*61046927SAndroid Build Coastguard Worker break;
1864*61046927SAndroid Build Coastguard Worker
1865*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX:
1866*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) p;
1867*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
1868*61046927SAndroid Build Coastguard Worker params[i] = FLOAT_TO_BOOLEAN(m->m[i]);
1869*61046927SAndroid Build Coastguard Worker break;
1870*61046927SAndroid Build Coastguard Worker
1871*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX_T:
1872*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) p;
1873*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
1874*61046927SAndroid Build Coastguard Worker params[i] = FLOAT_TO_BOOLEAN(m->m[transpose[i]]);
1875*61046927SAndroid Build Coastguard Worker break;
1876*61046927SAndroid Build Coastguard Worker
1877*61046927SAndroid Build Coastguard Worker case TYPE_BIT_0:
1878*61046927SAndroid Build Coastguard Worker case TYPE_BIT_1:
1879*61046927SAndroid Build Coastguard Worker case TYPE_BIT_2:
1880*61046927SAndroid Build Coastguard Worker case TYPE_BIT_3:
1881*61046927SAndroid Build Coastguard Worker case TYPE_BIT_4:
1882*61046927SAndroid Build Coastguard Worker case TYPE_BIT_5:
1883*61046927SAndroid Build Coastguard Worker case TYPE_BIT_6:
1884*61046927SAndroid Build Coastguard Worker case TYPE_BIT_7:
1885*61046927SAndroid Build Coastguard Worker shift = d->type - TYPE_BIT_0;
1886*61046927SAndroid Build Coastguard Worker params[0] = (*(GLbitfield *) p >> shift) & 1;
1887*61046927SAndroid Build Coastguard Worker break;
1888*61046927SAndroid Build Coastguard Worker }
1889*61046927SAndroid Build Coastguard Worker }
1890*61046927SAndroid Build Coastguard Worker
1891*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetFloatv(GLenum pname,GLfloat * params)1892*61046927SAndroid Build Coastguard Worker _mesa_GetFloatv(GLenum pname, GLfloat *params)
1893*61046927SAndroid Build Coastguard Worker {
1894*61046927SAndroid Build Coastguard Worker const struct value_desc *d;
1895*61046927SAndroid Build Coastguard Worker union value v;
1896*61046927SAndroid Build Coastguard Worker GLmatrix *m;
1897*61046927SAndroid Build Coastguard Worker int shift, i;
1898*61046927SAndroid Build Coastguard Worker void *p;
1899*61046927SAndroid Build Coastguard Worker
1900*61046927SAndroid Build Coastguard Worker d = find_value("glGetFloatv", pname, &p, &v);
1901*61046927SAndroid Build Coastguard Worker switch (d->type) {
1902*61046927SAndroid Build Coastguard Worker case TYPE_INVALID:
1903*61046927SAndroid Build Coastguard Worker break;
1904*61046927SAndroid Build Coastguard Worker case TYPE_CONST:
1905*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) d->offset;
1906*61046927SAndroid Build Coastguard Worker break;
1907*61046927SAndroid Build Coastguard Worker
1908*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_8:
1909*61046927SAndroid Build Coastguard Worker params[7] = ((GLfloat *) p)[7];
1910*61046927SAndroid Build Coastguard Worker params[6] = ((GLfloat *) p)[6];
1911*61046927SAndroid Build Coastguard Worker params[5] = ((GLfloat *) p)[5];
1912*61046927SAndroid Build Coastguard Worker params[4] = ((GLfloat *) p)[4];
1913*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1914*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_4:
1915*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_4:
1916*61046927SAndroid Build Coastguard Worker params[3] = ((GLfloat *) p)[3];
1917*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1918*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_3:
1919*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_3:
1920*61046927SAndroid Build Coastguard Worker params[2] = ((GLfloat *) p)[2];
1921*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1922*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_2:
1923*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_2:
1924*61046927SAndroid Build Coastguard Worker params[1] = ((GLfloat *) p)[1];
1925*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1926*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
1927*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN:
1928*61046927SAndroid Build Coastguard Worker params[0] = ((GLfloat *) p)[0];
1929*61046927SAndroid Build Coastguard Worker break;
1930*61046927SAndroid Build Coastguard Worker
1931*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN_2:
1932*61046927SAndroid Build Coastguard Worker params[1] = (GLfloat) (((GLdouble *) p)[1]);
1933*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1934*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN:
1935*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) (((GLdouble *) p)[0]);
1936*61046927SAndroid Build Coastguard Worker break;
1937*61046927SAndroid Build Coastguard Worker
1938*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
1939*61046927SAndroid Build Coastguard Worker params[3] = (GLfloat) (((GLint *) p)[3]);
1940*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1941*61046927SAndroid Build Coastguard Worker case TYPE_INT_3:
1942*61046927SAndroid Build Coastguard Worker params[2] = (GLfloat) (((GLint *) p)[2]);
1943*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1944*61046927SAndroid Build Coastguard Worker case TYPE_INT_2:
1945*61046927SAndroid Build Coastguard Worker case TYPE_ENUM_2:
1946*61046927SAndroid Build Coastguard Worker params[1] = (GLfloat) (((GLint *) p)[1]);
1947*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1948*61046927SAndroid Build Coastguard Worker case TYPE_INT:
1949*61046927SAndroid Build Coastguard Worker case TYPE_ENUM:
1950*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) (((GLint *) p)[0]);
1951*61046927SAndroid Build Coastguard Worker break;
1952*61046927SAndroid Build Coastguard Worker
1953*61046927SAndroid Build Coastguard Worker case TYPE_ENUM16:
1954*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) (((GLenum16 *) p)[0]);
1955*61046927SAndroid Build Coastguard Worker break;
1956*61046927SAndroid Build Coastguard Worker
1957*61046927SAndroid Build Coastguard Worker case TYPE_INT_N:
1958*61046927SAndroid Build Coastguard Worker for (i = 0; i < v.value_int_n.n; i++)
1959*61046927SAndroid Build Coastguard Worker params[i] = (GLfloat) v.value_int_n.ints[i];
1960*61046927SAndroid Build Coastguard Worker break;
1961*61046927SAndroid Build Coastguard Worker
1962*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
1963*61046927SAndroid Build Coastguard Worker params[3] = (GLfloat) (((GLuint *) p)[3]);
1964*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1965*61046927SAndroid Build Coastguard Worker case TYPE_UINT_3:
1966*61046927SAndroid Build Coastguard Worker params[2] = (GLfloat) (((GLuint *) p)[2]);
1967*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1968*61046927SAndroid Build Coastguard Worker case TYPE_UINT_2:
1969*61046927SAndroid Build Coastguard Worker params[1] = (GLfloat) (((GLuint *) p)[1]);
1970*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
1971*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
1972*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) (((GLuint *) p)[0]);
1973*61046927SAndroid Build Coastguard Worker break;
1974*61046927SAndroid Build Coastguard Worker
1975*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
1976*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) (((GLint64 *) p)[0]);
1977*61046927SAndroid Build Coastguard Worker break;
1978*61046927SAndroid Build Coastguard Worker
1979*61046927SAndroid Build Coastguard Worker case TYPE_BOOLEAN:
1980*61046927SAndroid Build Coastguard Worker params[0] = BOOLEAN_TO_FLOAT(*(GLboolean*) p);
1981*61046927SAndroid Build Coastguard Worker break;
1982*61046927SAndroid Build Coastguard Worker
1983*61046927SAndroid Build Coastguard Worker case TYPE_UBYTE:
1984*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) ((GLubyte *) p)[0];
1985*61046927SAndroid Build Coastguard Worker break;
1986*61046927SAndroid Build Coastguard Worker
1987*61046927SAndroid Build Coastguard Worker case TYPE_SHORT:
1988*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) ((GLshort *) p)[0];
1989*61046927SAndroid Build Coastguard Worker break;
1990*61046927SAndroid Build Coastguard Worker
1991*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX:
1992*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) p;
1993*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
1994*61046927SAndroid Build Coastguard Worker params[i] = m->m[i];
1995*61046927SAndroid Build Coastguard Worker break;
1996*61046927SAndroid Build Coastguard Worker
1997*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX_T:
1998*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) p;
1999*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
2000*61046927SAndroid Build Coastguard Worker params[i] = m->m[transpose[i]];
2001*61046927SAndroid Build Coastguard Worker break;
2002*61046927SAndroid Build Coastguard Worker
2003*61046927SAndroid Build Coastguard Worker case TYPE_BIT_0:
2004*61046927SAndroid Build Coastguard Worker case TYPE_BIT_1:
2005*61046927SAndroid Build Coastguard Worker case TYPE_BIT_2:
2006*61046927SAndroid Build Coastguard Worker case TYPE_BIT_3:
2007*61046927SAndroid Build Coastguard Worker case TYPE_BIT_4:
2008*61046927SAndroid Build Coastguard Worker case TYPE_BIT_5:
2009*61046927SAndroid Build Coastguard Worker case TYPE_BIT_6:
2010*61046927SAndroid Build Coastguard Worker case TYPE_BIT_7:
2011*61046927SAndroid Build Coastguard Worker shift = d->type - TYPE_BIT_0;
2012*61046927SAndroid Build Coastguard Worker params[0] = BOOLEAN_TO_FLOAT((*(GLbitfield *) p >> shift) & 1);
2013*61046927SAndroid Build Coastguard Worker break;
2014*61046927SAndroid Build Coastguard Worker }
2015*61046927SAndroid Build Coastguard Worker }
2016*61046927SAndroid Build Coastguard Worker
2017*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetIntegerv(GLenum pname,GLint * params)2018*61046927SAndroid Build Coastguard Worker _mesa_GetIntegerv(GLenum pname, GLint *params)
2019*61046927SAndroid Build Coastguard Worker {
2020*61046927SAndroid Build Coastguard Worker const struct value_desc *d;
2021*61046927SAndroid Build Coastguard Worker union value v;
2022*61046927SAndroid Build Coastguard Worker GLmatrix *m;
2023*61046927SAndroid Build Coastguard Worker int shift, i;
2024*61046927SAndroid Build Coastguard Worker void *p;
2025*61046927SAndroid Build Coastguard Worker
2026*61046927SAndroid Build Coastguard Worker d = find_value("glGetIntegerv", pname, &p, &v);
2027*61046927SAndroid Build Coastguard Worker switch (d->type) {
2028*61046927SAndroid Build Coastguard Worker case TYPE_INVALID:
2029*61046927SAndroid Build Coastguard Worker break;
2030*61046927SAndroid Build Coastguard Worker case TYPE_CONST:
2031*61046927SAndroid Build Coastguard Worker params[0] = d->offset;
2032*61046927SAndroid Build Coastguard Worker break;
2033*61046927SAndroid Build Coastguard Worker
2034*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_8:
2035*61046927SAndroid Build Coastguard Worker params[7] = lroundf(((GLfloat *) p)[7]);
2036*61046927SAndroid Build Coastguard Worker params[6] = lroundf(((GLfloat *) p)[6]);
2037*61046927SAndroid Build Coastguard Worker params[5] = lroundf(((GLfloat *) p)[5]);
2038*61046927SAndroid Build Coastguard Worker params[4] = lroundf(((GLfloat *) p)[4]);
2039*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2040*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_4:
2041*61046927SAndroid Build Coastguard Worker params[3] = lroundf(((GLfloat *) p)[3]);
2042*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2043*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_3:
2044*61046927SAndroid Build Coastguard Worker params[2] = lroundf(((GLfloat *) p)[2]);
2045*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2046*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_2:
2047*61046927SAndroid Build Coastguard Worker params[1] = lroundf(((GLfloat *) p)[1]);
2048*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2049*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
2050*61046927SAndroid Build Coastguard Worker params[0] = lroundf(((GLfloat *) p)[0]);
2051*61046927SAndroid Build Coastguard Worker break;
2052*61046927SAndroid Build Coastguard Worker
2053*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_4:
2054*61046927SAndroid Build Coastguard Worker params[3] = FLOAT_TO_INT(((GLfloat *) p)[3]);
2055*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2056*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_3:
2057*61046927SAndroid Build Coastguard Worker params[2] = FLOAT_TO_INT(((GLfloat *) p)[2]);
2058*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2059*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_2:
2060*61046927SAndroid Build Coastguard Worker params[1] = FLOAT_TO_INT(((GLfloat *) p)[1]);
2061*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2062*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN:
2063*61046927SAndroid Build Coastguard Worker params[0] = FLOAT_TO_INT(((GLfloat *) p)[0]);
2064*61046927SAndroid Build Coastguard Worker break;
2065*61046927SAndroid Build Coastguard Worker
2066*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN_2:
2067*61046927SAndroid Build Coastguard Worker params[1] = FLOAT_TO_INT(((GLdouble *) p)[1]);
2068*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2069*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN:
2070*61046927SAndroid Build Coastguard Worker params[0] = FLOAT_TO_INT(((GLdouble *) p)[0]);
2071*61046927SAndroid Build Coastguard Worker break;
2072*61046927SAndroid Build Coastguard Worker
2073*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
2074*61046927SAndroid Build Coastguard Worker params[3] = ((GLint *) p)[3];
2075*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2076*61046927SAndroid Build Coastguard Worker case TYPE_INT_3:
2077*61046927SAndroid Build Coastguard Worker params[2] = ((GLint *) p)[2];
2078*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2079*61046927SAndroid Build Coastguard Worker case TYPE_INT_2:
2080*61046927SAndroid Build Coastguard Worker case TYPE_ENUM_2:
2081*61046927SAndroid Build Coastguard Worker params[1] = ((GLint *) p)[1];
2082*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2083*61046927SAndroid Build Coastguard Worker case TYPE_INT:
2084*61046927SAndroid Build Coastguard Worker case TYPE_ENUM:
2085*61046927SAndroid Build Coastguard Worker params[0] = ((GLint *) p)[0];
2086*61046927SAndroid Build Coastguard Worker break;
2087*61046927SAndroid Build Coastguard Worker
2088*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
2089*61046927SAndroid Build Coastguard Worker params[3] = MIN2(((GLuint *) p)[3], INT_MAX);
2090*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2091*61046927SAndroid Build Coastguard Worker case TYPE_UINT_3:
2092*61046927SAndroid Build Coastguard Worker params[2] = MIN2(((GLuint *) p)[2], INT_MAX);
2093*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2094*61046927SAndroid Build Coastguard Worker case TYPE_UINT_2:
2095*61046927SAndroid Build Coastguard Worker params[1] = MIN2(((GLuint *) p)[1], INT_MAX);
2096*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2097*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
2098*61046927SAndroid Build Coastguard Worker params[0] = MIN2(((GLuint *) p)[0], INT_MAX);
2099*61046927SAndroid Build Coastguard Worker break;
2100*61046927SAndroid Build Coastguard Worker
2101*61046927SAndroid Build Coastguard Worker case TYPE_ENUM16:
2102*61046927SAndroid Build Coastguard Worker params[0] = ((GLenum16 *) p)[0];
2103*61046927SAndroid Build Coastguard Worker break;
2104*61046927SAndroid Build Coastguard Worker
2105*61046927SAndroid Build Coastguard Worker case TYPE_INT_N:
2106*61046927SAndroid Build Coastguard Worker for (i = 0; i < v.value_int_n.n; i++)
2107*61046927SAndroid Build Coastguard Worker params[i] = v.value_int_n.ints[i];
2108*61046927SAndroid Build Coastguard Worker break;
2109*61046927SAndroid Build Coastguard Worker
2110*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
2111*61046927SAndroid Build Coastguard Worker params[0] = INT64_TO_INT(((GLint64 *) p)[0]);
2112*61046927SAndroid Build Coastguard Worker break;
2113*61046927SAndroid Build Coastguard Worker
2114*61046927SAndroid Build Coastguard Worker case TYPE_BOOLEAN:
2115*61046927SAndroid Build Coastguard Worker params[0] = BOOLEAN_TO_INT(*(GLboolean*) p);
2116*61046927SAndroid Build Coastguard Worker break;
2117*61046927SAndroid Build Coastguard Worker
2118*61046927SAndroid Build Coastguard Worker case TYPE_UBYTE:
2119*61046927SAndroid Build Coastguard Worker params[0] = ((GLubyte *) p)[0];
2120*61046927SAndroid Build Coastguard Worker break;
2121*61046927SAndroid Build Coastguard Worker
2122*61046927SAndroid Build Coastguard Worker case TYPE_SHORT:
2123*61046927SAndroid Build Coastguard Worker params[0] = ((GLshort *) p)[0];
2124*61046927SAndroid Build Coastguard Worker break;
2125*61046927SAndroid Build Coastguard Worker
2126*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX:
2127*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) p;
2128*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
2129*61046927SAndroid Build Coastguard Worker params[i] = FLOAT_TO_INT(m->m[i]);
2130*61046927SAndroid Build Coastguard Worker break;
2131*61046927SAndroid Build Coastguard Worker
2132*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX_T:
2133*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) p;
2134*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
2135*61046927SAndroid Build Coastguard Worker params[i] = FLOAT_TO_INT(m->m[transpose[i]]);
2136*61046927SAndroid Build Coastguard Worker break;
2137*61046927SAndroid Build Coastguard Worker
2138*61046927SAndroid Build Coastguard Worker case TYPE_BIT_0:
2139*61046927SAndroid Build Coastguard Worker case TYPE_BIT_1:
2140*61046927SAndroid Build Coastguard Worker case TYPE_BIT_2:
2141*61046927SAndroid Build Coastguard Worker case TYPE_BIT_3:
2142*61046927SAndroid Build Coastguard Worker case TYPE_BIT_4:
2143*61046927SAndroid Build Coastguard Worker case TYPE_BIT_5:
2144*61046927SAndroid Build Coastguard Worker case TYPE_BIT_6:
2145*61046927SAndroid Build Coastguard Worker case TYPE_BIT_7:
2146*61046927SAndroid Build Coastguard Worker shift = d->type - TYPE_BIT_0;
2147*61046927SAndroid Build Coastguard Worker params[0] = (*(GLbitfield *) p >> shift) & 1;
2148*61046927SAndroid Build Coastguard Worker break;
2149*61046927SAndroid Build Coastguard Worker }
2150*61046927SAndroid Build Coastguard Worker }
2151*61046927SAndroid Build Coastguard Worker
2152*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetInteger64v(GLenum pname,GLint64 * params)2153*61046927SAndroid Build Coastguard Worker _mesa_GetInteger64v(GLenum pname, GLint64 *params)
2154*61046927SAndroid Build Coastguard Worker {
2155*61046927SAndroid Build Coastguard Worker const struct value_desc *d;
2156*61046927SAndroid Build Coastguard Worker union value v;
2157*61046927SAndroid Build Coastguard Worker GLmatrix *m;
2158*61046927SAndroid Build Coastguard Worker int shift, i;
2159*61046927SAndroid Build Coastguard Worker void *p;
2160*61046927SAndroid Build Coastguard Worker
2161*61046927SAndroid Build Coastguard Worker d = find_value("glGetInteger64v", pname, &p, &v);
2162*61046927SAndroid Build Coastguard Worker switch (d->type) {
2163*61046927SAndroid Build Coastguard Worker case TYPE_INVALID:
2164*61046927SAndroid Build Coastguard Worker break;
2165*61046927SAndroid Build Coastguard Worker case TYPE_CONST:
2166*61046927SAndroid Build Coastguard Worker params[0] = d->offset;
2167*61046927SAndroid Build Coastguard Worker break;
2168*61046927SAndroid Build Coastguard Worker
2169*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_8:
2170*61046927SAndroid Build Coastguard Worker params[7] = llround(((GLfloat *) p)[7]);
2171*61046927SAndroid Build Coastguard Worker params[6] = llround(((GLfloat *) p)[6]);
2172*61046927SAndroid Build Coastguard Worker params[5] = llround(((GLfloat *) p)[5]);
2173*61046927SAndroid Build Coastguard Worker params[4] = llround(((GLfloat *) p)[4]);
2174*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2175*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_4:
2176*61046927SAndroid Build Coastguard Worker params[3] = llround(((GLfloat *) p)[3]);
2177*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2178*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_3:
2179*61046927SAndroid Build Coastguard Worker params[2] = llround(((GLfloat *) p)[2]);
2180*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2181*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_2:
2182*61046927SAndroid Build Coastguard Worker params[1] = llround(((GLfloat *) p)[1]);
2183*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2184*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
2185*61046927SAndroid Build Coastguard Worker params[0] = llround(((GLfloat *) p)[0]);
2186*61046927SAndroid Build Coastguard Worker break;
2187*61046927SAndroid Build Coastguard Worker
2188*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_4:
2189*61046927SAndroid Build Coastguard Worker params[3] = FLOAT_TO_INT(((GLfloat *) p)[3]);
2190*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2191*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_3:
2192*61046927SAndroid Build Coastguard Worker params[2] = FLOAT_TO_INT(((GLfloat *) p)[2]);
2193*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2194*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_2:
2195*61046927SAndroid Build Coastguard Worker params[1] = FLOAT_TO_INT(((GLfloat *) p)[1]);
2196*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2197*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN:
2198*61046927SAndroid Build Coastguard Worker params[0] = FLOAT_TO_INT(((GLfloat *) p)[0]);
2199*61046927SAndroid Build Coastguard Worker break;
2200*61046927SAndroid Build Coastguard Worker
2201*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN_2:
2202*61046927SAndroid Build Coastguard Worker params[1] = FLOAT_TO_INT(((GLdouble *) p)[1]);
2203*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2204*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN:
2205*61046927SAndroid Build Coastguard Worker params[0] = FLOAT_TO_INT(((GLdouble *) p)[0]);
2206*61046927SAndroid Build Coastguard Worker break;
2207*61046927SAndroid Build Coastguard Worker
2208*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
2209*61046927SAndroid Build Coastguard Worker params[3] = ((GLint *) p)[3];
2210*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2211*61046927SAndroid Build Coastguard Worker case TYPE_INT_3:
2212*61046927SAndroid Build Coastguard Worker params[2] = ((GLint *) p)[2];
2213*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2214*61046927SAndroid Build Coastguard Worker case TYPE_INT_2:
2215*61046927SAndroid Build Coastguard Worker case TYPE_ENUM_2:
2216*61046927SAndroid Build Coastguard Worker params[1] = ((GLint *) p)[1];
2217*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2218*61046927SAndroid Build Coastguard Worker case TYPE_INT:
2219*61046927SAndroid Build Coastguard Worker case TYPE_ENUM:
2220*61046927SAndroid Build Coastguard Worker params[0] = ((GLint *) p)[0];
2221*61046927SAndroid Build Coastguard Worker break;
2222*61046927SAndroid Build Coastguard Worker
2223*61046927SAndroid Build Coastguard Worker case TYPE_ENUM16:
2224*61046927SAndroid Build Coastguard Worker params[0] = ((GLenum16 *) p)[0];
2225*61046927SAndroid Build Coastguard Worker break;
2226*61046927SAndroid Build Coastguard Worker
2227*61046927SAndroid Build Coastguard Worker case TYPE_INT_N:
2228*61046927SAndroid Build Coastguard Worker for (i = 0; i < v.value_int_n.n; i++)
2229*61046927SAndroid Build Coastguard Worker params[i] = v.value_int_n.ints[i];
2230*61046927SAndroid Build Coastguard Worker break;
2231*61046927SAndroid Build Coastguard Worker
2232*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
2233*61046927SAndroid Build Coastguard Worker params[3] = ((GLuint *) p)[3];
2234*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2235*61046927SAndroid Build Coastguard Worker case TYPE_UINT_3:
2236*61046927SAndroid Build Coastguard Worker params[2] = ((GLuint *) p)[2];
2237*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2238*61046927SAndroid Build Coastguard Worker case TYPE_UINT_2:
2239*61046927SAndroid Build Coastguard Worker params[1] = ((GLuint *) p)[1];
2240*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2241*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
2242*61046927SAndroid Build Coastguard Worker params[0] = ((GLuint *) p)[0];
2243*61046927SAndroid Build Coastguard Worker break;
2244*61046927SAndroid Build Coastguard Worker
2245*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
2246*61046927SAndroid Build Coastguard Worker params[0] = ((GLint64 *) p)[0];
2247*61046927SAndroid Build Coastguard Worker break;
2248*61046927SAndroid Build Coastguard Worker
2249*61046927SAndroid Build Coastguard Worker case TYPE_BOOLEAN:
2250*61046927SAndroid Build Coastguard Worker params[0] = ((GLboolean*) p)[0];
2251*61046927SAndroid Build Coastguard Worker break;
2252*61046927SAndroid Build Coastguard Worker
2253*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX:
2254*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) p;
2255*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
2256*61046927SAndroid Build Coastguard Worker params[i] = FLOAT_TO_INT64(m->m[i]);
2257*61046927SAndroid Build Coastguard Worker break;
2258*61046927SAndroid Build Coastguard Worker
2259*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX_T:
2260*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) p;
2261*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
2262*61046927SAndroid Build Coastguard Worker params[i] = FLOAT_TO_INT64(m->m[transpose[i]]);
2263*61046927SAndroid Build Coastguard Worker break;
2264*61046927SAndroid Build Coastguard Worker
2265*61046927SAndroid Build Coastguard Worker case TYPE_BIT_0:
2266*61046927SAndroid Build Coastguard Worker case TYPE_BIT_1:
2267*61046927SAndroid Build Coastguard Worker case TYPE_BIT_2:
2268*61046927SAndroid Build Coastguard Worker case TYPE_BIT_3:
2269*61046927SAndroid Build Coastguard Worker case TYPE_BIT_4:
2270*61046927SAndroid Build Coastguard Worker case TYPE_BIT_5:
2271*61046927SAndroid Build Coastguard Worker case TYPE_BIT_6:
2272*61046927SAndroid Build Coastguard Worker case TYPE_BIT_7:
2273*61046927SAndroid Build Coastguard Worker shift = d->type - TYPE_BIT_0;
2274*61046927SAndroid Build Coastguard Worker params[0] = (*(GLbitfield *) p >> shift) & 1;
2275*61046927SAndroid Build Coastguard Worker break;
2276*61046927SAndroid Build Coastguard Worker }
2277*61046927SAndroid Build Coastguard Worker }
2278*61046927SAndroid Build Coastguard Worker
2279*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetDoublev(GLenum pname,GLdouble * params)2280*61046927SAndroid Build Coastguard Worker _mesa_GetDoublev(GLenum pname, GLdouble *params)
2281*61046927SAndroid Build Coastguard Worker {
2282*61046927SAndroid Build Coastguard Worker const struct value_desc *d;
2283*61046927SAndroid Build Coastguard Worker union value v;
2284*61046927SAndroid Build Coastguard Worker GLmatrix *m;
2285*61046927SAndroid Build Coastguard Worker int shift, i;
2286*61046927SAndroid Build Coastguard Worker void *p;
2287*61046927SAndroid Build Coastguard Worker
2288*61046927SAndroid Build Coastguard Worker d = find_value("glGetDoublev", pname, &p, &v);
2289*61046927SAndroid Build Coastguard Worker switch (d->type) {
2290*61046927SAndroid Build Coastguard Worker case TYPE_INVALID:
2291*61046927SAndroid Build Coastguard Worker break;
2292*61046927SAndroid Build Coastguard Worker case TYPE_CONST:
2293*61046927SAndroid Build Coastguard Worker params[0] = d->offset;
2294*61046927SAndroid Build Coastguard Worker break;
2295*61046927SAndroid Build Coastguard Worker
2296*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_8:
2297*61046927SAndroid Build Coastguard Worker params[7] = ((GLfloat *) p)[7];
2298*61046927SAndroid Build Coastguard Worker params[6] = ((GLfloat *) p)[6];
2299*61046927SAndroid Build Coastguard Worker params[5] = ((GLfloat *) p)[5];
2300*61046927SAndroid Build Coastguard Worker params[4] = ((GLfloat *) p)[4];
2301*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2302*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_4:
2303*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_4:
2304*61046927SAndroid Build Coastguard Worker params[3] = ((GLfloat *) p)[3];
2305*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2306*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_3:
2307*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_3:
2308*61046927SAndroid Build Coastguard Worker params[2] = ((GLfloat *) p)[2];
2309*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2310*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_2:
2311*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_2:
2312*61046927SAndroid Build Coastguard Worker params[1] = ((GLfloat *) p)[1];
2313*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2314*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
2315*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN:
2316*61046927SAndroid Build Coastguard Worker params[0] = ((GLfloat *) p)[0];
2317*61046927SAndroid Build Coastguard Worker break;
2318*61046927SAndroid Build Coastguard Worker
2319*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN_2:
2320*61046927SAndroid Build Coastguard Worker params[1] = ((GLdouble *) p)[1];
2321*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2322*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN:
2323*61046927SAndroid Build Coastguard Worker params[0] = ((GLdouble *) p)[0];
2324*61046927SAndroid Build Coastguard Worker break;
2325*61046927SAndroid Build Coastguard Worker
2326*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
2327*61046927SAndroid Build Coastguard Worker params[3] = ((GLint *) p)[3];
2328*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2329*61046927SAndroid Build Coastguard Worker case TYPE_INT_3:
2330*61046927SAndroid Build Coastguard Worker params[2] = ((GLint *) p)[2];
2331*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2332*61046927SAndroid Build Coastguard Worker case TYPE_INT_2:
2333*61046927SAndroid Build Coastguard Worker case TYPE_ENUM_2:
2334*61046927SAndroid Build Coastguard Worker params[1] = ((GLint *) p)[1];
2335*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2336*61046927SAndroid Build Coastguard Worker case TYPE_INT:
2337*61046927SAndroid Build Coastguard Worker case TYPE_ENUM:
2338*61046927SAndroid Build Coastguard Worker params[0] = ((GLint *) p)[0];
2339*61046927SAndroid Build Coastguard Worker break;
2340*61046927SAndroid Build Coastguard Worker
2341*61046927SAndroid Build Coastguard Worker case TYPE_ENUM16:
2342*61046927SAndroid Build Coastguard Worker params[0] = ((GLenum16 *) p)[0];
2343*61046927SAndroid Build Coastguard Worker break;
2344*61046927SAndroid Build Coastguard Worker
2345*61046927SAndroid Build Coastguard Worker case TYPE_INT_N:
2346*61046927SAndroid Build Coastguard Worker for (i = 0; i < v.value_int_n.n; i++)
2347*61046927SAndroid Build Coastguard Worker params[i] = v.value_int_n.ints[i];
2348*61046927SAndroid Build Coastguard Worker break;
2349*61046927SAndroid Build Coastguard Worker
2350*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
2351*61046927SAndroid Build Coastguard Worker params[3] = ((GLuint *) p)[3];
2352*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2353*61046927SAndroid Build Coastguard Worker case TYPE_UINT_3:
2354*61046927SAndroid Build Coastguard Worker params[2] = ((GLuint *) p)[2];
2355*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2356*61046927SAndroid Build Coastguard Worker case TYPE_UINT_2:
2357*61046927SAndroid Build Coastguard Worker params[1] = ((GLuint *) p)[1];
2358*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2359*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
2360*61046927SAndroid Build Coastguard Worker params[0] = ((GLuint *) p)[0];
2361*61046927SAndroid Build Coastguard Worker break;
2362*61046927SAndroid Build Coastguard Worker
2363*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
2364*61046927SAndroid Build Coastguard Worker params[0] = (GLdouble) (((GLint64 *) p)[0]);
2365*61046927SAndroid Build Coastguard Worker break;
2366*61046927SAndroid Build Coastguard Worker
2367*61046927SAndroid Build Coastguard Worker case TYPE_BOOLEAN:
2368*61046927SAndroid Build Coastguard Worker params[0] = *(GLboolean*) p;
2369*61046927SAndroid Build Coastguard Worker break;
2370*61046927SAndroid Build Coastguard Worker
2371*61046927SAndroid Build Coastguard Worker case TYPE_UBYTE:
2372*61046927SAndroid Build Coastguard Worker params[0] = ((GLubyte *) p)[0];
2373*61046927SAndroid Build Coastguard Worker break;
2374*61046927SAndroid Build Coastguard Worker
2375*61046927SAndroid Build Coastguard Worker case TYPE_SHORT:
2376*61046927SAndroid Build Coastguard Worker params[0] = ((GLshort *) p)[0];
2377*61046927SAndroid Build Coastguard Worker break;
2378*61046927SAndroid Build Coastguard Worker
2379*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX:
2380*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) p;
2381*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
2382*61046927SAndroid Build Coastguard Worker params[i] = m->m[i];
2383*61046927SAndroid Build Coastguard Worker break;
2384*61046927SAndroid Build Coastguard Worker
2385*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX_T:
2386*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) p;
2387*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
2388*61046927SAndroid Build Coastguard Worker params[i] = m->m[transpose[i]];
2389*61046927SAndroid Build Coastguard Worker break;
2390*61046927SAndroid Build Coastguard Worker
2391*61046927SAndroid Build Coastguard Worker case TYPE_BIT_0:
2392*61046927SAndroid Build Coastguard Worker case TYPE_BIT_1:
2393*61046927SAndroid Build Coastguard Worker case TYPE_BIT_2:
2394*61046927SAndroid Build Coastguard Worker case TYPE_BIT_3:
2395*61046927SAndroid Build Coastguard Worker case TYPE_BIT_4:
2396*61046927SAndroid Build Coastguard Worker case TYPE_BIT_5:
2397*61046927SAndroid Build Coastguard Worker case TYPE_BIT_6:
2398*61046927SAndroid Build Coastguard Worker case TYPE_BIT_7:
2399*61046927SAndroid Build Coastguard Worker shift = d->type - TYPE_BIT_0;
2400*61046927SAndroid Build Coastguard Worker params[0] = (*(GLbitfield *) p >> shift) & 1;
2401*61046927SAndroid Build Coastguard Worker break;
2402*61046927SAndroid Build Coastguard Worker }
2403*61046927SAndroid Build Coastguard Worker }
2404*61046927SAndroid Build Coastguard Worker
2405*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetUnsignedBytevEXT(GLenum pname,GLubyte * data)2406*61046927SAndroid Build Coastguard Worker _mesa_GetUnsignedBytevEXT(GLenum pname, GLubyte *data)
2407*61046927SAndroid Build Coastguard Worker {
2408*61046927SAndroid Build Coastguard Worker const struct value_desc *d;
2409*61046927SAndroid Build Coastguard Worker union value v;
2410*61046927SAndroid Build Coastguard Worker int shift;
2411*61046927SAndroid Build Coastguard Worker void *p = NULL;
2412*61046927SAndroid Build Coastguard Worker GLsizei size;
2413*61046927SAndroid Build Coastguard Worker const char *func = "glGetUnsignedBytevEXT";
2414*61046927SAndroid Build Coastguard Worker
2415*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2416*61046927SAndroid Build Coastguard Worker
2417*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_memory_object) {
2418*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
2419*61046927SAndroid Build Coastguard Worker return;
2420*61046927SAndroid Build Coastguard Worker }
2421*61046927SAndroid Build Coastguard Worker
2422*61046927SAndroid Build Coastguard Worker d = find_value(func, pname, &p, &v);
2423*61046927SAndroid Build Coastguard Worker size = get_value_size(d->type, &v);
2424*61046927SAndroid Build Coastguard Worker
2425*61046927SAndroid Build Coastguard Worker switch (d->type) {
2426*61046927SAndroid Build Coastguard Worker case TYPE_BIT_0:
2427*61046927SAndroid Build Coastguard Worker case TYPE_BIT_1:
2428*61046927SAndroid Build Coastguard Worker case TYPE_BIT_2:
2429*61046927SAndroid Build Coastguard Worker case TYPE_BIT_3:
2430*61046927SAndroid Build Coastguard Worker case TYPE_BIT_4:
2431*61046927SAndroid Build Coastguard Worker case TYPE_BIT_5:
2432*61046927SAndroid Build Coastguard Worker case TYPE_BIT_6:
2433*61046927SAndroid Build Coastguard Worker case TYPE_BIT_7:
2434*61046927SAndroid Build Coastguard Worker shift = d->type - TYPE_BIT_0;
2435*61046927SAndroid Build Coastguard Worker data[0] = (*(GLbitfield *) p >> shift) & 1;
2436*61046927SAndroid Build Coastguard Worker break;
2437*61046927SAndroid Build Coastguard Worker case TYPE_CONST:
2438*61046927SAndroid Build Coastguard Worker memcpy(data, &d->offset, size);
2439*61046927SAndroid Build Coastguard Worker break;
2440*61046927SAndroid Build Coastguard Worker case TYPE_INT_N:
2441*61046927SAndroid Build Coastguard Worker memcpy(data, &v.value_int_n.ints, size);
2442*61046927SAndroid Build Coastguard Worker break;
2443*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
2444*61046927SAndroid Build Coastguard Worker case TYPE_INT:
2445*61046927SAndroid Build Coastguard Worker case TYPE_INT_2:
2446*61046927SAndroid Build Coastguard Worker case TYPE_UINT_2:
2447*61046927SAndroid Build Coastguard Worker case TYPE_INT_3:
2448*61046927SAndroid Build Coastguard Worker case TYPE_UINT_3:
2449*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
2450*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
2451*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
2452*61046927SAndroid Build Coastguard Worker case TYPE_ENUM:
2453*61046927SAndroid Build Coastguard Worker case TYPE_ENUM_2:
2454*61046927SAndroid Build Coastguard Worker case TYPE_BOOLEAN:
2455*61046927SAndroid Build Coastguard Worker case TYPE_UBYTE:
2456*61046927SAndroid Build Coastguard Worker case TYPE_SHORT:
2457*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
2458*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN:
2459*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_2:
2460*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_2:
2461*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_3:
2462*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_3:
2463*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_4:
2464*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_4:
2465*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_8:
2466*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN:
2467*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN_2:
2468*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX:
2469*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX_T:
2470*61046927SAndroid Build Coastguard Worker memcpy(data, p, size);
2471*61046927SAndroid Build Coastguard Worker break;
2472*61046927SAndroid Build Coastguard Worker case TYPE_ENUM16: {
2473*61046927SAndroid Build Coastguard Worker GLenum e = *(GLenum16 *)p;
2474*61046927SAndroid Build Coastguard Worker memcpy(data, &e, sizeof(e));
2475*61046927SAndroid Build Coastguard Worker break;
2476*61046927SAndroid Build Coastguard Worker }
2477*61046927SAndroid Build Coastguard Worker default:
2478*61046927SAndroid Build Coastguard Worker break; /* nothing - GL error was recorded */
2479*61046927SAndroid Build Coastguard Worker }
2480*61046927SAndroid Build Coastguard Worker }
2481*61046927SAndroid Build Coastguard Worker
2482*61046927SAndroid Build Coastguard Worker /**
2483*61046927SAndroid Build Coastguard Worker * Convert a GL texture binding enum such as GL_TEXTURE_BINDING_2D
2484*61046927SAndroid Build Coastguard Worker * into the corresponding Mesa texture target index.
2485*61046927SAndroid Build Coastguard Worker * \return TEXTURE_x_INDEX or -1 if binding is invalid
2486*61046927SAndroid Build Coastguard Worker */
2487*61046927SAndroid Build Coastguard Worker static int
tex_binding_to_index(const struct gl_context * ctx,GLenum binding)2488*61046927SAndroid Build Coastguard Worker tex_binding_to_index(const struct gl_context *ctx, GLenum binding)
2489*61046927SAndroid Build Coastguard Worker {
2490*61046927SAndroid Build Coastguard Worker switch (binding) {
2491*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_1D:
2492*61046927SAndroid Build Coastguard Worker return _mesa_is_desktop_gl(ctx) ? TEXTURE_1D_INDEX : -1;
2493*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_2D:
2494*61046927SAndroid Build Coastguard Worker return TEXTURE_2D_INDEX;
2495*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_3D:
2496*61046927SAndroid Build Coastguard Worker return (ctx->API != API_OPENGLES &&
2497*61046927SAndroid Build Coastguard Worker !(_mesa_is_gles2(ctx) && !ctx->Extensions.OES_texture_3D))
2498*61046927SAndroid Build Coastguard Worker ? TEXTURE_3D_INDEX : -1;
2499*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_CUBE_MAP:
2500*61046927SAndroid Build Coastguard Worker return TEXTURE_CUBE_INDEX;
2501*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_RECTANGLE:
2502*61046927SAndroid Build Coastguard Worker return _mesa_is_desktop_gl(ctx) && ctx->Extensions.NV_texture_rectangle
2503*61046927SAndroid Build Coastguard Worker ? TEXTURE_RECT_INDEX : -1;
2504*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_1D_ARRAY:
2505*61046927SAndroid Build Coastguard Worker return _mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_array
2506*61046927SAndroid Build Coastguard Worker ? TEXTURE_1D_ARRAY_INDEX : -1;
2507*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_2D_ARRAY:
2508*61046927SAndroid Build Coastguard Worker return (_mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_array)
2509*61046927SAndroid Build Coastguard Worker || _mesa_is_gles3(ctx)
2510*61046927SAndroid Build Coastguard Worker ? TEXTURE_2D_ARRAY_INDEX : -1;
2511*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_BUFFER:
2512*61046927SAndroid Build Coastguard Worker return (_mesa_has_ARB_texture_buffer_object(ctx) ||
2513*61046927SAndroid Build Coastguard Worker _mesa_has_OES_texture_buffer(ctx)) ?
2514*61046927SAndroid Build Coastguard Worker TEXTURE_BUFFER_INDEX : -1;
2515*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
2516*61046927SAndroid Build Coastguard Worker return _mesa_has_texture_cube_map_array(ctx)
2517*61046927SAndroid Build Coastguard Worker ? TEXTURE_CUBE_ARRAY_INDEX : -1;
2518*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
2519*61046927SAndroid Build Coastguard Worker return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample
2520*61046927SAndroid Build Coastguard Worker ? TEXTURE_2D_MULTISAMPLE_INDEX : -1;
2521*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
2522*61046927SAndroid Build Coastguard Worker return _mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample
2523*61046927SAndroid Build Coastguard Worker ? TEXTURE_2D_MULTISAMPLE_ARRAY_INDEX : -1;
2524*61046927SAndroid Build Coastguard Worker default:
2525*61046927SAndroid Build Coastguard Worker return -1;
2526*61046927SAndroid Build Coastguard Worker }
2527*61046927SAndroid Build Coastguard Worker }
2528*61046927SAndroid Build Coastguard Worker
2529*61046927SAndroid Build Coastguard Worker static enum value_type
find_value_indexed(const char * func,GLenum pname,GLuint index,union value * v)2530*61046927SAndroid Build Coastguard Worker find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
2531*61046927SAndroid Build Coastguard Worker {
2532*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
2533*61046927SAndroid Build Coastguard Worker struct gl_buffer_object *buf;
2534*61046927SAndroid Build Coastguard Worker
2535*61046927SAndroid Build Coastguard Worker switch (pname) {
2536*61046927SAndroid Build Coastguard Worker
2537*61046927SAndroid Build Coastguard Worker case GL_BLEND:
2538*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxDrawBuffers)
2539*61046927SAndroid Build Coastguard Worker goto invalid_value;
2540*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_draw_buffers2)
2541*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2542*61046927SAndroid Build Coastguard Worker v->value_int = (ctx->Color.BlendEnabled >> index) & 1;
2543*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2544*61046927SAndroid Build Coastguard Worker
2545*61046927SAndroid Build Coastguard Worker case GL_BLEND_SRC:
2546*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2547*61046927SAndroid Build Coastguard Worker case GL_BLEND_SRC_RGB:
2548*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxDrawBuffers)
2549*61046927SAndroid Build Coastguard Worker goto invalid_value;
2550*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_draw_buffers_blend)
2551*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2552*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Color.Blend[index].SrcRGB;
2553*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2554*61046927SAndroid Build Coastguard Worker case GL_BLEND_SRC_ALPHA:
2555*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxDrawBuffers)
2556*61046927SAndroid Build Coastguard Worker goto invalid_value;
2557*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_draw_buffers_blend)
2558*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2559*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Color.Blend[index].SrcA;
2560*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2561*61046927SAndroid Build Coastguard Worker case GL_BLEND_DST:
2562*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
2563*61046927SAndroid Build Coastguard Worker case GL_BLEND_DST_RGB:
2564*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxDrawBuffers)
2565*61046927SAndroid Build Coastguard Worker goto invalid_value;
2566*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_draw_buffers_blend)
2567*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2568*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Color.Blend[index].DstRGB;
2569*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2570*61046927SAndroid Build Coastguard Worker case GL_BLEND_DST_ALPHA:
2571*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxDrawBuffers)
2572*61046927SAndroid Build Coastguard Worker goto invalid_value;
2573*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_draw_buffers_blend)
2574*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2575*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Color.Blend[index].DstA;
2576*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2577*61046927SAndroid Build Coastguard Worker case GL_BLEND_EQUATION_RGB:
2578*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxDrawBuffers)
2579*61046927SAndroid Build Coastguard Worker goto invalid_value;
2580*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_draw_buffers_blend)
2581*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2582*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Color.Blend[index].EquationRGB;
2583*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2584*61046927SAndroid Build Coastguard Worker case GL_BLEND_EQUATION_ALPHA:
2585*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxDrawBuffers)
2586*61046927SAndroid Build Coastguard Worker goto invalid_value;
2587*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_draw_buffers_blend)
2588*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2589*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Color.Blend[index].EquationA;
2590*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2591*61046927SAndroid Build Coastguard Worker
2592*61046927SAndroid Build Coastguard Worker case GL_COLOR_WRITEMASK:
2593*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxDrawBuffers)
2594*61046927SAndroid Build Coastguard Worker goto invalid_value;
2595*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_draw_buffers2)
2596*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2597*61046927SAndroid Build Coastguard Worker v->value_int_4[0] = GET_COLORMASK_BIT(ctx->Color.ColorMask, index, 0);
2598*61046927SAndroid Build Coastguard Worker v->value_int_4[1] = GET_COLORMASK_BIT(ctx->Color.ColorMask, index, 1);
2599*61046927SAndroid Build Coastguard Worker v->value_int_4[2] = GET_COLORMASK_BIT(ctx->Color.ColorMask, index, 2);
2600*61046927SAndroid Build Coastguard Worker v->value_int_4[3] = GET_COLORMASK_BIT(ctx->Color.ColorMask, index, 3);
2601*61046927SAndroid Build Coastguard Worker return TYPE_INT_4;
2602*61046927SAndroid Build Coastguard Worker
2603*61046927SAndroid Build Coastguard Worker case GL_SCISSOR_BOX:
2604*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxViewports)
2605*61046927SAndroid Build Coastguard Worker goto invalid_value;
2606*61046927SAndroid Build Coastguard Worker v->value_int_4[0] = ctx->Scissor.ScissorArray[index].X;
2607*61046927SAndroid Build Coastguard Worker v->value_int_4[1] = ctx->Scissor.ScissorArray[index].Y;
2608*61046927SAndroid Build Coastguard Worker v->value_int_4[2] = ctx->Scissor.ScissorArray[index].Width;
2609*61046927SAndroid Build Coastguard Worker v->value_int_4[3] = ctx->Scissor.ScissorArray[index].Height;
2610*61046927SAndroid Build Coastguard Worker return TYPE_INT_4;
2611*61046927SAndroid Build Coastguard Worker
2612*61046927SAndroid Build Coastguard Worker case GL_WINDOW_RECTANGLE_EXT:
2613*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_window_rectangles)
2614*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2615*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxWindowRectangles)
2616*61046927SAndroid Build Coastguard Worker goto invalid_value;
2617*61046927SAndroid Build Coastguard Worker v->value_int_4[0] = ctx->Scissor.WindowRects[index].X;
2618*61046927SAndroid Build Coastguard Worker v->value_int_4[1] = ctx->Scissor.WindowRects[index].Y;
2619*61046927SAndroid Build Coastguard Worker v->value_int_4[2] = ctx->Scissor.WindowRects[index].Width;
2620*61046927SAndroid Build Coastguard Worker v->value_int_4[3] = ctx->Scissor.WindowRects[index].Height;
2621*61046927SAndroid Build Coastguard Worker return TYPE_INT_4;
2622*61046927SAndroid Build Coastguard Worker
2623*61046927SAndroid Build Coastguard Worker case GL_VIEWPORT:
2624*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxViewports)
2625*61046927SAndroid Build Coastguard Worker goto invalid_value;
2626*61046927SAndroid Build Coastguard Worker v->value_float_4[0] = ctx->ViewportArray[index].X;
2627*61046927SAndroid Build Coastguard Worker v->value_float_4[1] = ctx->ViewportArray[index].Y;
2628*61046927SAndroid Build Coastguard Worker v->value_float_4[2] = ctx->ViewportArray[index].Width;
2629*61046927SAndroid Build Coastguard Worker v->value_float_4[3] = ctx->ViewportArray[index].Height;
2630*61046927SAndroid Build Coastguard Worker return TYPE_FLOAT_4;
2631*61046927SAndroid Build Coastguard Worker
2632*61046927SAndroid Build Coastguard Worker case GL_DEPTH_RANGE:
2633*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxViewports)
2634*61046927SAndroid Build Coastguard Worker goto invalid_value;
2635*61046927SAndroid Build Coastguard Worker v->value_double_2[0] = ctx->ViewportArray[index].Near;
2636*61046927SAndroid Build Coastguard Worker v->value_double_2[1] = ctx->ViewportArray[index].Far;
2637*61046927SAndroid Build Coastguard Worker return TYPE_DOUBLEN_2;
2638*61046927SAndroid Build Coastguard Worker
2639*61046927SAndroid Build Coastguard Worker case GL_TRANSFORM_FEEDBACK_BUFFER_START:
2640*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxTransformFeedbackBuffers)
2641*61046927SAndroid Build Coastguard Worker goto invalid_value;
2642*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_transform_feedback)
2643*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2644*61046927SAndroid Build Coastguard Worker v->value_int64 = ctx->TransformFeedback.CurrentObject->Offset[index];
2645*61046927SAndroid Build Coastguard Worker return TYPE_INT64;
2646*61046927SAndroid Build Coastguard Worker
2647*61046927SAndroid Build Coastguard Worker case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
2648*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxTransformFeedbackBuffers)
2649*61046927SAndroid Build Coastguard Worker goto invalid_value;
2650*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_transform_feedback)
2651*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2652*61046927SAndroid Build Coastguard Worker v->value_int64
2653*61046927SAndroid Build Coastguard Worker = ctx->TransformFeedback.CurrentObject->RequestedSize[index];
2654*61046927SAndroid Build Coastguard Worker return TYPE_INT64;
2655*61046927SAndroid Build Coastguard Worker
2656*61046927SAndroid Build Coastguard Worker case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
2657*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxTransformFeedbackBuffers)
2658*61046927SAndroid Build Coastguard Worker goto invalid_value;
2659*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_transform_feedback)
2660*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2661*61046927SAndroid Build Coastguard Worker v->value_int = ctx->TransformFeedback.CurrentObject->BufferNames[index];
2662*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2663*61046927SAndroid Build Coastguard Worker
2664*61046927SAndroid Build Coastguard Worker case GL_UNIFORM_BUFFER_BINDING:
2665*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxUniformBufferBindings)
2666*61046927SAndroid Build Coastguard Worker goto invalid_value;
2667*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_uniform_buffer_object)
2668*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2669*61046927SAndroid Build Coastguard Worker buf = ctx->UniformBufferBindings[index].BufferObject;
2670*61046927SAndroid Build Coastguard Worker v->value_int = buf ? buf->Name : 0;
2671*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2672*61046927SAndroid Build Coastguard Worker
2673*61046927SAndroid Build Coastguard Worker case GL_UNIFORM_BUFFER_START:
2674*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxUniformBufferBindings)
2675*61046927SAndroid Build Coastguard Worker goto invalid_value;
2676*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_uniform_buffer_object)
2677*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2678*61046927SAndroid Build Coastguard Worker v->value_int = ctx->UniformBufferBindings[index].Offset < 0 ? 0 :
2679*61046927SAndroid Build Coastguard Worker ctx->UniformBufferBindings[index].Offset;
2680*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2681*61046927SAndroid Build Coastguard Worker
2682*61046927SAndroid Build Coastguard Worker case GL_UNIFORM_BUFFER_SIZE:
2683*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxUniformBufferBindings)
2684*61046927SAndroid Build Coastguard Worker goto invalid_value;
2685*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_uniform_buffer_object)
2686*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2687*61046927SAndroid Build Coastguard Worker v->value_int = ctx->UniformBufferBindings[index].Size < 0 ? 0 :
2688*61046927SAndroid Build Coastguard Worker ctx->UniformBufferBindings[index].Size;
2689*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2690*61046927SAndroid Build Coastguard Worker
2691*61046927SAndroid Build Coastguard Worker /* ARB_shader_storage_buffer_object */
2692*61046927SAndroid Build Coastguard Worker case GL_SHADER_STORAGE_BUFFER_BINDING:
2693*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_storage_buffer_object && !_mesa_is_gles31(ctx))
2694*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2695*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxShaderStorageBufferBindings)
2696*61046927SAndroid Build Coastguard Worker goto invalid_value;
2697*61046927SAndroid Build Coastguard Worker buf = ctx->ShaderStorageBufferBindings[index].BufferObject;
2698*61046927SAndroid Build Coastguard Worker v->value_int = buf ? buf->Name : 0;
2699*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2700*61046927SAndroid Build Coastguard Worker
2701*61046927SAndroid Build Coastguard Worker case GL_SHADER_STORAGE_BUFFER_START:
2702*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_storage_buffer_object && !_mesa_is_gles31(ctx))
2703*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2704*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxShaderStorageBufferBindings)
2705*61046927SAndroid Build Coastguard Worker goto invalid_value;
2706*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ShaderStorageBufferBindings[index].Offset < 0 ? 0 :
2707*61046927SAndroid Build Coastguard Worker ctx->ShaderStorageBufferBindings[index].Offset;
2708*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2709*61046927SAndroid Build Coastguard Worker
2710*61046927SAndroid Build Coastguard Worker case GL_SHADER_STORAGE_BUFFER_SIZE:
2711*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_storage_buffer_object && !_mesa_is_gles31(ctx))
2712*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2713*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxShaderStorageBufferBindings)
2714*61046927SAndroid Build Coastguard Worker goto invalid_value;
2715*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ShaderStorageBufferBindings[index].Size < 0 ? 0 :
2716*61046927SAndroid Build Coastguard Worker ctx->ShaderStorageBufferBindings[index].Size;
2717*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2718*61046927SAndroid Build Coastguard Worker
2719*61046927SAndroid Build Coastguard Worker /* ARB_texture_multisample / GL3.2 */
2720*61046927SAndroid Build Coastguard Worker case GL_SAMPLE_MASK_VALUE:
2721*61046927SAndroid Build Coastguard Worker if (index != 0)
2722*61046927SAndroid Build Coastguard Worker goto invalid_value;
2723*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_texture_multisample)
2724*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2725*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Multisample.SampleMaskValue;
2726*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2727*61046927SAndroid Build Coastguard Worker
2728*61046927SAndroid Build Coastguard Worker case GL_ATOMIC_COUNTER_BUFFER_BINDING:
2729*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_atomic_counters && !_mesa_is_gles31(ctx))
2730*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2731*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxAtomicBufferBindings)
2732*61046927SAndroid Build Coastguard Worker goto invalid_value;
2733*61046927SAndroid Build Coastguard Worker buf = ctx->AtomicBufferBindings[index].BufferObject;
2734*61046927SAndroid Build Coastguard Worker v->value_int = buf ? buf->Name : 0;
2735*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2736*61046927SAndroid Build Coastguard Worker
2737*61046927SAndroid Build Coastguard Worker case GL_ATOMIC_COUNTER_BUFFER_START:
2738*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_atomic_counters && !_mesa_is_gles31(ctx))
2739*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2740*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxAtomicBufferBindings)
2741*61046927SAndroid Build Coastguard Worker goto invalid_value;
2742*61046927SAndroid Build Coastguard Worker v->value_int64 = ctx->AtomicBufferBindings[index].Offset < 0 ? 0 :
2743*61046927SAndroid Build Coastguard Worker ctx->AtomicBufferBindings[index].Offset;
2744*61046927SAndroid Build Coastguard Worker return TYPE_INT64;
2745*61046927SAndroid Build Coastguard Worker
2746*61046927SAndroid Build Coastguard Worker case GL_ATOMIC_COUNTER_BUFFER_SIZE:
2747*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_atomic_counters && !_mesa_is_gles31(ctx))
2748*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2749*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxAtomicBufferBindings)
2750*61046927SAndroid Build Coastguard Worker goto invalid_value;
2751*61046927SAndroid Build Coastguard Worker v->value_int64 = ctx->AtomicBufferBindings[index].Size < 0 ? 0 :
2752*61046927SAndroid Build Coastguard Worker ctx->AtomicBufferBindings[index].Size;
2753*61046927SAndroid Build Coastguard Worker return TYPE_INT64;
2754*61046927SAndroid Build Coastguard Worker
2755*61046927SAndroid Build Coastguard Worker case GL_VERTEX_BINDING_DIVISOR:
2756*61046927SAndroid Build Coastguard Worker if ((!_mesa_is_desktop_gl(ctx) || !ctx->Extensions.ARB_instanced_arrays) &&
2757*61046927SAndroid Build Coastguard Worker !_mesa_is_gles31(ctx))
2758*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2759*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs)
2760*61046927SAndroid Build Coastguard Worker goto invalid_value;
2761*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_GENERIC(index)].InstanceDivisor;
2762*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2763*61046927SAndroid Build Coastguard Worker
2764*61046927SAndroid Build Coastguard Worker case GL_VERTEX_BINDING_OFFSET:
2765*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles31(ctx))
2766*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2767*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs)
2768*61046927SAndroid Build Coastguard Worker goto invalid_value;
2769*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_GENERIC(index)].Offset;
2770*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2771*61046927SAndroid Build Coastguard Worker
2772*61046927SAndroid Build Coastguard Worker case GL_VERTEX_BINDING_STRIDE:
2773*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles31(ctx))
2774*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2775*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs)
2776*61046927SAndroid Build Coastguard Worker goto invalid_value;
2777*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_GENERIC(index)].Stride;
2778*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2779*61046927SAndroid Build Coastguard Worker
2780*61046927SAndroid Build Coastguard Worker case GL_VERTEX_BINDING_BUFFER:
2781*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles2(ctx) && ctx->Version < 31)
2782*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2783*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs)
2784*61046927SAndroid Build Coastguard Worker goto invalid_value;
2785*61046927SAndroid Build Coastguard Worker buf = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_GENERIC(index)].BufferObj;
2786*61046927SAndroid Build Coastguard Worker v->value_int = buf ? buf->Name : 0;
2787*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2788*61046927SAndroid Build Coastguard Worker
2789*61046927SAndroid Build Coastguard Worker /* ARB_shader_image_load_store */
2790*61046927SAndroid Build Coastguard Worker case GL_IMAGE_BINDING_NAME: {
2791*61046927SAndroid Build Coastguard Worker struct gl_texture_object *t;
2792*61046927SAndroid Build Coastguard Worker
2793*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_image_load_store && !_mesa_is_gles31(ctx))
2794*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2795*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxImageUnits)
2796*61046927SAndroid Build Coastguard Worker goto invalid_value;
2797*61046927SAndroid Build Coastguard Worker
2798*61046927SAndroid Build Coastguard Worker t = ctx->ImageUnits[index].TexObj;
2799*61046927SAndroid Build Coastguard Worker v->value_int = (t ? t->Name : 0);
2800*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2801*61046927SAndroid Build Coastguard Worker }
2802*61046927SAndroid Build Coastguard Worker
2803*61046927SAndroid Build Coastguard Worker case GL_IMAGE_BINDING_LEVEL:
2804*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_image_load_store && !_mesa_is_gles31(ctx))
2805*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2806*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxImageUnits)
2807*61046927SAndroid Build Coastguard Worker goto invalid_value;
2808*61046927SAndroid Build Coastguard Worker
2809*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ImageUnits[index].Level;
2810*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2811*61046927SAndroid Build Coastguard Worker
2812*61046927SAndroid Build Coastguard Worker case GL_IMAGE_BINDING_LAYERED:
2813*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_image_load_store && !_mesa_is_gles31(ctx))
2814*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2815*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxImageUnits)
2816*61046927SAndroid Build Coastguard Worker goto invalid_value;
2817*61046927SAndroid Build Coastguard Worker
2818*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ImageUnits[index].Layered;
2819*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2820*61046927SAndroid Build Coastguard Worker
2821*61046927SAndroid Build Coastguard Worker case GL_IMAGE_BINDING_LAYER:
2822*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_image_load_store && !_mesa_is_gles31(ctx))
2823*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2824*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxImageUnits)
2825*61046927SAndroid Build Coastguard Worker goto invalid_value;
2826*61046927SAndroid Build Coastguard Worker
2827*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ImageUnits[index].Layer;
2828*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2829*61046927SAndroid Build Coastguard Worker
2830*61046927SAndroid Build Coastguard Worker case GL_IMAGE_BINDING_ACCESS:
2831*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_image_load_store && !_mesa_is_gles31(ctx))
2832*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2833*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxImageUnits)
2834*61046927SAndroid Build Coastguard Worker goto invalid_value;
2835*61046927SAndroid Build Coastguard Worker
2836*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ImageUnits[index].Access;
2837*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2838*61046927SAndroid Build Coastguard Worker
2839*61046927SAndroid Build Coastguard Worker case GL_IMAGE_BINDING_FORMAT:
2840*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_shader_image_load_store && !_mesa_is_gles31(ctx))
2841*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2842*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxImageUnits)
2843*61046927SAndroid Build Coastguard Worker goto invalid_value;
2844*61046927SAndroid Build Coastguard Worker
2845*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ImageUnits[index].Format;
2846*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2847*61046927SAndroid Build Coastguard Worker
2848*61046927SAndroid Build Coastguard Worker /* ARB_direct_state_access */
2849*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_1D:
2850*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_1D_ARRAY:
2851*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_2D:
2852*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_2D_ARRAY:
2853*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
2854*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY:
2855*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_3D:
2856*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_BUFFER:
2857*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_CUBE_MAP:
2858*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_CUBE_MAP_ARRAY:
2859*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_BINDING_RECTANGLE: {
2860*61046927SAndroid Build Coastguard Worker int target;
2861*61046927SAndroid Build Coastguard Worker
2862*61046927SAndroid Build Coastguard Worker target = tex_binding_to_index(ctx, pname);
2863*61046927SAndroid Build Coastguard Worker if (target < 0)
2864*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2865*61046927SAndroid Build Coastguard Worker if (index >= _mesa_max_tex_unit(ctx))
2866*61046927SAndroid Build Coastguard Worker goto invalid_value;
2867*61046927SAndroid Build Coastguard Worker
2868*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Texture.Unit[index].CurrentTex[target]->Name;
2869*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2870*61046927SAndroid Build Coastguard Worker }
2871*61046927SAndroid Build Coastguard Worker
2872*61046927SAndroid Build Coastguard Worker case GL_SAMPLER_BINDING: {
2873*61046927SAndroid Build Coastguard Worker struct gl_sampler_object *samp;
2874*61046927SAndroid Build Coastguard Worker
2875*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) || ctx->Version < 33)
2876*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2877*61046927SAndroid Build Coastguard Worker if (index >= _mesa_max_tex_unit(ctx))
2878*61046927SAndroid Build Coastguard Worker goto invalid_value;
2879*61046927SAndroid Build Coastguard Worker
2880*61046927SAndroid Build Coastguard Worker samp = ctx->Texture.Unit[index].Sampler;
2881*61046927SAndroid Build Coastguard Worker v->value_int = samp ? samp->Name : 0;
2882*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2883*61046927SAndroid Build Coastguard Worker }
2884*61046927SAndroid Build Coastguard Worker
2885*61046927SAndroid Build Coastguard Worker case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
2886*61046927SAndroid Build Coastguard Worker if (!_mesa_has_compute_shaders(ctx))
2887*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2888*61046927SAndroid Build Coastguard Worker if (index >= 3)
2889*61046927SAndroid Build Coastguard Worker goto invalid_value;
2890*61046927SAndroid Build Coastguard Worker v->value_uint = ctx->Const.MaxComputeWorkGroupCount[index];
2891*61046927SAndroid Build Coastguard Worker return TYPE_UINT;
2892*61046927SAndroid Build Coastguard Worker
2893*61046927SAndroid Build Coastguard Worker case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
2894*61046927SAndroid Build Coastguard Worker if (!_mesa_has_compute_shaders(ctx))
2895*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2896*61046927SAndroid Build Coastguard Worker if (index >= 3)
2897*61046927SAndroid Build Coastguard Worker goto invalid_value;
2898*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Const.MaxComputeWorkGroupSize[index];
2899*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2900*61046927SAndroid Build Coastguard Worker
2901*61046927SAndroid Build Coastguard Worker /* ARB_compute_variable_group_size */
2902*61046927SAndroid Build Coastguard Worker case GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB:
2903*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_compute_variable_group_size)
2904*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2905*61046927SAndroid Build Coastguard Worker if (index >= 3)
2906*61046927SAndroid Build Coastguard Worker goto invalid_value;
2907*61046927SAndroid Build Coastguard Worker v->value_int = ctx->Const.MaxComputeVariableGroupSize[index];
2908*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2909*61046927SAndroid Build Coastguard Worker
2910*61046927SAndroid Build Coastguard Worker /* GL_EXT_external_objects */
2911*61046927SAndroid Build Coastguard Worker case GL_NUM_DEVICE_UUIDS_EXT:
2912*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_memory_object && !ctx->Extensions.EXT_semaphore)
2913*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2914*61046927SAndroid Build Coastguard Worker v->value_int = 1;
2915*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2916*61046927SAndroid Build Coastguard Worker case GL_DRIVER_UUID_EXT:
2917*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_memory_object && !ctx->Extensions.EXT_semaphore)
2918*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2919*61046927SAndroid Build Coastguard Worker if (index >= 1)
2920*61046927SAndroid Build Coastguard Worker goto invalid_value;
2921*61046927SAndroid Build Coastguard Worker _mesa_get_driver_uuid(ctx, v->value_int_4);
2922*61046927SAndroid Build Coastguard Worker return TYPE_INT_4;
2923*61046927SAndroid Build Coastguard Worker case GL_DEVICE_UUID_EXT:
2924*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_memory_object && !ctx->Extensions.EXT_semaphore)
2925*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2926*61046927SAndroid Build Coastguard Worker if (index >= 1)
2927*61046927SAndroid Build Coastguard Worker goto invalid_value;
2928*61046927SAndroid Build Coastguard Worker _mesa_get_device_uuid(ctx, v->value_int_4);
2929*61046927SAndroid Build Coastguard Worker return TYPE_INT_4;
2930*61046927SAndroid Build Coastguard Worker /* GL_EXT_memory_object_win32 */
2931*61046927SAndroid Build Coastguard Worker case GL_DEVICE_LUID_EXT:
2932*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_memory_object_win32 && !ctx->Extensions.EXT_semaphore_win32)
2933*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2934*61046927SAndroid Build Coastguard Worker if (index >= 1)
2935*61046927SAndroid Build Coastguard Worker goto invalid_value;
2936*61046927SAndroid Build Coastguard Worker _mesa_get_device_luid(ctx, v->value_int_2);
2937*61046927SAndroid Build Coastguard Worker return TYPE_INT_2;
2938*61046927SAndroid Build Coastguard Worker case GL_DEVICE_NODE_MASK_EXT:
2939*61046927SAndroid Build Coastguard Worker if (index >= 1)
2940*61046927SAndroid Build Coastguard Worker goto invalid_value;
2941*61046927SAndroid Build Coastguard Worker v->value_int = ctx->pipe->screen->get_device_node_mask(ctx->pipe->screen);
2942*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2943*61046927SAndroid Build Coastguard Worker /* GL_EXT_direct_state_access */
2944*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_1D:
2945*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_2D:
2946*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_3D:
2947*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_CUBE_MAP:
2948*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_S:
2949*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_T:
2950*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_R:
2951*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_GEN_Q:
2952*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_RECTANGLE_ARB: {
2953*61046927SAndroid Build Coastguard Worker GLuint curTexUnitSave;
2954*61046927SAndroid Build Coastguard Worker if (index >= _mesa_max_tex_unit(ctx))
2955*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2956*61046927SAndroid Build Coastguard Worker curTexUnitSave = ctx->Texture.CurrentUnit;
2957*61046927SAndroid Build Coastguard Worker _mesa_ActiveTexture_no_error(GL_TEXTURE0 + index);
2958*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_IsEnabled(pname);
2959*61046927SAndroid Build Coastguard Worker _mesa_ActiveTexture_no_error(GL_TEXTURE0 + curTexUnitSave);
2960*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2961*61046927SAndroid Build Coastguard Worker }
2962*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COORD_ARRAY: {
2963*61046927SAndroid Build Coastguard Worker GLuint curTexUnitSave;
2964*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxTextureCoordUnits)
2965*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2966*61046927SAndroid Build Coastguard Worker curTexUnitSave = ctx->Array.ActiveTexture;
2967*61046927SAndroid Build Coastguard Worker _mesa_ClientActiveTexture(GL_TEXTURE0 + index);
2968*61046927SAndroid Build Coastguard Worker v->value_int = _mesa_IsEnabled(pname);
2969*61046927SAndroid Build Coastguard Worker _mesa_ClientActiveTexture(GL_TEXTURE0 + curTexUnitSave);
2970*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2971*61046927SAndroid Build Coastguard Worker }
2972*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_MATRIX:
2973*61046927SAndroid Build Coastguard Worker if (index >= ARRAY_SIZE(ctx->TextureMatrixStack))
2974*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2975*61046927SAndroid Build Coastguard Worker v->value_matrix = ctx->TextureMatrixStack[index].Top;
2976*61046927SAndroid Build Coastguard Worker return TYPE_MATRIX;
2977*61046927SAndroid Build Coastguard Worker case GL_TRANSPOSE_TEXTURE_MATRIX:
2978*61046927SAndroid Build Coastguard Worker if (index >= ARRAY_SIZE(ctx->TextureMatrixStack))
2979*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2980*61046927SAndroid Build Coastguard Worker v->value_matrix = ctx->TextureMatrixStack[index].Top;
2981*61046927SAndroid Build Coastguard Worker return TYPE_MATRIX_T;
2982*61046927SAndroid Build Coastguard Worker /* GL_NV_viewport_swizzle */
2983*61046927SAndroid Build Coastguard Worker case GL_VIEWPORT_SWIZZLE_X_NV:
2984*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.NV_viewport_swizzle)
2985*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2986*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxViewports)
2987*61046927SAndroid Build Coastguard Worker goto invalid_value;
2988*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ViewportArray[index].SwizzleX;
2989*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2990*61046927SAndroid Build Coastguard Worker case GL_VIEWPORT_SWIZZLE_Y_NV:
2991*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.NV_viewport_swizzle)
2992*61046927SAndroid Build Coastguard Worker goto invalid_enum;
2993*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxViewports)
2994*61046927SAndroid Build Coastguard Worker goto invalid_value;
2995*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ViewportArray[index].SwizzleY;
2996*61046927SAndroid Build Coastguard Worker return TYPE_INT;
2997*61046927SAndroid Build Coastguard Worker case GL_VIEWPORT_SWIZZLE_Z_NV:
2998*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.NV_viewport_swizzle)
2999*61046927SAndroid Build Coastguard Worker goto invalid_enum;
3000*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxViewports)
3001*61046927SAndroid Build Coastguard Worker goto invalid_value;
3002*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ViewportArray[index].SwizzleZ;
3003*61046927SAndroid Build Coastguard Worker return TYPE_INT;
3004*61046927SAndroid Build Coastguard Worker case GL_VIEWPORT_SWIZZLE_W_NV:
3005*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.NV_viewport_swizzle)
3006*61046927SAndroid Build Coastguard Worker goto invalid_enum;
3007*61046927SAndroid Build Coastguard Worker if (index >= ctx->Const.MaxViewports)
3008*61046927SAndroid Build Coastguard Worker goto invalid_value;
3009*61046927SAndroid Build Coastguard Worker v->value_int = ctx->ViewportArray[index].SwizzleW;
3010*61046927SAndroid Build Coastguard Worker return TYPE_INT;
3011*61046927SAndroid Build Coastguard Worker }
3012*61046927SAndroid Build Coastguard Worker
3013*61046927SAndroid Build Coastguard Worker invalid_enum:
3014*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)", func,
3015*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
3016*61046927SAndroid Build Coastguard Worker return TYPE_INVALID;
3017*61046927SAndroid Build Coastguard Worker invalid_value:
3018*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "%s(pname=%s)", func,
3019*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(pname));
3020*61046927SAndroid Build Coastguard Worker return TYPE_INVALID;
3021*61046927SAndroid Build Coastguard Worker }
3022*61046927SAndroid Build Coastguard Worker
3023*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetBooleani_v(GLenum pname,GLuint index,GLboolean * params)3024*61046927SAndroid Build Coastguard Worker _mesa_GetBooleani_v( GLenum pname, GLuint index, GLboolean *params )
3025*61046927SAndroid Build Coastguard Worker {
3026*61046927SAndroid Build Coastguard Worker union value v;
3027*61046927SAndroid Build Coastguard Worker enum value_type type =
3028*61046927SAndroid Build Coastguard Worker find_value_indexed("glGetBooleani_v", pname, index, &v);
3029*61046927SAndroid Build Coastguard Worker
3030*61046927SAndroid Build Coastguard Worker switch (type) {
3031*61046927SAndroid Build Coastguard Worker case TYPE_INT:
3032*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
3033*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_BOOLEAN(v.value_int);
3034*61046927SAndroid Build Coastguard Worker break;
3035*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
3036*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
3037*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_BOOLEAN(v.value_int_4[0]);
3038*61046927SAndroid Build Coastguard Worker params[1] = INT_TO_BOOLEAN(v.value_int_4[1]);
3039*61046927SAndroid Build Coastguard Worker params[2] = INT_TO_BOOLEAN(v.value_int_4[2]);
3040*61046927SAndroid Build Coastguard Worker params[3] = INT_TO_BOOLEAN(v.value_int_4[3]);
3041*61046927SAndroid Build Coastguard Worker break;
3042*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
3043*61046927SAndroid Build Coastguard Worker params[0] = INT64_TO_BOOLEAN(v.value_int64);
3044*61046927SAndroid Build Coastguard Worker break;
3045*61046927SAndroid Build Coastguard Worker default:
3046*61046927SAndroid Build Coastguard Worker ; /* nothing - GL error was recorded */
3047*61046927SAndroid Build Coastguard Worker }
3048*61046927SAndroid Build Coastguard Worker }
3049*61046927SAndroid Build Coastguard Worker
3050*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetIntegeri_v(GLenum pname,GLuint index,GLint * params)3051*61046927SAndroid Build Coastguard Worker _mesa_GetIntegeri_v( GLenum pname, GLuint index, GLint *params )
3052*61046927SAndroid Build Coastguard Worker {
3053*61046927SAndroid Build Coastguard Worker union value v;
3054*61046927SAndroid Build Coastguard Worker enum value_type type =
3055*61046927SAndroid Build Coastguard Worker find_value_indexed("glGetIntegeri_v", pname, index, &v);
3056*61046927SAndroid Build Coastguard Worker
3057*61046927SAndroid Build Coastguard Worker switch (type) {
3058*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_4:
3059*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_4:
3060*61046927SAndroid Build Coastguard Worker params[3] = lroundf(v.value_float_4[3]);
3061*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3062*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_3:
3063*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_3:
3064*61046927SAndroid Build Coastguard Worker params[2] = lroundf(v.value_float_4[2]);
3065*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3066*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_2:
3067*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_2:
3068*61046927SAndroid Build Coastguard Worker params[1] = lroundf(v.value_float_4[1]);
3069*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3070*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
3071*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN:
3072*61046927SAndroid Build Coastguard Worker params[0] = lroundf(v.value_float_4[0]);
3073*61046927SAndroid Build Coastguard Worker break;
3074*61046927SAndroid Build Coastguard Worker
3075*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN_2:
3076*61046927SAndroid Build Coastguard Worker params[1] = lroundf(v.value_double_2[1]);
3077*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3078*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN:
3079*61046927SAndroid Build Coastguard Worker params[0] = lroundf(v.value_double_2[0]);
3080*61046927SAndroid Build Coastguard Worker break;
3081*61046927SAndroid Build Coastguard Worker
3082*61046927SAndroid Build Coastguard Worker case TYPE_INT:
3083*61046927SAndroid Build Coastguard Worker params[0] = v.value_int;
3084*61046927SAndroid Build Coastguard Worker break;
3085*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
3086*61046927SAndroid Build Coastguard Worker params[0] = MIN2(v.value_uint, INT_MAX);
3087*61046927SAndroid Build Coastguard Worker break;
3088*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
3089*61046927SAndroid Build Coastguard Worker params[0] = v.value_int_4[0];
3090*61046927SAndroid Build Coastguard Worker params[1] = v.value_int_4[1];
3091*61046927SAndroid Build Coastguard Worker params[2] = v.value_int_4[2];
3092*61046927SAndroid Build Coastguard Worker params[3] = v.value_int_4[3];
3093*61046927SAndroid Build Coastguard Worker break;
3094*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
3095*61046927SAndroid Build Coastguard Worker params[0] = MIN2((GLuint)v.value_int_4[0], INT_MAX);
3096*61046927SAndroid Build Coastguard Worker params[1] = MIN2((GLuint)v.value_int_4[1], INT_MAX);
3097*61046927SAndroid Build Coastguard Worker params[2] = MIN2((GLuint)v.value_int_4[2], INT_MAX);
3098*61046927SAndroid Build Coastguard Worker params[3] = MIN2((GLuint)v.value_int_4[3], INT_MAX);
3099*61046927SAndroid Build Coastguard Worker break;
3100*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
3101*61046927SAndroid Build Coastguard Worker params[0] = INT64_TO_INT(v.value_int64);
3102*61046927SAndroid Build Coastguard Worker break;
3103*61046927SAndroid Build Coastguard Worker default:
3104*61046927SAndroid Build Coastguard Worker ; /* nothing - GL error was recorded */
3105*61046927SAndroid Build Coastguard Worker }
3106*61046927SAndroid Build Coastguard Worker }
3107*61046927SAndroid Build Coastguard Worker
3108*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetInteger64i_v(GLenum pname,GLuint index,GLint64 * params)3109*61046927SAndroid Build Coastguard Worker _mesa_GetInteger64i_v( GLenum pname, GLuint index, GLint64 *params )
3110*61046927SAndroid Build Coastguard Worker {
3111*61046927SAndroid Build Coastguard Worker union value v;
3112*61046927SAndroid Build Coastguard Worker enum value_type type =
3113*61046927SAndroid Build Coastguard Worker find_value_indexed("glGetInteger64i_v", pname, index, &v);
3114*61046927SAndroid Build Coastguard Worker
3115*61046927SAndroid Build Coastguard Worker switch (type) {
3116*61046927SAndroid Build Coastguard Worker case TYPE_INT:
3117*61046927SAndroid Build Coastguard Worker params[0] = v.value_int;
3118*61046927SAndroid Build Coastguard Worker break;
3119*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
3120*61046927SAndroid Build Coastguard Worker params[0] = v.value_int_4[0];
3121*61046927SAndroid Build Coastguard Worker params[1] = v.value_int_4[1];
3122*61046927SAndroid Build Coastguard Worker params[2] = v.value_int_4[2];
3123*61046927SAndroid Build Coastguard Worker params[3] = v.value_int_4[3];
3124*61046927SAndroid Build Coastguard Worker break;
3125*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
3126*61046927SAndroid Build Coastguard Worker params[0] = v.value_uint;
3127*61046927SAndroid Build Coastguard Worker break;
3128*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
3129*61046927SAndroid Build Coastguard Worker params[0] = (GLuint) v.value_int_4[0];
3130*61046927SAndroid Build Coastguard Worker params[1] = (GLuint) v.value_int_4[1];
3131*61046927SAndroid Build Coastguard Worker params[2] = (GLuint) v.value_int_4[2];
3132*61046927SAndroid Build Coastguard Worker params[3] = (GLuint) v.value_int_4[3];
3133*61046927SAndroid Build Coastguard Worker break;
3134*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
3135*61046927SAndroid Build Coastguard Worker params[0] = v.value_int64;
3136*61046927SAndroid Build Coastguard Worker break;
3137*61046927SAndroid Build Coastguard Worker default:
3138*61046927SAndroid Build Coastguard Worker ; /* nothing - GL error was recorded */
3139*61046927SAndroid Build Coastguard Worker }
3140*61046927SAndroid Build Coastguard Worker }
3141*61046927SAndroid Build Coastguard Worker
3142*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetFloati_v(GLenum pname,GLuint index,GLfloat * params)3143*61046927SAndroid Build Coastguard Worker _mesa_GetFloati_v(GLenum pname, GLuint index, GLfloat *params)
3144*61046927SAndroid Build Coastguard Worker {
3145*61046927SAndroid Build Coastguard Worker int i;
3146*61046927SAndroid Build Coastguard Worker GLmatrix *m;
3147*61046927SAndroid Build Coastguard Worker union value v;
3148*61046927SAndroid Build Coastguard Worker enum value_type type =
3149*61046927SAndroid Build Coastguard Worker find_value_indexed("glGetFloati_v", pname, index, &v);
3150*61046927SAndroid Build Coastguard Worker
3151*61046927SAndroid Build Coastguard Worker switch (type) {
3152*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_4:
3153*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_4:
3154*61046927SAndroid Build Coastguard Worker params[3] = v.value_float_4[3];
3155*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3156*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_3:
3157*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_3:
3158*61046927SAndroid Build Coastguard Worker params[2] = v.value_float_4[2];
3159*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3160*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_2:
3161*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_2:
3162*61046927SAndroid Build Coastguard Worker params[1] = v.value_float_4[1];
3163*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3164*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
3165*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN:
3166*61046927SAndroid Build Coastguard Worker params[0] = v.value_float_4[0];
3167*61046927SAndroid Build Coastguard Worker break;
3168*61046927SAndroid Build Coastguard Worker
3169*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN_2:
3170*61046927SAndroid Build Coastguard Worker params[1] = (GLfloat) v.value_double_2[1];
3171*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3172*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN:
3173*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) v.value_double_2[0];
3174*61046927SAndroid Build Coastguard Worker break;
3175*61046927SAndroid Build Coastguard Worker
3176*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
3177*61046927SAndroid Build Coastguard Worker params[3] = (GLfloat) v.value_int_4[3];
3178*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3179*61046927SAndroid Build Coastguard Worker case TYPE_INT_3:
3180*61046927SAndroid Build Coastguard Worker params[2] = (GLfloat) v.value_int_4[2];
3181*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3182*61046927SAndroid Build Coastguard Worker case TYPE_INT_2:
3183*61046927SAndroid Build Coastguard Worker case TYPE_ENUM_2:
3184*61046927SAndroid Build Coastguard Worker params[1] = (GLfloat) v.value_int_4[1];
3185*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3186*61046927SAndroid Build Coastguard Worker case TYPE_INT:
3187*61046927SAndroid Build Coastguard Worker case TYPE_ENUM:
3188*61046927SAndroid Build Coastguard Worker case TYPE_ENUM16:
3189*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) v.value_int_4[0];
3190*61046927SAndroid Build Coastguard Worker break;
3191*61046927SAndroid Build Coastguard Worker
3192*61046927SAndroid Build Coastguard Worker case TYPE_INT_N:
3193*61046927SAndroid Build Coastguard Worker for (i = 0; i < v.value_int_n.n; i++)
3194*61046927SAndroid Build Coastguard Worker params[i] = (GLfloat) v.value_int_n.ints[i];
3195*61046927SAndroid Build Coastguard Worker break;
3196*61046927SAndroid Build Coastguard Worker
3197*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
3198*61046927SAndroid Build Coastguard Worker params[3] = (GLfloat) ((GLuint) v.value_int_4[3]);
3199*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3200*61046927SAndroid Build Coastguard Worker case TYPE_UINT_3:
3201*61046927SAndroid Build Coastguard Worker params[2] = (GLfloat) ((GLuint) v.value_int_4[2]);
3202*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3203*61046927SAndroid Build Coastguard Worker case TYPE_UINT_2:
3204*61046927SAndroid Build Coastguard Worker params[1] = (GLfloat) ((GLuint) v.value_int_4[1]);
3205*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3206*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
3207*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) ((GLuint) v.value_int_4[0]);
3208*61046927SAndroid Build Coastguard Worker break;
3209*61046927SAndroid Build Coastguard Worker
3210*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
3211*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) v.value_int64;
3212*61046927SAndroid Build Coastguard Worker break;
3213*61046927SAndroid Build Coastguard Worker
3214*61046927SAndroid Build Coastguard Worker case TYPE_BOOLEAN:
3215*61046927SAndroid Build Coastguard Worker params[0] = BOOLEAN_TO_FLOAT(v.value_bool);
3216*61046927SAndroid Build Coastguard Worker break;
3217*61046927SAndroid Build Coastguard Worker
3218*61046927SAndroid Build Coastguard Worker case TYPE_UBYTE:
3219*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) v.value_ubyte;
3220*61046927SAndroid Build Coastguard Worker break;
3221*61046927SAndroid Build Coastguard Worker
3222*61046927SAndroid Build Coastguard Worker case TYPE_SHORT:
3223*61046927SAndroid Build Coastguard Worker params[0] = (GLfloat) v.value_short;
3224*61046927SAndroid Build Coastguard Worker break;
3225*61046927SAndroid Build Coastguard Worker
3226*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX:
3227*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) &v;
3228*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
3229*61046927SAndroid Build Coastguard Worker params[i] = m->m[i];
3230*61046927SAndroid Build Coastguard Worker break;
3231*61046927SAndroid Build Coastguard Worker
3232*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX_T:
3233*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) &v;
3234*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
3235*61046927SAndroid Build Coastguard Worker params[i] = m->m[transpose[i]];
3236*61046927SAndroid Build Coastguard Worker break;
3237*61046927SAndroid Build Coastguard Worker
3238*61046927SAndroid Build Coastguard Worker default:
3239*61046927SAndroid Build Coastguard Worker ;
3240*61046927SAndroid Build Coastguard Worker }
3241*61046927SAndroid Build Coastguard Worker }
3242*61046927SAndroid Build Coastguard Worker
3243*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetDoublei_v(GLenum pname,GLuint index,GLdouble * params)3244*61046927SAndroid Build Coastguard Worker _mesa_GetDoublei_v(GLenum pname, GLuint index, GLdouble *params)
3245*61046927SAndroid Build Coastguard Worker {
3246*61046927SAndroid Build Coastguard Worker int i;
3247*61046927SAndroid Build Coastguard Worker GLmatrix *m;
3248*61046927SAndroid Build Coastguard Worker union value v;
3249*61046927SAndroid Build Coastguard Worker enum value_type type =
3250*61046927SAndroid Build Coastguard Worker find_value_indexed("glGetDoublei_v", pname, index, &v);
3251*61046927SAndroid Build Coastguard Worker
3252*61046927SAndroid Build Coastguard Worker switch (type) {
3253*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_4:
3254*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_4:
3255*61046927SAndroid Build Coastguard Worker params[3] = (GLdouble) v.value_float_4[3];
3256*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3257*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_3:
3258*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_3:
3259*61046927SAndroid Build Coastguard Worker params[2] = (GLdouble) v.value_float_4[2];
3260*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3261*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_2:
3262*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_2:
3263*61046927SAndroid Build Coastguard Worker params[1] = (GLdouble) v.value_float_4[1];
3264*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3265*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
3266*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN:
3267*61046927SAndroid Build Coastguard Worker params[0] = (GLdouble) v.value_float_4[0];
3268*61046927SAndroid Build Coastguard Worker break;
3269*61046927SAndroid Build Coastguard Worker
3270*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN_2:
3271*61046927SAndroid Build Coastguard Worker params[1] = v.value_double_2[1];
3272*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3273*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN:
3274*61046927SAndroid Build Coastguard Worker params[0] = v.value_double_2[0];
3275*61046927SAndroid Build Coastguard Worker break;
3276*61046927SAndroid Build Coastguard Worker
3277*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
3278*61046927SAndroid Build Coastguard Worker params[3] = (GLdouble) v.value_int_4[3];
3279*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3280*61046927SAndroid Build Coastguard Worker case TYPE_INT_3:
3281*61046927SAndroid Build Coastguard Worker params[2] = (GLdouble) v.value_int_4[2];
3282*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3283*61046927SAndroid Build Coastguard Worker case TYPE_INT_2:
3284*61046927SAndroid Build Coastguard Worker case TYPE_ENUM_2:
3285*61046927SAndroid Build Coastguard Worker params[1] = (GLdouble) v.value_int_4[1];
3286*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3287*61046927SAndroid Build Coastguard Worker case TYPE_INT:
3288*61046927SAndroid Build Coastguard Worker case TYPE_ENUM:
3289*61046927SAndroid Build Coastguard Worker case TYPE_ENUM16:
3290*61046927SAndroid Build Coastguard Worker params[0] = (GLdouble) v.value_int_4[0];
3291*61046927SAndroid Build Coastguard Worker break;
3292*61046927SAndroid Build Coastguard Worker
3293*61046927SAndroid Build Coastguard Worker case TYPE_INT_N:
3294*61046927SAndroid Build Coastguard Worker for (i = 0; i < v.value_int_n.n; i++)
3295*61046927SAndroid Build Coastguard Worker params[i] = (GLdouble) v.value_int_n.ints[i];
3296*61046927SAndroid Build Coastguard Worker break;
3297*61046927SAndroid Build Coastguard Worker
3298*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
3299*61046927SAndroid Build Coastguard Worker params[3] = (GLdouble) ((GLuint) v.value_int_4[3]);
3300*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3301*61046927SAndroid Build Coastguard Worker case TYPE_UINT_3:
3302*61046927SAndroid Build Coastguard Worker params[2] = (GLdouble) ((GLuint) v.value_int_4[2]);
3303*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3304*61046927SAndroid Build Coastguard Worker case TYPE_UINT_2:
3305*61046927SAndroid Build Coastguard Worker params[1] = (GLdouble) ((GLuint) v.value_int_4[1]);
3306*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3307*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
3308*61046927SAndroid Build Coastguard Worker params[0] = (GLdouble) ((GLuint) v.value_int_4[0]);
3309*61046927SAndroid Build Coastguard Worker break;
3310*61046927SAndroid Build Coastguard Worker
3311*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
3312*61046927SAndroid Build Coastguard Worker params[0] = (GLdouble) v.value_int64;
3313*61046927SAndroid Build Coastguard Worker break;
3314*61046927SAndroid Build Coastguard Worker
3315*61046927SAndroid Build Coastguard Worker case TYPE_BOOLEAN:
3316*61046927SAndroid Build Coastguard Worker params[0] = (GLdouble) BOOLEAN_TO_FLOAT(v.value_bool);
3317*61046927SAndroid Build Coastguard Worker break;
3318*61046927SAndroid Build Coastguard Worker
3319*61046927SAndroid Build Coastguard Worker case TYPE_UBYTE:
3320*61046927SAndroid Build Coastguard Worker params[0] = (GLdouble) v.value_ubyte;
3321*61046927SAndroid Build Coastguard Worker break;
3322*61046927SAndroid Build Coastguard Worker
3323*61046927SAndroid Build Coastguard Worker case TYPE_SHORT:
3324*61046927SAndroid Build Coastguard Worker params[0] = (GLdouble) v.value_short;
3325*61046927SAndroid Build Coastguard Worker break;
3326*61046927SAndroid Build Coastguard Worker
3327*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX:
3328*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) &v;
3329*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
3330*61046927SAndroid Build Coastguard Worker params[i] = (GLdouble) m->m[i];
3331*61046927SAndroid Build Coastguard Worker break;
3332*61046927SAndroid Build Coastguard Worker
3333*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX_T:
3334*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) &v;
3335*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
3336*61046927SAndroid Build Coastguard Worker params[i] = (GLdouble) m->m[transpose[i]];
3337*61046927SAndroid Build Coastguard Worker break;
3338*61046927SAndroid Build Coastguard Worker
3339*61046927SAndroid Build Coastguard Worker default:
3340*61046927SAndroid Build Coastguard Worker ;
3341*61046927SAndroid Build Coastguard Worker }
3342*61046927SAndroid Build Coastguard Worker }
3343*61046927SAndroid Build Coastguard Worker
3344*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetUnsignedBytei_vEXT(GLenum target,GLuint index,GLubyte * data)3345*61046927SAndroid Build Coastguard Worker _mesa_GetUnsignedBytei_vEXT(GLenum target, GLuint index, GLubyte *data)
3346*61046927SAndroid Build Coastguard Worker {
3347*61046927SAndroid Build Coastguard Worker GLsizei size;
3348*61046927SAndroid Build Coastguard Worker union value v;
3349*61046927SAndroid Build Coastguard Worker enum value_type type;
3350*61046927SAndroid Build Coastguard Worker const char *func = "glGetUnsignedBytei_vEXT";
3351*61046927SAndroid Build Coastguard Worker
3352*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
3353*61046927SAndroid Build Coastguard Worker
3354*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.EXT_memory_object) {
3355*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
3356*61046927SAndroid Build Coastguard Worker return;
3357*61046927SAndroid Build Coastguard Worker }
3358*61046927SAndroid Build Coastguard Worker
3359*61046927SAndroid Build Coastguard Worker type = find_value_indexed(func, target, index, &v);
3360*61046927SAndroid Build Coastguard Worker size = get_value_size(type, &v);
3361*61046927SAndroid Build Coastguard Worker
3362*61046927SAndroid Build Coastguard Worker switch (type) {
3363*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
3364*61046927SAndroid Build Coastguard Worker case TYPE_INT:
3365*61046927SAndroid Build Coastguard Worker case TYPE_INT_2:
3366*61046927SAndroid Build Coastguard Worker case TYPE_UINT_2:
3367*61046927SAndroid Build Coastguard Worker case TYPE_INT_3:
3368*61046927SAndroid Build Coastguard Worker case TYPE_UINT_3:
3369*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
3370*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
3371*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
3372*61046927SAndroid Build Coastguard Worker case TYPE_ENUM16:
3373*61046927SAndroid Build Coastguard Worker case TYPE_ENUM:
3374*61046927SAndroid Build Coastguard Worker case TYPE_ENUM_2:
3375*61046927SAndroid Build Coastguard Worker case TYPE_BOOLEAN:
3376*61046927SAndroid Build Coastguard Worker case TYPE_UBYTE:
3377*61046927SAndroid Build Coastguard Worker case TYPE_SHORT:
3378*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
3379*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN:
3380*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_2:
3381*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_2:
3382*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_3:
3383*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_3:
3384*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_4:
3385*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_4:
3386*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_8:
3387*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN:
3388*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN_2:
3389*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX:
3390*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX_T:
3391*61046927SAndroid Build Coastguard Worker memcpy(data, &v.value_int, size);
3392*61046927SAndroid Build Coastguard Worker break;
3393*61046927SAndroid Build Coastguard Worker case TYPE_INT_N:
3394*61046927SAndroid Build Coastguard Worker memcpy(data, &v.value_int_n.ints, size);
3395*61046927SAndroid Build Coastguard Worker break;
3396*61046927SAndroid Build Coastguard Worker default:
3397*61046927SAndroid Build Coastguard Worker break; /* nothing - GL error was recorded */
3398*61046927SAndroid Build Coastguard Worker }
3399*61046927SAndroid Build Coastguard Worker }
3400*61046927SAndroid Build Coastguard Worker
3401*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetFixedv(GLenum pname,GLfixed * params)3402*61046927SAndroid Build Coastguard Worker _mesa_GetFixedv(GLenum pname, GLfixed *params)
3403*61046927SAndroid Build Coastguard Worker {
3404*61046927SAndroid Build Coastguard Worker const struct value_desc *d;
3405*61046927SAndroid Build Coastguard Worker union value v;
3406*61046927SAndroid Build Coastguard Worker GLmatrix *m;
3407*61046927SAndroid Build Coastguard Worker int shift, i;
3408*61046927SAndroid Build Coastguard Worker void *p;
3409*61046927SAndroid Build Coastguard Worker
3410*61046927SAndroid Build Coastguard Worker d = find_value("glGetDoublev", pname, &p, &v);
3411*61046927SAndroid Build Coastguard Worker switch (d->type) {
3412*61046927SAndroid Build Coastguard Worker case TYPE_INVALID:
3413*61046927SAndroid Build Coastguard Worker break;
3414*61046927SAndroid Build Coastguard Worker case TYPE_CONST:
3415*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_FIXED(d->offset);
3416*61046927SAndroid Build Coastguard Worker break;
3417*61046927SAndroid Build Coastguard Worker
3418*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_4:
3419*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_4:
3420*61046927SAndroid Build Coastguard Worker params[3] = FLOAT_TO_FIXED(((GLfloat *) p)[3]);
3421*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3422*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_3:
3423*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_3:
3424*61046927SAndroid Build Coastguard Worker params[2] = FLOAT_TO_FIXED(((GLfloat *) p)[2]);
3425*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3426*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT_2:
3427*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN_2:
3428*61046927SAndroid Build Coastguard Worker params[1] = FLOAT_TO_FIXED(((GLfloat *) p)[1]);
3429*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3430*61046927SAndroid Build Coastguard Worker case TYPE_FLOAT:
3431*61046927SAndroid Build Coastguard Worker case TYPE_FLOATN:
3432*61046927SAndroid Build Coastguard Worker params[0] = FLOAT_TO_FIXED(((GLfloat *) p)[0]);
3433*61046927SAndroid Build Coastguard Worker break;
3434*61046927SAndroid Build Coastguard Worker
3435*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN_2:
3436*61046927SAndroid Build Coastguard Worker params[1] = FLOAT_TO_FIXED(((GLdouble *) p)[1]);
3437*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3438*61046927SAndroid Build Coastguard Worker case TYPE_DOUBLEN:
3439*61046927SAndroid Build Coastguard Worker params[0] = FLOAT_TO_FIXED(((GLdouble *) p)[0]);
3440*61046927SAndroid Build Coastguard Worker break;
3441*61046927SAndroid Build Coastguard Worker
3442*61046927SAndroid Build Coastguard Worker case TYPE_INT_4:
3443*61046927SAndroid Build Coastguard Worker params[3] = INT_TO_FIXED(((GLint *) p)[3]);
3444*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3445*61046927SAndroid Build Coastguard Worker case TYPE_INT_3:
3446*61046927SAndroid Build Coastguard Worker params[2] = INT_TO_FIXED(((GLint *) p)[2]);
3447*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3448*61046927SAndroid Build Coastguard Worker case TYPE_INT_2:
3449*61046927SAndroid Build Coastguard Worker case TYPE_ENUM_2:
3450*61046927SAndroid Build Coastguard Worker params[1] = INT_TO_FIXED(((GLint *) p)[1]);
3451*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3452*61046927SAndroid Build Coastguard Worker case TYPE_INT:
3453*61046927SAndroid Build Coastguard Worker case TYPE_ENUM:
3454*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_FIXED(((GLint *) p)[0]);
3455*61046927SAndroid Build Coastguard Worker break;
3456*61046927SAndroid Build Coastguard Worker
3457*61046927SAndroid Build Coastguard Worker case TYPE_UINT_4:
3458*61046927SAndroid Build Coastguard Worker params[3] = INT_TO_FIXED(((GLuint *) p)[3]);
3459*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3460*61046927SAndroid Build Coastguard Worker case TYPE_UINT_3:
3461*61046927SAndroid Build Coastguard Worker params[2] = INT_TO_FIXED(((GLuint *) p)[2]);
3462*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3463*61046927SAndroid Build Coastguard Worker case TYPE_UINT_2:
3464*61046927SAndroid Build Coastguard Worker params[1] = INT_TO_FIXED(((GLuint *) p)[1]);
3465*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
3466*61046927SAndroid Build Coastguard Worker case TYPE_UINT:
3467*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_FIXED(((GLuint *) p)[0]);
3468*61046927SAndroid Build Coastguard Worker break;
3469*61046927SAndroid Build Coastguard Worker
3470*61046927SAndroid Build Coastguard Worker case TYPE_ENUM16:
3471*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_FIXED((GLint)(((GLenum16 *) p)[0]));
3472*61046927SAndroid Build Coastguard Worker break;
3473*61046927SAndroid Build Coastguard Worker
3474*61046927SAndroid Build Coastguard Worker case TYPE_INT_N:
3475*61046927SAndroid Build Coastguard Worker for (i = 0; i < v.value_int_n.n; i++)
3476*61046927SAndroid Build Coastguard Worker params[i] = INT_TO_FIXED(v.value_int_n.ints[i]);
3477*61046927SAndroid Build Coastguard Worker break;
3478*61046927SAndroid Build Coastguard Worker
3479*61046927SAndroid Build Coastguard Worker case TYPE_INT64:
3480*61046927SAndroid Build Coastguard Worker params[0] = ((GLint64 *) p)[0];
3481*61046927SAndroid Build Coastguard Worker break;
3482*61046927SAndroid Build Coastguard Worker
3483*61046927SAndroid Build Coastguard Worker case TYPE_BOOLEAN:
3484*61046927SAndroid Build Coastguard Worker params[0] = BOOLEAN_TO_FIXED(((GLboolean*) p)[0]);
3485*61046927SAndroid Build Coastguard Worker break;
3486*61046927SAndroid Build Coastguard Worker
3487*61046927SAndroid Build Coastguard Worker case TYPE_UBYTE:
3488*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_FIXED(((GLubyte *) p)[0]);
3489*61046927SAndroid Build Coastguard Worker break;
3490*61046927SAndroid Build Coastguard Worker
3491*61046927SAndroid Build Coastguard Worker case TYPE_SHORT:
3492*61046927SAndroid Build Coastguard Worker params[0] = INT_TO_FIXED(((GLshort *) p)[0]);
3493*61046927SAndroid Build Coastguard Worker break;
3494*61046927SAndroid Build Coastguard Worker
3495*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX:
3496*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) p;
3497*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
3498*61046927SAndroid Build Coastguard Worker params[i] = FLOAT_TO_FIXED(m->m[i]);
3499*61046927SAndroid Build Coastguard Worker break;
3500*61046927SAndroid Build Coastguard Worker
3501*61046927SAndroid Build Coastguard Worker case TYPE_MATRIX_T:
3502*61046927SAndroid Build Coastguard Worker m = *(GLmatrix **) p;
3503*61046927SAndroid Build Coastguard Worker for (i = 0; i < 16; i++)
3504*61046927SAndroid Build Coastguard Worker params[i] = FLOAT_TO_FIXED(m->m[transpose[i]]);
3505*61046927SAndroid Build Coastguard Worker break;
3506*61046927SAndroid Build Coastguard Worker
3507*61046927SAndroid Build Coastguard Worker case TYPE_BIT_0:
3508*61046927SAndroid Build Coastguard Worker case TYPE_BIT_1:
3509*61046927SAndroid Build Coastguard Worker case TYPE_BIT_2:
3510*61046927SAndroid Build Coastguard Worker case TYPE_BIT_3:
3511*61046927SAndroid Build Coastguard Worker case TYPE_BIT_4:
3512*61046927SAndroid Build Coastguard Worker case TYPE_BIT_5:
3513*61046927SAndroid Build Coastguard Worker case TYPE_BIT_6:
3514*61046927SAndroid Build Coastguard Worker case TYPE_BIT_7:
3515*61046927SAndroid Build Coastguard Worker shift = d->type - TYPE_BIT_0;
3516*61046927SAndroid Build Coastguard Worker params[0] = BOOLEAN_TO_FIXED((*(GLbitfield *) p >> shift) & 1);
3517*61046927SAndroid Build Coastguard Worker break;
3518*61046927SAndroid Build Coastguard Worker }
3519*61046927SAndroid Build Coastguard Worker }
3520