version.c revision cdc920a0
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
25cdc920a0Smrg#include "context.h"
26cdc920a0Smrg#include "version.h"
27cdc920a0Smrg
28cdc920a0Smrg
29cdc920a0Smrg
30cdc920a0Smrg/**
31cdc920a0Smrg * Examine enabled GL extensions to determine GL version.
32cdc920a0Smrg * Return major and minor version numbers.
33cdc920a0Smrg */
34cdc920a0Smrgstatic void
35cdc920a0Smrgcompute_version(const GLcontext *ctx, GLuint *major, GLuint *minor)
36cdc920a0Smrg{
37cdc920a0Smrg   const GLboolean ver_1_3 = (ctx->Extensions.ARB_multisample &&
38cdc920a0Smrg                              ctx->Extensions.ARB_multitexture &&
39cdc920a0Smrg                              ctx->Extensions.ARB_texture_border_clamp &&
40cdc920a0Smrg                              ctx->Extensions.ARB_texture_compression &&
41cdc920a0Smrg                              ctx->Extensions.ARB_texture_cube_map &&
42cdc920a0Smrg                              ctx->Extensions.EXT_texture_env_add &&
43cdc920a0Smrg                              ctx->Extensions.ARB_texture_env_combine &&
44cdc920a0Smrg                              ctx->Extensions.ARB_texture_env_dot3);
45cdc920a0Smrg   const GLboolean ver_1_4 = (ver_1_3 &&
46cdc920a0Smrg                              ctx->Extensions.ARB_depth_texture &&
47cdc920a0Smrg                              ctx->Extensions.ARB_shadow &&
48cdc920a0Smrg                              ctx->Extensions.ARB_texture_env_crossbar &&
49cdc920a0Smrg                              ctx->Extensions.ARB_texture_mirrored_repeat &&
50cdc920a0Smrg                              ctx->Extensions.ARB_window_pos &&
51cdc920a0Smrg                              ctx->Extensions.EXT_blend_color &&
52cdc920a0Smrg                              ctx->Extensions.EXT_blend_func_separate &&
53cdc920a0Smrg                              ctx->Extensions.EXT_blend_minmax &&
54cdc920a0Smrg                              ctx->Extensions.EXT_blend_subtract &&
55cdc920a0Smrg                              ctx->Extensions.EXT_fog_coord &&
56cdc920a0Smrg                              ctx->Extensions.EXT_multi_draw_arrays &&
57cdc920a0Smrg                              ctx->Extensions.EXT_point_parameters &&
58cdc920a0Smrg                              ctx->Extensions.EXT_secondary_color &&
59cdc920a0Smrg                              ctx->Extensions.EXT_stencil_wrap &&
60cdc920a0Smrg                              ctx->Extensions.EXT_texture_lod_bias &&
61cdc920a0Smrg                              ctx->Extensions.SGIS_generate_mipmap);
62cdc920a0Smrg   const GLboolean ver_1_5 = (ver_1_4 &&
63cdc920a0Smrg                              ctx->Extensions.ARB_occlusion_query &&
64cdc920a0Smrg                              ctx->Extensions.ARB_vertex_buffer_object &&
65cdc920a0Smrg                              ctx->Extensions.EXT_shadow_funcs);
66cdc920a0Smrg   const GLboolean ver_2_0 = (ver_1_5 &&
67cdc920a0Smrg                              ctx->Extensions.ARB_draw_buffers &&
68cdc920a0Smrg                              ctx->Extensions.ARB_point_sprite &&
69cdc920a0Smrg                              ctx->Extensions.ARB_shader_objects &&
70cdc920a0Smrg                              ctx->Extensions.ARB_vertex_shader &&
71cdc920a0Smrg                              ctx->Extensions.ARB_fragment_shader &&
72cdc920a0Smrg                              ctx->Extensions.ARB_texture_non_power_of_two &&
73cdc920a0Smrg                              ctx->Extensions.EXT_blend_equation_separate &&
74cdc920a0Smrg
75cdc920a0Smrg			      /* Technically, 2.0 requires the functionality
76cdc920a0Smrg			       * of the EXT version.  Enable 2.0 if either
77cdc920a0Smrg			       * extension is available, and assume that a
78cdc920a0Smrg			       * driver that only exposes the ATI extension
79cdc920a0Smrg			       * will fallback to software when necessary.
80cdc920a0Smrg			       */
81cdc920a0Smrg			      (ctx->Extensions.EXT_stencil_two_side
82cdc920a0Smrg			       || ctx->Extensions.ATI_separate_stencil));
83cdc920a0Smrg   const GLboolean ver_2_1 = (ver_2_0 &&
84cdc920a0Smrg                              ctx->Extensions.ARB_shading_language_120 &&
85cdc920a0Smrg                              ctx->Extensions.EXT_pixel_buffer_object &&
86cdc920a0Smrg                              ctx->Extensions.EXT_texture_sRGB);
87cdc920a0Smrg   if (ver_2_1) {
88cdc920a0Smrg      *major = 2;
89cdc920a0Smrg      *minor = 1;
90cdc920a0Smrg   }
91cdc920a0Smrg   else if (ver_2_0) {
92cdc920a0Smrg      *major = 2;
93cdc920a0Smrg      *minor = 0;
94cdc920a0Smrg   }
95cdc920a0Smrg   else if (ver_1_5) {
96cdc920a0Smrg      *major = 1;
97cdc920a0Smrg      *minor = 5;
98cdc920a0Smrg   }
99cdc920a0Smrg   else if (ver_1_4) {
100cdc920a0Smrg      *major = 1;
101cdc920a0Smrg      *minor = 4;
102cdc920a0Smrg   }
103cdc920a0Smrg   else if (ver_1_3) {
104cdc920a0Smrg      *major = 1;
105cdc920a0Smrg      *minor = 3;
106cdc920a0Smrg   }
107cdc920a0Smrg   else {
108cdc920a0Smrg      *major = 1;
109cdc920a0Smrg      *minor = 2;
110cdc920a0Smrg   }
111cdc920a0Smrg}
112cdc920a0Smrg
113cdc920a0Smrg
114cdc920a0Smrg/**
115cdc920a0Smrg * Set the context's VersionMajor, VersionMinor, VersionString fields.
116cdc920a0Smrg * This should only be called once as part of context initialization.
117cdc920a0Smrg */
118cdc920a0Smrgvoid
119cdc920a0Smrg_mesa_compute_version(GLcontext *ctx)
120cdc920a0Smrg{
121cdc920a0Smrg   static const int max = 100;
122cdc920a0Smrg
123cdc920a0Smrg   compute_version(ctx, &ctx->VersionMajor, &ctx->VersionMinor);
124cdc920a0Smrg
125cdc920a0Smrg   ctx->VersionString = (char *) malloc(max);
126cdc920a0Smrg   if (ctx->VersionString) {
127cdc920a0Smrg      _mesa_snprintf(ctx->VersionString, max, "%u.%u Mesa " MESA_VERSION_STRING,
128cdc920a0Smrg	       ctx->VersionMajor, ctx->VersionMinor);
129cdc920a0Smrg   }
130cdc920a0Smrg}
131