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