~mmach/netext73/mesa-haswell

« back to all changes in this revision

Viewing changes to src/mesa/main/get.c

  • Committer: mmach
  • Date: 2022-09-22 19:56:13 UTC
  • Revision ID: netbit73@gmail.com-20220922195613-wtik9mmy20tmor0i
2022-09-22 21:17:09

Show diffs side-by-side

added added

removed removed

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