version.c revision 3464ebd5
1cdc920a0Smrg/* 2cdc920a0Smrg * Mesa 3-D graphics library 3cdc920a0Smrg * 4cdc920a0Smrg * Copyright (C) 2010 VMware, Inc. All Rights Reserved. 5cdc920a0Smrg * 6cdc920a0Smrg * Permission is hereby granted, free of charge, to any person obtaining a 7cdc920a0Smrg * copy of this software and associated documentation files (the "Software"), 8cdc920a0Smrg * to deal in the Software without restriction, including without limitation 9cdc920a0Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10cdc920a0Smrg * and/or sell copies of the Software, and to permit persons to whom the 11cdc920a0Smrg * Software is furnished to do so, subject to the following conditions: 12cdc920a0Smrg * 13cdc920a0Smrg * The above copyright notice and this permission notice shall be included 14cdc920a0Smrg * in all copies or substantial portions of the Software. 15cdc920a0Smrg * 16cdc920a0Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17cdc920a0Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18cdc920a0Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19cdc920a0Smrg * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 20cdc920a0Smrg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21cdc920a0Smrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22cdc920a0Smrg */ 23cdc920a0Smrg 24cdc920a0Smrg 253464ebd5Sriastradh#include "imports.h" 263464ebd5Sriastradh#include "mtypes.h" 27cdc920a0Smrg#include "version.h" 283464ebd5Sriastradh#include "git_sha1.h" 29cdc920a0Smrg 30cdc920a0Smrg 31cdc920a0Smrg 32cdc920a0Smrg/** 33cdc920a0Smrg * Examine enabled GL extensions to determine GL version. 34cdc920a0Smrg * Return major and minor version numbers. 35cdc920a0Smrg */ 36cdc920a0Smrgstatic void 373464ebd5Sriastradhcompute_version(struct gl_context *ctx) 38cdc920a0Smrg{ 393464ebd5Sriastradh GLuint major, minor; 403464ebd5Sriastradh static const int max = 100; 413464ebd5Sriastradh 42cdc920a0Smrg const GLboolean ver_1_3 = (ctx->Extensions.ARB_multisample && 43cdc920a0Smrg ctx->Extensions.ARB_multitexture && 44cdc920a0Smrg ctx->Extensions.ARB_texture_border_clamp && 45cdc920a0Smrg ctx->Extensions.ARB_texture_compression && 46cdc920a0Smrg ctx->Extensions.ARB_texture_cube_map && 47cdc920a0Smrg ctx->Extensions.EXT_texture_env_add && 48cdc920a0Smrg ctx->Extensions.ARB_texture_env_combine && 49cdc920a0Smrg ctx->Extensions.ARB_texture_env_dot3); 50cdc920a0Smrg const GLboolean ver_1_4 = (ver_1_3 && 51cdc920a0Smrg ctx->Extensions.ARB_depth_texture && 52cdc920a0Smrg ctx->Extensions.ARB_shadow && 53cdc920a0Smrg ctx->Extensions.ARB_texture_env_crossbar && 54cdc920a0Smrg ctx->Extensions.ARB_texture_mirrored_repeat && 55cdc920a0Smrg ctx->Extensions.ARB_window_pos && 56cdc920a0Smrg ctx->Extensions.EXT_blend_color && 57cdc920a0Smrg ctx->Extensions.EXT_blend_func_separate && 58cdc920a0Smrg ctx->Extensions.EXT_blend_minmax && 59cdc920a0Smrg ctx->Extensions.EXT_blend_subtract && 60cdc920a0Smrg ctx->Extensions.EXT_fog_coord && 61cdc920a0Smrg ctx->Extensions.EXT_multi_draw_arrays && 62cdc920a0Smrg ctx->Extensions.EXT_point_parameters && 63cdc920a0Smrg ctx->Extensions.EXT_secondary_color && 64cdc920a0Smrg ctx->Extensions.EXT_stencil_wrap && 65cdc920a0Smrg ctx->Extensions.EXT_texture_lod_bias && 66cdc920a0Smrg ctx->Extensions.SGIS_generate_mipmap); 67cdc920a0Smrg const GLboolean ver_1_5 = (ver_1_4 && 68cdc920a0Smrg ctx->Extensions.ARB_occlusion_query && 69cdc920a0Smrg ctx->Extensions.ARB_vertex_buffer_object && 70cdc920a0Smrg ctx->Extensions.EXT_shadow_funcs); 71cdc920a0Smrg const GLboolean ver_2_0 = (ver_1_5 && 72cdc920a0Smrg ctx->Extensions.ARB_draw_buffers && 73cdc920a0Smrg ctx->Extensions.ARB_point_sprite && 74cdc920a0Smrg ctx->Extensions.ARB_shader_objects && 75cdc920a0Smrg ctx->Extensions.ARB_vertex_shader && 76cdc920a0Smrg ctx->Extensions.ARB_fragment_shader && 77cdc920a0Smrg ctx->Extensions.ARB_texture_non_power_of_two && 78cdc920a0Smrg ctx->Extensions.EXT_blend_equation_separate && 79cdc920a0Smrg 80cdc920a0Smrg /* Technically, 2.0 requires the functionality 81cdc920a0Smrg * of the EXT version. Enable 2.0 if either 82cdc920a0Smrg * extension is available, and assume that a 83cdc920a0Smrg * driver that only exposes the ATI extension 84cdc920a0Smrg * will fallback to software when necessary. 85cdc920a0Smrg */ 86cdc920a0Smrg (ctx->Extensions.EXT_stencil_two_side 87cdc920a0Smrg || ctx->Extensions.ATI_separate_stencil)); 88cdc920a0Smrg const GLboolean ver_2_1 = (ver_2_0 && 893464ebd5Sriastradh ctx->Const.GLSLVersion >= 120 && 90cdc920a0Smrg ctx->Extensions.EXT_pixel_buffer_object && 91cdc920a0Smrg ctx->Extensions.EXT_texture_sRGB); 923464ebd5Sriastradh const GLboolean ver_3_0 = (ver_2_1 && 933464ebd5Sriastradh ctx->Extensions.ARB_color_buffer_float && 943464ebd5Sriastradh ctx->Extensions.ARB_depth_buffer_float && 953464ebd5Sriastradh ctx->Extensions.ARB_half_float_pixel && 963464ebd5Sriastradh ctx->Extensions.ARB_map_buffer_range && 973464ebd5Sriastradh ctx->Extensions.ARB_texture_float && 983464ebd5Sriastradh ctx->Extensions.ARB_texture_rg && 993464ebd5Sriastradh ctx->Extensions.ARB_texture_compression_rgtc && 1003464ebd5Sriastradh ctx->Extensions.APPLE_vertex_array_object && 1013464ebd5Sriastradh ctx->Extensions.EXT_draw_buffers2 && 1023464ebd5Sriastradh ctx->Extensions.EXT_framebuffer_blit && 1033464ebd5Sriastradh ctx->Extensions.EXT_framebuffer_multisample && 1043464ebd5Sriastradh ctx->Extensions.EXT_framebuffer_object && 1053464ebd5Sriastradh ctx->Extensions.EXT_framebuffer_sRGB && 1063464ebd5Sriastradh ctx->Extensions.EXT_packed_depth_stencil && 1073464ebd5Sriastradh ctx->Extensions.EXT_packed_float && 1083464ebd5Sriastradh ctx->Extensions.EXT_texture_array && 1093464ebd5Sriastradh ctx->Extensions.EXT_texture_integer && 1103464ebd5Sriastradh ctx->Extensions.EXT_texture_shared_exponent && 1113464ebd5Sriastradh ctx->Extensions.EXT_transform_feedback && 1123464ebd5Sriastradh ctx->Extensions.NV_conditional_render); 1133464ebd5Sriastradh const GLboolean ver_3_1 = (ver_3_0 && 1143464ebd5Sriastradh ctx->Extensions.ARB_copy_buffer && 1153464ebd5Sriastradh ctx->Extensions.ARB_draw_instanced && 1163464ebd5Sriastradh ctx->Extensions.ARB_texture_buffer_object && 1173464ebd5Sriastradh ctx->Extensions.ARB_uniform_buffer_object && 1183464ebd5Sriastradh ctx->Extensions.EXT_texture_snorm && 1193464ebd5Sriastradh ctx->Extensions.NV_primitive_restart && 1203464ebd5Sriastradh ctx->Extensions.NV_texture_rectangle && 1213464ebd5Sriastradh ctx->Const.MaxVertexTextureImageUnits >= 16); 1223464ebd5Sriastradh const GLboolean ver_3_2 = (ver_3_1 && 1233464ebd5Sriastradh ctx->Extensions.ARB_depth_clamp && 1243464ebd5Sriastradh ctx->Extensions.ARB_draw_elements_base_vertex && 1253464ebd5Sriastradh ctx->Extensions.ARB_fragment_coord_conventions && 1263464ebd5Sriastradh ctx->Extensions.ARB_geometry_shader4 && 1273464ebd5Sriastradh ctx->Extensions.EXT_provoking_vertex && 1283464ebd5Sriastradh ctx->Extensions.ARB_seamless_cube_map && 1293464ebd5Sriastradh ctx->Extensions.ARB_sync && 1303464ebd5Sriastradh ctx->Extensions.ARB_texture_multisample && 1313464ebd5Sriastradh ctx->Extensions.EXT_vertex_array_bgra); 1323464ebd5Sriastradh const GLboolean ver_3_3 = (ver_3_2 && 1333464ebd5Sriastradh ctx->Extensions.ARB_blend_func_extended && 1343464ebd5Sriastradh ctx->Extensions.ARB_explicit_attrib_location && 1353464ebd5Sriastradh ctx->Extensions.ARB_instanced_arrays && 1363464ebd5Sriastradh ctx->Extensions.ARB_occlusion_query2 && 1373464ebd5Sriastradh ctx->Extensions.ARB_sampler_objects && 1383464ebd5Sriastradh ctx->Extensions.ARB_texture_rgb10_a2ui && 1393464ebd5Sriastradh ctx->Extensions.ARB_timer_query && 1403464ebd5Sriastradh ctx->Extensions.ARB_vertex_type_2_10_10_10_rev && 1413464ebd5Sriastradh ctx->Extensions.EXT_texture_swizzle); 1423464ebd5Sriastradh 1433464ebd5Sriastradh if (ver_3_3) { 1443464ebd5Sriastradh major = 3; 1453464ebd5Sriastradh minor = 3; 1463464ebd5Sriastradh } 1473464ebd5Sriastradh else if (ver_3_2) { 1483464ebd5Sriastradh major = 3; 1493464ebd5Sriastradh minor = 2; 1503464ebd5Sriastradh } 1513464ebd5Sriastradh else if (ver_3_1) { 1523464ebd5Sriastradh major = 3; 1533464ebd5Sriastradh minor = 1; 1543464ebd5Sriastradh } 1553464ebd5Sriastradh else if (ver_3_0) { 1563464ebd5Sriastradh major = 3; 1573464ebd5Sriastradh minor = 0; 1583464ebd5Sriastradh } 1593464ebd5Sriastradh else if (ver_2_1) { 1603464ebd5Sriastradh major = 2; 1613464ebd5Sriastradh minor = 1; 162cdc920a0Smrg } 163cdc920a0Smrg else if (ver_2_0) { 1643464ebd5Sriastradh major = 2; 1653464ebd5Sriastradh minor = 0; 166cdc920a0Smrg } 167cdc920a0Smrg else if (ver_1_5) { 1683464ebd5Sriastradh major = 1; 1693464ebd5Sriastradh minor = 5; 170cdc920a0Smrg } 171cdc920a0Smrg else if (ver_1_4) { 1723464ebd5Sriastradh major = 1; 1733464ebd5Sriastradh minor = 4; 174cdc920a0Smrg } 175cdc920a0Smrg else if (ver_1_3) { 1763464ebd5Sriastradh major = 1; 1773464ebd5Sriastradh minor = 3; 178cdc920a0Smrg } 179cdc920a0Smrg else { 1803464ebd5Sriastradh major = 1; 1813464ebd5Sriastradh minor = 2; 1823464ebd5Sriastradh } 1833464ebd5Sriastradh 1843464ebd5Sriastradh ctx->VersionMajor = major; 1853464ebd5Sriastradh ctx->VersionMinor = minor; 1863464ebd5Sriastradh ctx->VersionString = (char *) malloc(max); 1873464ebd5Sriastradh if (ctx->VersionString) { 1883464ebd5Sriastradh _mesa_snprintf(ctx->VersionString, max, 1893464ebd5Sriastradh "%u.%u Mesa " MESA_VERSION_STRING 1903464ebd5Sriastradh#ifdef MESA_GIT_SHA1 1913464ebd5Sriastradh " (" MESA_GIT_SHA1 ")" 1923464ebd5Sriastradh#endif 1933464ebd5Sriastradh , 1943464ebd5Sriastradh ctx->VersionMajor, ctx->VersionMinor); 195cdc920a0Smrg } 196cdc920a0Smrg} 197cdc920a0Smrg 1983464ebd5Sriastradhstatic void 1993464ebd5Sriastradhcompute_version_es1(struct gl_context *ctx) 2003464ebd5Sriastradh{ 2013464ebd5Sriastradh static const int max = 100; 2023464ebd5Sriastradh 2033464ebd5Sriastradh /* OpenGL ES 1.0 is derived from OpenGL 1.3 */ 2043464ebd5Sriastradh const GLboolean ver_1_0 = (ctx->Extensions.ARB_multisample && 2053464ebd5Sriastradh ctx->Extensions.ARB_multitexture && 2063464ebd5Sriastradh ctx->Extensions.ARB_texture_compression && 2073464ebd5Sriastradh ctx->Extensions.EXT_texture_env_add && 2083464ebd5Sriastradh ctx->Extensions.ARB_texture_env_combine && 2093464ebd5Sriastradh ctx->Extensions.ARB_texture_env_dot3); 2103464ebd5Sriastradh /* OpenGL ES 1.1 is derived from OpenGL 1.5 */ 2113464ebd5Sriastradh const GLboolean ver_1_1 = (ver_1_0 && 2123464ebd5Sriastradh ctx->Extensions.EXT_point_parameters && 2133464ebd5Sriastradh ctx->Extensions.SGIS_generate_mipmap && 2143464ebd5Sriastradh ctx->Extensions.ARB_vertex_buffer_object); 2153464ebd5Sriastradh 2163464ebd5Sriastradh if (ver_1_1) { 2173464ebd5Sriastradh ctx->VersionMajor = 1; 2183464ebd5Sriastradh ctx->VersionMinor = 1; 2193464ebd5Sriastradh } else if (ver_1_0) { 2203464ebd5Sriastradh ctx->VersionMajor = 1; 2213464ebd5Sriastradh ctx->VersionMinor = 0; 2223464ebd5Sriastradh } else { 2233464ebd5Sriastradh _mesa_problem(ctx, "Incomplete OpenGL ES 1.0 support."); 2243464ebd5Sriastradh } 2253464ebd5Sriastradh 2263464ebd5Sriastradh ctx->VersionString = (char *) malloc(max); 2273464ebd5Sriastradh if (ctx->VersionString) { 2283464ebd5Sriastradh _mesa_snprintf(ctx->VersionString, max, 2293464ebd5Sriastradh "OpenGL ES-CM 1.%d Mesa " MESA_VERSION_STRING, 2303464ebd5Sriastradh ctx->VersionMinor); 2313464ebd5Sriastradh } 2323464ebd5Sriastradh} 2333464ebd5Sriastradh 2343464ebd5Sriastradhstatic void 2353464ebd5Sriastradhcompute_version_es2(struct gl_context *ctx) 2363464ebd5Sriastradh{ 2373464ebd5Sriastradh static const int max = 100; 2383464ebd5Sriastradh 2393464ebd5Sriastradh /* OpenGL ES 2.0 is derived from OpenGL 2.0 */ 2403464ebd5Sriastradh const GLboolean ver_2_0 = (ctx->Extensions.ARB_multisample && 2413464ebd5Sriastradh ctx->Extensions.ARB_multitexture && 2423464ebd5Sriastradh ctx->Extensions.ARB_texture_compression && 2433464ebd5Sriastradh ctx->Extensions.ARB_texture_cube_map && 2443464ebd5Sriastradh ctx->Extensions.ARB_texture_mirrored_repeat && 2453464ebd5Sriastradh ctx->Extensions.EXT_blend_color && 2463464ebd5Sriastradh ctx->Extensions.EXT_blend_func_separate && 2473464ebd5Sriastradh ctx->Extensions.EXT_blend_minmax && 2483464ebd5Sriastradh ctx->Extensions.EXT_blend_subtract && 2493464ebd5Sriastradh ctx->Extensions.EXT_stencil_wrap && 2503464ebd5Sriastradh ctx->Extensions.ARB_vertex_buffer_object && 2513464ebd5Sriastradh ctx->Extensions.ARB_shader_objects && 2523464ebd5Sriastradh ctx->Extensions.ARB_vertex_shader && 2533464ebd5Sriastradh ctx->Extensions.ARB_fragment_shader && 2543464ebd5Sriastradh ctx->Extensions.ARB_texture_non_power_of_two && 2553464ebd5Sriastradh ctx->Extensions.EXT_blend_equation_separate); 2563464ebd5Sriastradh if (ver_2_0) { 2573464ebd5Sriastradh ctx->VersionMajor = 2; 2583464ebd5Sriastradh ctx->VersionMinor = 0; 2593464ebd5Sriastradh } else { 2603464ebd5Sriastradh _mesa_problem(ctx, "Incomplete OpenGL ES 2.0 support."); 2613464ebd5Sriastradh } 2623464ebd5Sriastradh 2633464ebd5Sriastradh ctx->VersionString = (char *) malloc(max); 2643464ebd5Sriastradh if (ctx->VersionString) { 2653464ebd5Sriastradh _mesa_snprintf(ctx->VersionString, max, 2663464ebd5Sriastradh "OpenGL ES 2.0 Mesa " MESA_VERSION_STRING); 2673464ebd5Sriastradh } 2683464ebd5Sriastradh} 269cdc920a0Smrg 270cdc920a0Smrg/** 271cdc920a0Smrg * Set the context's VersionMajor, VersionMinor, VersionString fields. 2723464ebd5Sriastradh * This should only be called once as part of context initialization 2733464ebd5Sriastradh * or to perform version check for GLX_ARB_create_context_profile. 274cdc920a0Smrg */ 275cdc920a0Smrgvoid 2763464ebd5Sriastradh_mesa_compute_version(struct gl_context *ctx) 277cdc920a0Smrg{ 2783464ebd5Sriastradh if (ctx->VersionMajor) 2793464ebd5Sriastradh return; 280cdc920a0Smrg 2813464ebd5Sriastradh switch (ctx->API) { 2823464ebd5Sriastradh case API_OPENGL: 2833464ebd5Sriastradh compute_version(ctx); 2843464ebd5Sriastradh break; 2853464ebd5Sriastradh case API_OPENGLES: 2863464ebd5Sriastradh compute_version_es1(ctx); 2873464ebd5Sriastradh break; 2883464ebd5Sriastradh case API_OPENGLES2: 2893464ebd5Sriastradh compute_version_es2(ctx); 2903464ebd5Sriastradh break; 291cdc920a0Smrg } 2923464ebd5Sriastradh 293cdc920a0Smrg} 294