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