1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2010 VMware, Inc. All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h" 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "version.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "git_sha1.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Override the context's GL version if the environment variable 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MESA_GL_VERSION_OVERRIDE is set. Valid values of MESA_GL_VERSION_OVERRIDE 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are point-separated version numbers, such as "3.0". 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgoverride_version(struct gl_context *ctx) 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *env_var = "MESA_GL_VERSION_OVERRIDE"; 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *version; 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int n; 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int major, minor; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org version = getenv(env_var); 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!version) { 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org n = sscanf(version, "%u.%u", &major, &minor); 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (n != 2) { 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "error: invalid value for %s: %s\n", env_var, version); 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Version = major * 10 + minor; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Override the context's GLSL version if the environment variable 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MESA_GLSL_VERSION_OVERRIDE is set. Valid values for 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MESA_GLSL_VERSION_OVERRIDE are integers, such as "130". 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_override_glsl_version(struct gl_context *ctx) 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *env_var = "MESA_GLSL_VERSION_OVERRIDE"; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *version; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int n; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org version = getenv(env_var); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!version) { 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org n = sscanf(version, "%u", &ctx->Const.GLSLVersion); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (n != 1) { 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprintf(stderr, "error: invalid value for %s: %s\n", env_var, version); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Examine enabled GL extensions to determine GL version. 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompute_version(struct gl_context *ctx) 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint major, minor; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const int max = 100; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean ver_1_3 = (ctx->Extensions.ARB_texture_border_clamp && 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_cube_map && 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_env_combine && 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_env_dot3); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean ver_1_4 = (ver_1_3 && 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_depth_texture && 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_shadow && 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_env_crossbar && 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_window_pos && 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_blend_color && 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_blend_func_separate && 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_blend_minmax && 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_fog_coord && 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_point_parameters && 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_secondary_color); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean ver_1_5 = (ver_1_4 && 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_occlusion_query && 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_shadow_funcs); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean ver_2_0 = (ver_1_5 && 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_point_sprite && 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_shader_objects && 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_vertex_shader && 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_fragment_shader && 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_non_power_of_two && 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_blend_equation_separate && 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Technically, 2.0 requires the functionality 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the EXT version. Enable 2.0 if either 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * extension is available, and assume that a 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * driver that only exposes the ATI extension 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * will fallback to software when necessary. 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (ctx->Extensions.EXT_stencil_two_side 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || ctx->Extensions.ATI_separate_stencil)); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean ver_2_1 = (ver_2_0 && 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Const.GLSLVersion >= 120 && 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_pixel_buffer_object && 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_sRGB); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean ver_3_0 = (ver_2_1 && 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Const.GLSLVersion >= 130 && 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Const.MaxSamples >= 4 && 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_color_buffer_float && 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_depth_buffer_float && 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_half_float_pixel && 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_half_float_vertex && 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_map_buffer_range && 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_shader_texture_lod && 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_float && 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_rg && 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_compression_rgtc && 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_draw_buffers2 && 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_framebuffer_object && 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_framebuffer_sRGB && 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_packed_float && 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_array && 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_shared_exponent && 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_transform_feedback && 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.NV_conditional_render); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean ver_3_1 = (ver_3_0 && 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Const.GLSLVersion >= 140 && 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_copy_buffer && 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_draw_instanced && 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_buffer_object && 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_uniform_buffer_object && 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_snorm && 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.NV_primitive_restart && 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.NV_texture_rectangle && 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Const.MaxVertexTextureImageUnits >= 16); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean ver_3_2 = (ver_3_1 && 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Const.GLSLVersion >= 150 && 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_depth_clamp && 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_draw_elements_base_vertex && 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_fragment_coord_conventions && 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_geometry_shader4 && 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_provoking_vertex && 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_seamless_cube_map && 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_sync && 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_multisample && 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_vertex_array_bgra); 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean ver_3_3 = (ver_3_2 && 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Const.GLSLVersion >= 330 && 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_blend_func_extended && 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_explicit_attrib_location && 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_instanced_arrays && 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_occlusion_query2 && 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_shader_bit_encoding && 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_rgb10_a2ui && 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_timer_query && 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_vertex_type_2_10_10_10_rev && 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_swizzle); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ARB_sampler_objects is always enabled in mesa */ 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ver_3_3) { 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org major = 3; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minor = 3; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ver_3_2) { 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org major = 3; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minor = 2; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ver_3_1) { 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org major = 3; 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minor = 1; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ver_3_0) { 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org major = 3; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minor = 0; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ver_2_1) { 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org major = 2; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minor = 1; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ver_2_0) { 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org major = 2; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minor = 0; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ver_1_5) { 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org major = 1; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minor = 5; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ver_1_4) { 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org major = 1; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minor = 4; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ver_1_3) { 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org major = 1; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minor = 3; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org major = 1; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org minor = 2; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Version = major * 10 + minor; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org override_version(ctx); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->VersionString = (char *) malloc(max); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->VersionString) { 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_snprintf(ctx->VersionString, max, 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%u.%u Mesa " MESA_VERSION_STRING 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef MESA_GIT_SHA1 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " (" MESA_GIT_SHA1 ")" 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org , 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Version / 10, ctx->Version % 10); 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompute_version_es1(struct gl_context *ctx) 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const int max = 100; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* OpenGL ES 1.0 is derived from OpenGL 1.3 */ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean ver_1_0 = (ctx->Extensions.ARB_texture_env_combine && 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_env_dot3); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* OpenGL ES 1.1 is derived from OpenGL 1.5 */ 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean ver_1_1 = (ver_1_0 && 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_point_parameters); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ver_1_1) { 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Version = 11; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (ver_1_0) { 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Version = 10; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Incomplete OpenGL ES 1.0 support."); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->VersionString = (char *) malloc(max); 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->VersionString) { 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_snprintf(ctx->VersionString, max, 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "OpenGL ES-CM 1.%d Mesa " MESA_VERSION_STRING 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef MESA_GIT_SHA1 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " (" MESA_GIT_SHA1 ")" 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org , 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Version % 10); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompute_version_es2(struct gl_context *ctx) 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const int max = 100; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* OpenGL ES 2.0 is derived from OpenGL 2.0 */ 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean ver_2_0 = (ctx->Extensions.ARB_texture_cube_map && 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_blend_color && 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_blend_func_separate && 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_blend_minmax && 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_shader_objects && 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_vertex_shader && 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_fragment_shader && 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.ARB_texture_non_power_of_two && 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_blend_equation_separate); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ver_2_0) { 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Version = 20; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Incomplete OpenGL ES 2.0 support."); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->VersionString = (char *) malloc(max); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->VersionString) { 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_snprintf(ctx->VersionString, max, 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "OpenGL ES 2.0 Mesa " MESA_VERSION_STRING 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef MESA_GIT_SHA1 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " (" MESA_GIT_SHA1 ")" 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the context's Version and VersionString fields. 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This should only be called once as part of context initialization 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * or to perform version check for GLX_ARB_create_context_profile. 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_compute_version(struct gl_context *ctx) 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Version) 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ctx->API) { 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case API_OPENGL: 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case API_OPENGL_CORE: 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_version(ctx); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case API_OPENGLES: 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_version_es1(ctx); 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case API_OPENGLES2: 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_version_es2(ctx); 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 328