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