1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (C) Copyright IBM Corporation 2002, 2004 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on the rights to use, copy, modify, merge, publish, distribute, sub 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * license, and/or sell copies of the Software, and to permit persons to whom 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the Software is furnished to do so, subject to the following conditions: 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE COPYRIGHT HOLDERS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file glxextensions.c 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \author Ian Romanick <idr@us.ibm.com> 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxclient.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/extutil.h> 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/Xext.h> 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string.h> 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glxextensions.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SET_BIT(m,b) (m[ (b) / 8 ] |= (1U << ((b) % 8))) 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CLR_BIT(m,b) (m[ (b) / 8 ] &= ~(1U << ((b) % 8))) 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IS_SET(m,b) ((m[ (b) / 8 ] & (1U << ((b) % 8))) != 0) 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define CONCAT(a,b) a ## b 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GLX(n) "GLX_" # n, 4 + sizeof( # n ) - 1, CONCAT(n,_bit) 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GL(n) "GL_" # n, 3 + sizeof( # n ) - 1, GL_ ## n ## _bit 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VER(a,b) a, b 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define Y 1 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define N 0 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EXT_ENABLED(bit,supported) (IS_SET( supported, bit )) 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct extension_info 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *const name; 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned name_len; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char bit; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This is the lowest version of GLX that "requires" this extension. 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For example, GLX 1.3 requires SGIX_fbconfig, SGIX_pbuffer, and 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SGI_make_current_read. If the extension is not required by any known 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * version of GLX, use 0, 0. 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char version_major; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char version_minor; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char client_support; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char direct_support; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char client_only; /** Is the extension client-side only? */ 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char direct_only; /** Is the extension for direct 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * contexts only? 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* *INDENT-OFF* */ 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct extension_info known_glx_extensions[] = { 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(ARB_create_context), VER(0,0), Y, N, N, N }, 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(ARB_create_context_profile), VER(0,0), Y, N, N, N }, 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(ARB_create_context_robustness), VER(0,0), Y, N, N, N }, 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(ARB_get_proc_address), VER(1,4), Y, N, Y, N }, 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(ARB_multisample), VER(1,4), Y, Y, N, N }, 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(ATI_pixel_format_float), VER(0,0), N, N, N, N }, 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(EXT_import_context), VER(0,0), Y, Y, N, N }, 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(EXT_visual_info), VER(0,0), Y, Y, N, N }, 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(EXT_visual_rating), VER(0,0), Y, Y, N, N }, 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(EXT_framebuffer_sRGB), VER(0,0), Y, Y, N, N }, 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(EXT_create_context_es2_profile), VER(0,0), Y, N, N, Y }, 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(MESA_copy_sub_buffer), VER(0,0), Y, N, N, N }, 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(MESA_multithread_makecurrent),VER(0,0), Y, N, Y, N }, 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(MESA_swap_control), VER(0,0), Y, N, N, Y }, 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(NV_float_buffer), VER(0,0), N, N, N, N }, 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(OML_swap_method), VER(0,0), Y, Y, N, N }, 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(OML_sync_control), VER(0,0), Y, N, N, Y }, 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(SGI_make_current_read), VER(1,3), Y, N, N, N }, 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(SGI_swap_control), VER(0,0), Y, N, N, N }, 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(SGI_video_sync), VER(0,0), Y, N, N, Y }, 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(SGIS_multisample), VER(0,0), Y, Y, N, N }, 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(SGIX_fbconfig), VER(1,3), Y, Y, N, N }, 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(SGIX_pbuffer), VER(1,3), Y, Y, N, N }, 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(SGIX_swap_barrier), VER(0,0), N, N, N, N }, 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(SGIX_swap_group), VER(0,0), N, N, N, N }, 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(SGIX_visual_select_group), VER(0,0), Y, Y, N, N }, 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(EXT_texture_from_pixmap), VER(0,0), Y, N, N, N }, 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GLX(INTEL_swap_event), VER(0,0), Y, N, N, N }, 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { NULL } 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct extension_info known_gl_extensions[] = { 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_depth_texture), VER(1,4), Y, N, N, N }, 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_draw_buffers), VER(0,0), Y, N, N, N }, 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_fragment_program), VER(0,0), Y, N, N, N }, 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_fragment_program_shadow), VER(0,0), Y, N, N, N }, 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_framebuffer_object), VER(0,0), Y, N, N, N }, 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_imaging), VER(0,0), Y, N, N, N }, 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_multisample), VER(1,3), Y, N, N, N }, 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_multitexture), VER(1,3), Y, N, N, N }, 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_occlusion_query), VER(1,5), Y, N, N, N }, 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_point_parameters), VER(1,4), Y, N, N, N }, 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_point_sprite), VER(0,0), Y, N, N, N }, 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_shadow), VER(1,4), Y, N, N, N }, 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_shadow_ambient), VER(0,0), Y, N, N, N }, 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_texture_border_clamp), VER(1,3), Y, N, N, N }, 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_texture_compression), VER(1,3), Y, N, N, N }, 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_texture_cube_map), VER(1,3), Y, N, N, N }, 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_texture_env_add), VER(1,3), Y, N, N, N }, 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_texture_env_combine), VER(1,3), Y, N, N, N }, 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_texture_env_crossbar), VER(1,4), Y, N, N, N }, 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_texture_env_dot3), VER(1,3), Y, N, N, N }, 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_texture_mirrored_repeat), VER(1,4), Y, N, N, N }, 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_texture_non_power_of_two), VER(1,5), Y, N, N, N }, 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_texture_rectangle), VER(0,0), Y, N, N, N }, 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_texture_rg), VER(0,0), Y, N, N, N }, 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_transpose_matrix), VER(1,3), Y, N, Y, N }, 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_vertex_buffer_object), VER(1,5), N, N, N, N }, 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_vertex_program), VER(0,0), Y, N, N, N }, 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ARB_window_pos), VER(1,4), Y, N, N, N }, 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_abgr), VER(0,0), Y, N, N, N }, 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_bgra), VER(1,2), Y, N, N, N }, 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_blend_color), VER(1,4), Y, N, N, N }, 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_blend_equation_separate), VER(0,0), Y, N, N, N }, 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_blend_func_separate), VER(1,4), Y, N, N, N }, 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_blend_logic_op), VER(1,4), Y, N, N, N }, 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_blend_minmax), VER(1,4), Y, N, N, N }, 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_blend_subtract), VER(1,4), Y, N, N, N }, 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_clip_volume_hint), VER(0,0), Y, N, N, N }, 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_compiled_vertex_array), VER(0,0), N, N, N, N }, 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_convolution), VER(0,0), N, N, N, N }, 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_copy_texture), VER(1,1), Y, N, N, N }, 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_cull_vertex), VER(0,0), N, N, N, N }, 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_depth_bounds_test), VER(0,0), N, N, N, N }, 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_draw_range_elements), VER(1,2), Y, N, Y, N }, 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_fog_coord), VER(1,4), Y, N, N, N }, 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_framebuffer_blit), VER(0,0), Y, N, N, N }, 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_framebuffer_multisample), VER(0,0), Y, N, N, N }, 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_framebuffer_object), VER(0,0), Y, N, N, N }, 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_framebuffer_sRGB), VER(0,0), Y, N, N, N }, 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_multi_draw_arrays), VER(1,4), Y, N, Y, N }, 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_packed_depth_stencil), VER(0,0), Y, N, N, N }, 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_packed_pixels), VER(1,2), Y, N, N, N }, 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_paletted_texture), VER(0,0), Y, N, N, N }, 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_pixel_buffer_object), VER(0,0), N, N, N, N }, 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_point_parameters), VER(1,4), Y, N, N, N }, 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_polygon_offset), VER(1,1), Y, N, N, N }, 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_rescale_normal), VER(1,2), Y, N, N, N }, 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_secondary_color), VER(1,4), Y, N, N, N }, 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_separate_specular_color), VER(1,2), Y, N, N, N }, 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_shadow_funcs), VER(1,5), Y, N, N, N }, 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_shared_texture_palette), VER(0,0), Y, N, N, N }, 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_stencil_two_side), VER(0,0), Y, N, N, N }, 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_stencil_wrap), VER(1,4), Y, N, N, N }, 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_subtexture), VER(1,1), Y, N, N, N }, 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture), VER(1,1), Y, N, N, N }, 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture3D), VER(1,2), Y, N, N, N }, 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture_compression_dxt1), VER(0,0), Y, N, N, N }, 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture_compression_s3tc), VER(0,0), Y, N, N, N }, 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture_edge_clamp), VER(1,2), Y, N, N, N }, 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture_env_add), VER(1,3), Y, N, N, N }, 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture_env_combine), VER(1,3), Y, N, N, N }, 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture_env_dot3), VER(0,0), Y, N, N, N }, 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture_filter_anisotropic), VER(0,0), Y, N, N, N }, 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture_lod), VER(1,2), Y, N, N, N }, 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture_lod_bias), VER(1,4), Y, N, N, N }, 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture_mirror_clamp), VER(0,0), Y, N, N, N }, 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture_object), VER(1,1), Y, N, N, N }, 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_texture_rectangle), VER(0,0), Y, N, N, N }, 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(EXT_vertex_array), VER(0,0), Y, N, N, N }, 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(3DFX_texture_compression_FXT1), VER(0,0), Y, N, N, N }, 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(APPLE_packed_pixels), VER(1,2), Y, N, N, N }, 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(APPLE_ycbcr_422), VER(0,0), Y, N, N, N }, 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ATI_draw_buffers), VER(0,0), Y, N, N, N }, 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ATI_text_fragment_shader), VER(0,0), Y, N, N, N }, 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ATI_texture_env_combine3), VER(0,0), Y, N, N, N }, 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ATI_texture_float), VER(0,0), Y, N, N, N }, 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ATI_texture_mirror_once), VER(0,0), Y, N, N, N }, 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(ATIX_texture_env_combine3), VER(0,0), Y, N, N, N }, 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(HP_convolution_border_modes), VER(0,0), Y, N, N, N }, 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(HP_occlusion_test), VER(0,0), Y, N, N, N }, 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(IBM_cull_vertex), VER(0,0), Y, N, N, N }, 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(IBM_pixel_filter_hint), VER(0,0), Y, N, N, N }, 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(IBM_rasterpos_clip), VER(0,0), Y, N, N, N }, 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(IBM_texture_clamp_nodraw), VER(0,0), Y, N, N, N }, 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(IBM_texture_mirrored_repeat), VER(0,0), Y, N, N, N }, 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(INGR_blend_func_separate), VER(0,0), Y, N, N, N }, 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(INGR_interlace_read), VER(0,0), Y, N, N, N }, 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(MESA_pack_invert), VER(0,0), Y, N, N, N }, 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(MESA_ycbcr_texture), VER(0,0), Y, N, N, N }, 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_blend_square), VER(1,4), Y, N, N, N }, 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_copy_depth_to_color), VER(0,0), Y, N, N, N }, 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_depth_clamp), VER(0,0), Y, N, N, N }, 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_fog_distance), VER(0,0), Y, N, N, N }, 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_fragment_program), VER(0,0), Y, N, N, N }, 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_fragment_program_option), VER(0,0), Y, N, N, N }, 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_fragment_program2), VER(0,0), Y, N, N, N }, 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_light_max_exponent), VER(0,0), Y, N, N, N }, 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_multisample_filter_hint), VER(0,0), Y, N, N, N }, 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_packed_depth_stencil), VER(0,0), Y, N, N, N }, 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_point_sprite), VER(0,0), Y, N, N, N }, 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_texgen_reflection), VER(0,0), Y, N, N, N }, 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_texture_compression_vtc), VER(0,0), Y, N, N, N }, 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_texture_env_combine4), VER(0,0), Y, N, N, N }, 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_texture_rectangle), VER(0,0), Y, N, N, N }, 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_vertex_program), VER(0,0), Y, N, N, N }, 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_vertex_program1_1), VER(0,0), Y, N, N, N }, 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_vertex_program2), VER(0,0), Y, N, N, N }, 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_vertex_program2_option), VER(0,0), Y, N, N, N }, 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(NV_vertex_program3), VER(0,0), Y, N, N, N }, 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(OES_read_format), VER(0,0), Y, N, N, N }, 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(OES_compressed_paletted_texture),VER(0,0), Y, N, N, N }, 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGI_color_matrix), VER(0,0), Y, N, N, N }, 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGI_color_table), VER(0,0), Y, N, N, N }, 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGI_texture_color_table), VER(0,0), Y, N, N, N }, 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIS_generate_mipmap), VER(1,4), Y, N, N, N }, 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIS_multisample), VER(0,0), Y, N, N, N }, 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIS_texture_border_clamp), VER(1,3), Y, N, N, N }, 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIS_texture_edge_clamp), VER(1,2), Y, N, N, N }, 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIS_texture_lod), VER(1,2), Y, N, N, N }, 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_blend_alpha_minmax), VER(0,0), Y, N, N, N }, 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_clipmap), VER(0,0), Y, N, N, N }, 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_depth_texture), VER(0,0), Y, N, N, N }, 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_fog_offset), VER(0,0), Y, N, N, N }, 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_shadow), VER(0,0), Y, N, N, N }, 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_shadow_ambient), VER(0,0), Y, N, N, N }, 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_texture_coordinate_clamp), VER(0,0), Y, N, N, N }, 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_texture_lod_bias), VER(0,0), Y, N, N, N }, 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_texture_range), VER(0,0), Y, N, N, N }, 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_texture_scale_bias), VER(0,0), Y, N, N, N }, 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_vertex_preclip), VER(0,0), Y, N, N, N }, 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_vertex_preclip_hint), VER(0,0), Y, N, N, N }, 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SGIX_ycrcb), VER(0,0), Y, N, N, N }, 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SUN_convolution_border_modes), VER(0,0), Y, N, N, N }, 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SUN_multi_draw_arrays), VER(0,0), Y, N, Y, N }, 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { GL(SUN_slice_accum), VER(0,0), Y, N, N, N }, 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { NULL } 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* *INDENT-ON* */ 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* global bit-fields of available extensions and their characteristics */ 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned char client_glx_support[8]; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned char client_glx_only[8]; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned char direct_glx_only[8]; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned char client_gl_support[__GL_EXT_BYTES]; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned char client_gl_only[__GL_EXT_BYTES]; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Bits representing the set of extensions that are enabled by default in all 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * direct rendering drivers. 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic unsigned char direct_glx_support[8]; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Highest core GL version that can be supported for indirect rendering. 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const unsigned gl_major = 1; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const unsigned gl_minor = 4; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* client extensions string */ 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const char *__glXGLXClientExtensions = NULL; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void __glXExtensionsCtr(void); 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void __glXExtensionsCtrScreen(struct glx_screen * psc); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void __glXProcessServerString(const struct extension_info *ext, 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *server_string, 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char *server_support); 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the state of a GLX extension. 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param name Name of the extension. 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param name_len Length, in characters, of the extension name. 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param state New state (either enabled or disabled) of the extension. 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param supported Table in which the state of the extension is to be set. 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_glx_extension(const struct extension_info *ext, 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *name, unsigned name_len, GLboolean state, 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char *supported) 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; ext[i].name != NULL; i++) { 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((name_len == ext[i].name_len) 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (strncmp(ext[i].name, name, name_len) == 0)) { 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state) { 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(supported, ext[i].bit); 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLR_BIT(supported, ext[i].bit); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NUL '\0' 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SEPARATOR ' ' 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert the server's extension string to a bit-field. 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param server_string GLX extension string from the server. 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param server_support Bit-field of supported extensions. 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function is used to process both GLX and GL extension strings. The 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * bit-fields used to track each of these have different sizes. Therefore, 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the data pointed by \c server_support must be preinitialized to zero. 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXProcessServerString(const struct extension_info *ext, 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *server_string, 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char *server_support) 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned base; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned len; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (base = 0; server_string[base] != NUL; /* empty */ ) { 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Determine the length of the next extension name. 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (len = 0; (server_string[base + len] != SEPARATOR) 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (server_string[base + len] != NUL); len++) { 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* empty */ 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set the bit for the extension in the server_support table. 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_glx_extension(ext, &server_string[base], len, GL_TRUE, 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org server_support); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Advance to the next extension string. This means that we skip 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * over the previous string and any trialing white-space. 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (base += len; (server_string[base] == SEPARATOR) 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (server_string[base] != NUL); base++) { 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* empty */ 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXEnableDirectExtension(struct glx_screen * psc, const char *name) 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXExtensionsCtr(); 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXExtensionsCtrScreen(psc); 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_glx_extension(known_glx_extensions, 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org name, strlen(name), GL_TRUE, psc->direct_support); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize global extension support tables. 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXExtensionsCtr(void) 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static GLboolean ext_list_first_time = GL_TRUE; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ext_list_first_time) { 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ext_list_first_time = GL_FALSE; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memset(client_glx_support, 0, sizeof(client_glx_support)); 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memset(direct_glx_support, 0, sizeof(direct_glx_support)); 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memset(client_glx_only, 0, sizeof(client_glx_only)); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memset(direct_glx_only, 0, sizeof(direct_glx_only)); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memset(client_gl_support, 0, sizeof(client_gl_support)); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memset(client_gl_only, 0, sizeof(client_gl_only)); 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; known_glx_extensions[i].name != NULL; i++) { 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned bit = known_glx_extensions[i].bit; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (known_glx_extensions[i].client_support) { 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(client_glx_support, bit); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (known_glx_extensions[i].direct_support) { 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(direct_glx_support, bit); 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (known_glx_extensions[i].client_only) { 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(client_glx_only, bit); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (known_glx_extensions[i].direct_only) { 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(direct_glx_only, bit); 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; known_gl_extensions[i].name != NULL; i++) { 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned bit = known_gl_extensions[i].bit; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (known_gl_extensions[i].client_support) { 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(client_gl_support, bit); 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (known_gl_extensions[i].client_only) { 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(client_gl_only, bit); 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "[%s:%u] Maximum client library version: %u.%u\n", 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __func__, __LINE__, gl_major, gl_minor); 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Make sure that per-screen direct-support table is initialized. 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param psc Pointer to GLX per-screen record. 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXExtensionsCtrScreen(struct glx_screen * psc) 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (psc->ext_list_first_time) { 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->ext_list_first_time = GL_FALSE; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memcpy(psc->direct_support, direct_glx_support, 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(direct_glx_support)); 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if a certain extension is enabled on a given screen. 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param psc Pointer to GLX per-screen record. 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param bit Bit index in the direct-support table. 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \returns If the extension bit is enabled for the screen, \c GL_TRUE is 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * returned. If the extension bit is not enabled or if \c psc is 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \c NULL, then \c GL_FALSE is returned. 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXExtensionBitIsEnabled(struct glx_screen * psc, unsigned bit) 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean enabled = GL_FALSE; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (psc != NULL) { 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXExtensionsCtr(); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXExtensionsCtrScreen(psc); 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enabled = EXT_ENABLED(bit, psc->direct_support); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return enabled; 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if a certain extension is enabled in a given context. 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glExtensionBitIsEnabled(struct glx_context *gc, unsigned bit) 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean enabled = GL_FALSE; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (gc != NULL) { 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enabled = EXT_ENABLED(bit, gc->gl_extension_bits); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return enabled; 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert a bit-field to a string of supported extensions. 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic char * 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXGetStringFromTable(const struct extension_info *ext, 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned char *supported) 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned ext_str_len; 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *ext_str; 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *point; 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ext_str_len = 0; 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; ext[i].name != NULL; i++) { 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (EXT_ENABLED(ext[i].bit, supported)) { 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ext_str_len += ext[i].name_len + 1; 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ext_str = Xmalloc(ext_str_len + 1); 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ext_str != NULL) { 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org point = ext_str; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; ext[i].name != NULL; i++) { 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (EXT_ENABLED(ext[i].bit, supported)) { 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memcpy(point, ext[i].name, ext[i].name_len); 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org point += ext[i].name_len; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *point = ' '; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org point++; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *point = '\0'; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ext_str; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the string of client library supported extensions. 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst char * 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXGetClientExtensions(void) 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (__glXGLXClientExtensions == NULL) { 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXExtensionsCtr(); 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXGLXClientExtensions = __glXGetStringFromTable(known_glx_extensions, 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org client_glx_support); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return __glXGLXClientExtensions; 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Calculate the list of application usable extensions. The resulting 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * string is stored in \c psc->effectiveGLXexts. 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param psc Pointer to GLX per-screen record. 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param display_is_direct_capable True if the display is capable of 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * direct rendering. 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param minor_version GLX minor version from the server. 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXCalculateUsableExtensions(struct glx_screen * psc, 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean display_is_direct_capable, 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int minor_version) 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char server_support[8]; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char usable[8]; 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXExtensionsCtr(); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXExtensionsCtrScreen(psc); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memset(server_support, 0, sizeof(server_support)); 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXProcessServerString(known_glx_extensions, 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->serverGLXexts, server_support); 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This is a hack. Some servers support GLX 1.3 but don't export 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all of the extensions implied by GLX 1.3. If the server claims 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * support for GLX 1.3, enable support for the extensions that can be 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "emulated" as well. 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef GLX_USE_APPLEGL 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (minor_version >= 3) { 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(server_support, EXT_visual_info_bit); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(server_support, EXT_visual_rating_bit); 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(server_support, SGI_make_current_read_bit); 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(server_support, SGIX_fbconfig_bit); 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(server_support, SGIX_pbuffer_bit); 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This one is a little iffy. GLX 1.3 doesn't incorporate all of this 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * extension. However, the only part that is not strictly client-side 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is shared. That's the glXQueryContext / glXQueryContextInfoEXT 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * function. 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(server_support, EXT_import_context_bit); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* An extension is supported if the client-side (i.e., libGL) supports 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it and the "server" supports it. In this case that means that either 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the true server supports it or it is only for direct-rendering and 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the direct rendering driver supports it. 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If the display is not capable of direct rendering, then the extension 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is enabled if and only if the client-side library and the server 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * support it. 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (display_is_direct_capable) { 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 8; i++) { 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usable[i] = (client_glx_support[i] & client_glx_only[i]) 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (client_glx_support[i] & psc->direct_support[i] & 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org server_support[i]) 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (client_glx_support[i] & psc->direct_support[i] & 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org direct_glx_only[i]); 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 8; i++) { 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usable[i] = (client_glx_support[i] & client_glx_only[i]) 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (client_glx_support[i] & server_support[i]); 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This hack is necessary because GLX_ARB_create_context_profile depends on 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * server support, but GLX_EXT_create_context_es2_profile is direct-only. 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Without this hack, it would be possible to advertise 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GLX_EXT_create_context_es2_profile without 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GLX_ARB_create_context_profile. That would be a problem. 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!IS_SET(server_support, ARB_create_context_profile_bit)) { 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CLR_BIT(usable, EXT_create_context_es2_profile_bit); 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org psc->effectiveGLXexts = __glXGetStringFromTable(known_glx_extensions, 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usable); 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Calculate the list of application usable extensions. The resulting 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * string is stored in \c gc->extensions. 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param gc Pointer to GLX context. 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param server_string Extension string from the server. 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param major_version GL major version from the server. 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param minor_version GL minor version from the server. 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXCalculateUsableGLExtensions(struct glx_context * gc, 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *server_string, 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int major_version, int minor_version) 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char server_support[__GL_EXT_BYTES]; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char usable[__GL_EXT_BYTES]; 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXExtensionsCtr(); 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memset(server_support, 0, sizeof(server_support)); 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXProcessServerString(known_gl_extensions, server_string, 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org server_support); 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Handle lazy servers that don't export all the extensions strings that 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are part of the GL core version that they support. 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < __GL_EXT_BYTES; i++) { 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((known_gl_extensions[i].version_major != 0) 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ((major_version > known_gl_extensions[i].version_major) 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || ((major_version == known_gl_extensions[i].version_major) 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (minor_version >= 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org known_gl_extensions[i].version_minor)))) { 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SET_BIT(server_support, known_gl_extensions[i].bit); 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* An extension is supported if the client-side (i.e., libGL) supports 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it and the server supports it or the client-side library supports it 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and it only needs client-side support. 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < __GL_EXT_BYTES; i++) { 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usable[i] = (client_gl_support[i] & client_gl_only[i]) 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (client_gl_support[i] & server_support[i]); 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gc->extensions = (unsigned char *) 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXGetStringFromTable(known_gl_extensions, usable); 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) memcpy(gc->gl_extension_bits, usable, sizeof(usable)); 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Calculates the maximum core GL version that can be supported for indirect 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rendering. 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXGetGLVersion(int *major_version, int *minor_version) 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXExtensionsCtr(); 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *major_version = gl_major; 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *minor_version = gl_minor; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get a string representing the set of extensions supported by the client 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * library. This is currently only used to send the list of extensions 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * supported by the client to the server. 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgchar * 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org__glXGetClientGLExtensionString(void) 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __glXExtensionsCtr(); 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return __glXGetStringFromTable(known_gl_extensions, client_gl_support); 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 722