version.c revision af69d88d
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
19af69d88dSmrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20af69d88dSmrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21af69d88dSmrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22af69d88dSmrg * OTHER DEALINGS IN THE SOFTWARE.
23cdc920a0Smrg */
24cdc920a0Smrg
25cdc920a0Smrg
263464ebd5Sriastradh#include "imports.h"
273464ebd5Sriastradh#include "mtypes.h"
28cdc920a0Smrg#include "version.h"
293464ebd5Sriastradh#include "git_sha1.h"
30cdc920a0Smrg
31af69d88dSmrg/**
32af69d88dSmrg * Scans 'string' to see if it ends with 'ending'.
33af69d88dSmrg */
34af69d88dSmrgstatic GLboolean
35af69d88dSmrgcheck_for_ending(const char *string, const char *ending)
36af69d88dSmrg{
37af69d88dSmrg   int len1, len2;
38cdc920a0Smrg
39af69d88dSmrg   len1 = strlen(string);
40af69d88dSmrg   len2 = strlen(ending);
41af69d88dSmrg
42af69d88dSmrg   if (len2 > len1) {
43af69d88dSmrg      return GL_FALSE;
44af69d88dSmrg   }
45af69d88dSmrg
46af69d88dSmrg   if (strcmp(string + (len1 - len2), ending) == 0) {
47af69d88dSmrg      return GL_TRUE;
48af69d88dSmrg   } else {
49af69d88dSmrg      return GL_FALSE;
50af69d88dSmrg   }
51af69d88dSmrg}
52cdc920a0Smrg
53cdc920a0Smrg/**
54af69d88dSmrg * Returns the gl override data
55af69d88dSmrg *
56af69d88dSmrg * version > 0 indicates there is an override requested
57af69d88dSmrg * fwd_context is only valid if version > 0
58cdc920a0Smrg */
59cdc920a0Smrgstatic void
60af69d88dSmrgget_gl_override(int *version, GLboolean *fwd_context)
61af69d88dSmrg{
62af69d88dSmrg   const char *env_var = "MESA_GL_VERSION_OVERRIDE";
63af69d88dSmrg   const char *version_str;
64af69d88dSmrg   int major, minor, n;
65af69d88dSmrg   static int override_version = -1;
66af69d88dSmrg   static GLboolean fc_suffix = GL_FALSE;
67af69d88dSmrg
68af69d88dSmrg   if (override_version < 0) {
69af69d88dSmrg      override_version = 0;
70af69d88dSmrg
71af69d88dSmrg      version_str = getenv(env_var);
72af69d88dSmrg      if (version_str) {
73af69d88dSmrg         fc_suffix = check_for_ending(version_str, "FC");
74af69d88dSmrg
75af69d88dSmrg         n = sscanf(version_str, "%u.%u", &major, &minor);
76af69d88dSmrg         if (n != 2) {
77af69d88dSmrg            fprintf(stderr, "error: invalid value for %s: %s\n", env_var, version_str);
78af69d88dSmrg            override_version = 0;
79af69d88dSmrg         } else {
80af69d88dSmrg            override_version = major * 10 + minor;
81af69d88dSmrg            if (override_version < 30 && fc_suffix) {
82af69d88dSmrg               fprintf(stderr, "error: invalid value for %s: %s\n", env_var, version_str);
83af69d88dSmrg            }
84af69d88dSmrg         }
85af69d88dSmrg      }
86af69d88dSmrg   }
87af69d88dSmrg
88af69d88dSmrg   *version = override_version;
89af69d88dSmrg   *fwd_context = fc_suffix;
90af69d88dSmrg}
91af69d88dSmrg
92af69d88dSmrg/**
93af69d88dSmrg * Builds the MESA version string.
94af69d88dSmrg */
95af69d88dSmrgstatic void
96af69d88dSmrgcreate_version_string(struct gl_context *ctx, const char *prefix)
97cdc920a0Smrg{
983464ebd5Sriastradh   static const int max = 100;
993464ebd5Sriastradh
100af69d88dSmrg   ctx->VersionString = malloc(max);
101af69d88dSmrg   if (ctx->VersionString) {
102af69d88dSmrg      _mesa_snprintf(ctx->VersionString, max,
103af69d88dSmrg		     "%s%u.%u%s Mesa " PACKAGE_VERSION
104af69d88dSmrg#ifdef MESA_GIT_SHA1
105af69d88dSmrg		     " (" MESA_GIT_SHA1 ")"
106af69d88dSmrg#endif
107af69d88dSmrg		     ,
108af69d88dSmrg		     prefix,
109af69d88dSmrg		     ctx->Version / 10, ctx->Version % 10,
110af69d88dSmrg		     (ctx->API == API_OPENGL_CORE) ? " (Core Profile)" : ""
111af69d88dSmrg		     );
112af69d88dSmrg   }
113af69d88dSmrg}
114af69d88dSmrg
115af69d88dSmrg/**
116af69d88dSmrg * Override the context's version and/or API type if the
117af69d88dSmrg * environment variable MESA_GL_VERSION_OVERRIDE is set.
118af69d88dSmrg *
119af69d88dSmrg * Example uses of MESA_GL_VERSION_OVERRIDE:
120af69d88dSmrg *
121af69d88dSmrg * 2.1: select a compatibility (non-Core) profile with GL version 2.1
122af69d88dSmrg * 3.0: select a compatibility (non-Core) profile with GL version 3.0
123af69d88dSmrg * 3.0FC: select a Core+Forward Compatible profile with GL version 3.0
124af69d88dSmrg * 3.1: select a Core profile with GL version 3.1
125af69d88dSmrg * 3.1FC: select a Core+Forward Compatible profile with GL version 3.1
126af69d88dSmrg */
127af69d88dSmrgbool
128af69d88dSmrg_mesa_override_gl_version_contextless(struct gl_constants *consts,
129af69d88dSmrg                                      gl_api *apiOut, GLuint *versionOut)
130af69d88dSmrg{
131af69d88dSmrg   int version;
132af69d88dSmrg   GLboolean fwd_context;
133af69d88dSmrg
134af69d88dSmrg   get_gl_override(&version, &fwd_context);
135af69d88dSmrg
136af69d88dSmrg   if (version > 0) {
137af69d88dSmrg      *versionOut = version;
138af69d88dSmrg      if (version >= 30 && fwd_context) {
139af69d88dSmrg         *apiOut = API_OPENGL_CORE;
140af69d88dSmrg         consts->ContextFlags |= GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT;
141af69d88dSmrg      } else if (version >= 31) {
142af69d88dSmrg         *apiOut = API_OPENGL_CORE;
143af69d88dSmrg      } else {
144af69d88dSmrg         *apiOut = API_OPENGL_COMPAT;
145af69d88dSmrg      }
146af69d88dSmrg      return GL_TRUE;
147af69d88dSmrg   }
148af69d88dSmrg   return GL_FALSE;
149af69d88dSmrg}
150af69d88dSmrg
151af69d88dSmrgvoid
152af69d88dSmrg_mesa_override_gl_version(struct gl_context *ctx)
153af69d88dSmrg{
154af69d88dSmrg   if (_mesa_override_gl_version_contextless(&ctx->Const, &ctx->API,
155af69d88dSmrg                                             &ctx->Version)) {
156af69d88dSmrg      create_version_string(ctx, "");
157af69d88dSmrg   }
158af69d88dSmrg}
159af69d88dSmrg
160af69d88dSmrg/**
161af69d88dSmrg * Returns the gl override value
162af69d88dSmrg *
163af69d88dSmrg * version > 0 indicates there is an override requested
164af69d88dSmrg */
165af69d88dSmrgint
166af69d88dSmrg_mesa_get_gl_version_override(void)
167af69d88dSmrg{
168af69d88dSmrg   int version;
169af69d88dSmrg   GLboolean fwd_context;
170af69d88dSmrg
171af69d88dSmrg   get_gl_override(&version, &fwd_context);
172af69d88dSmrg
173af69d88dSmrg   return version;
174af69d88dSmrg}
175af69d88dSmrg
176af69d88dSmrg/**
177af69d88dSmrg * Override the context's GLSL version if the environment variable
178af69d88dSmrg * MESA_GLSL_VERSION_OVERRIDE is set. Valid values for
179af69d88dSmrg * MESA_GLSL_VERSION_OVERRIDE are integers, such as "130".
180af69d88dSmrg */
181af69d88dSmrgvoid
182af69d88dSmrg_mesa_override_glsl_version(struct gl_constants *consts)
183af69d88dSmrg{
184af69d88dSmrg   const char *env_var = "MESA_GLSL_VERSION_OVERRIDE";
185af69d88dSmrg   const char *version;
186af69d88dSmrg   int n;
187af69d88dSmrg
188af69d88dSmrg   version = getenv(env_var);
189af69d88dSmrg   if (!version) {
190af69d88dSmrg      return;
191af69d88dSmrg   }
192af69d88dSmrg
193af69d88dSmrg   n = sscanf(version, "%u", &consts->GLSLVersion);
194af69d88dSmrg   if (n != 1) {
195af69d88dSmrg      fprintf(stderr, "error: invalid value for %s: %s\n", env_var, version);
196af69d88dSmrg      return;
197af69d88dSmrg   }
198af69d88dSmrg}
199af69d88dSmrg
200af69d88dSmrg/**
201af69d88dSmrg * Examine enabled GL extensions to determine GL version.
202af69d88dSmrg */
203af69d88dSmrgstatic GLuint
204af69d88dSmrgcompute_version(const struct gl_extensions *extensions,
205af69d88dSmrg                const struct gl_constants *consts, gl_api api)
206af69d88dSmrg{
207af69d88dSmrg   GLuint major, minor, version;
208af69d88dSmrg
209af69d88dSmrg   const GLboolean ver_1_3 = (extensions->ARB_texture_border_clamp &&
210af69d88dSmrg                              extensions->ARB_texture_cube_map &&
211af69d88dSmrg                              extensions->ARB_texture_env_combine &&
212af69d88dSmrg                              extensions->ARB_texture_env_dot3);
213cdc920a0Smrg   const GLboolean ver_1_4 = (ver_1_3 &&
214af69d88dSmrg                              extensions->ARB_depth_texture &&
215af69d88dSmrg                              extensions->ARB_shadow &&
216af69d88dSmrg                              extensions->ARB_texture_env_crossbar &&
217af69d88dSmrg                              extensions->EXT_blend_color &&
218af69d88dSmrg                              extensions->EXT_blend_func_separate &&
219af69d88dSmrg                              extensions->EXT_blend_minmax &&
220af69d88dSmrg                              extensions->EXT_point_parameters);
221cdc920a0Smrg   const GLboolean ver_1_5 = (ver_1_4 &&
222af69d88dSmrg                              extensions->ARB_occlusion_query);
223cdc920a0Smrg   const GLboolean ver_2_0 = (ver_1_5 &&
224af69d88dSmrg                              extensions->ARB_point_sprite &&
225af69d88dSmrg                              extensions->ARB_vertex_shader &&
226af69d88dSmrg                              extensions->ARB_fragment_shader &&
227af69d88dSmrg                              extensions->ARB_texture_non_power_of_two &&
228af69d88dSmrg                              extensions->EXT_blend_equation_separate &&
229cdc920a0Smrg
230cdc920a0Smrg			      /* Technically, 2.0 requires the functionality
231cdc920a0Smrg			       * of the EXT version.  Enable 2.0 if either
232cdc920a0Smrg			       * extension is available, and assume that a
233cdc920a0Smrg			       * driver that only exposes the ATI extension
234cdc920a0Smrg			       * will fallback to software when necessary.
235cdc920a0Smrg			       */
236af69d88dSmrg			      (extensions->EXT_stencil_two_side
237af69d88dSmrg			       || extensions->ATI_separate_stencil));
238cdc920a0Smrg   const GLboolean ver_2_1 = (ver_2_0 &&
239af69d88dSmrg                              extensions->EXT_pixel_buffer_object &&
240af69d88dSmrg                              extensions->EXT_texture_sRGB);
2413464ebd5Sriastradh   const GLboolean ver_3_0 = (ver_2_1 &&
242af69d88dSmrg                              consts->GLSLVersion >= 130 &&
243af69d88dSmrg                              (consts->MaxSamples >= 4 || consts->FakeSWMSAA) &&
244af69d88dSmrg                              (api == API_OPENGL_CORE ||
245af69d88dSmrg                               extensions->ARB_color_buffer_float) &&
246af69d88dSmrg                              extensions->ARB_depth_buffer_float &&
247af69d88dSmrg                              extensions->ARB_half_float_vertex &&
248af69d88dSmrg                              extensions->ARB_map_buffer_range &&
249af69d88dSmrg                              extensions->ARB_shader_texture_lod &&
250af69d88dSmrg                              extensions->ARB_texture_float &&
251af69d88dSmrg                              extensions->ARB_texture_rg &&
252af69d88dSmrg                              extensions->ARB_texture_compression_rgtc &&
253af69d88dSmrg                              extensions->EXT_draw_buffers2 &&
254af69d88dSmrg                              extensions->ARB_framebuffer_object &&
255af69d88dSmrg                              extensions->EXT_framebuffer_sRGB &&
256af69d88dSmrg                              extensions->EXT_packed_float &&
257af69d88dSmrg                              extensions->EXT_texture_array &&
258af69d88dSmrg                              extensions->EXT_texture_shared_exponent &&
259af69d88dSmrg                              extensions->EXT_transform_feedback &&
260af69d88dSmrg                              extensions->NV_conditional_render);
2613464ebd5Sriastradh   const GLboolean ver_3_1 = (ver_3_0 &&
262af69d88dSmrg                              consts->GLSLVersion >= 140 &&
263af69d88dSmrg                              extensions->ARB_draw_instanced &&
264af69d88dSmrg                              extensions->ARB_texture_buffer_object &&
265af69d88dSmrg                              extensions->ARB_uniform_buffer_object &&
266af69d88dSmrg                              extensions->EXT_texture_snorm &&
267af69d88dSmrg                              extensions->NV_primitive_restart &&
268af69d88dSmrg                              extensions->NV_texture_rectangle &&
269af69d88dSmrg                              consts->Program[MESA_SHADER_VERTEX].MaxTextureImageUnits >= 16);
2703464ebd5Sriastradh   const GLboolean ver_3_2 = (ver_3_1 &&
271af69d88dSmrg                              consts->GLSLVersion >= 150 &&
272af69d88dSmrg                              extensions->ARB_depth_clamp &&
273af69d88dSmrg                              extensions->ARB_draw_elements_base_vertex &&
274af69d88dSmrg                              extensions->ARB_fragment_coord_conventions &&
275af69d88dSmrg                              extensions->EXT_provoking_vertex &&
276af69d88dSmrg                              extensions->ARB_seamless_cube_map &&
277af69d88dSmrg                              extensions->ARB_sync &&
278af69d88dSmrg                              extensions->ARB_texture_multisample &&
279af69d88dSmrg                              extensions->EXT_vertex_array_bgra);
2803464ebd5Sriastradh   const GLboolean ver_3_3 = (ver_3_2 &&
281af69d88dSmrg                              consts->GLSLVersion >= 330 &&
282af69d88dSmrg                              extensions->ARB_blend_func_extended &&
283af69d88dSmrg                              extensions->ARB_explicit_attrib_location &&
284af69d88dSmrg                              extensions->ARB_instanced_arrays &&
285af69d88dSmrg                              extensions->ARB_occlusion_query2 &&
286af69d88dSmrg                              extensions->ARB_shader_bit_encoding &&
287af69d88dSmrg                              extensions->ARB_texture_rgb10_a2ui &&
288af69d88dSmrg                              extensions->ARB_timer_query &&
289af69d88dSmrg                              extensions->ARB_vertex_type_2_10_10_10_rev &&
290af69d88dSmrg                              extensions->EXT_texture_swizzle);
291af69d88dSmrg                              /* ARB_sampler_objects is always enabled in mesa */
2923464ebd5Sriastradh
2933464ebd5Sriastradh   if (ver_3_3) {
2943464ebd5Sriastradh      major = 3;
2953464ebd5Sriastradh      minor = 3;
2963464ebd5Sriastradh   }
2973464ebd5Sriastradh   else if (ver_3_2) {
2983464ebd5Sriastradh      major = 3;
2993464ebd5Sriastradh      minor = 2;
3003464ebd5Sriastradh   }
3013464ebd5Sriastradh   else if (ver_3_1) {
3023464ebd5Sriastradh      major = 3;
3033464ebd5Sriastradh      minor = 1;
3043464ebd5Sriastradh   }
3053464ebd5Sriastradh   else if (ver_3_0) {
3063464ebd5Sriastradh      major = 3;
3073464ebd5Sriastradh      minor = 0;
3083464ebd5Sriastradh   }
3093464ebd5Sriastradh   else if (ver_2_1) {
3103464ebd5Sriastradh      major = 2;
3113464ebd5Sriastradh      minor = 1;
312cdc920a0Smrg   }
313cdc920a0Smrg   else if (ver_2_0) {
3143464ebd5Sriastradh      major = 2;
3153464ebd5Sriastradh      minor = 0;
316cdc920a0Smrg   }
317cdc920a0Smrg   else if (ver_1_5) {
3183464ebd5Sriastradh      major = 1;
3193464ebd5Sriastradh      minor = 5;
320cdc920a0Smrg   }
321cdc920a0Smrg   else if (ver_1_4) {
3223464ebd5Sriastradh      major = 1;
3233464ebd5Sriastradh      minor = 4;
324cdc920a0Smrg   }
325cdc920a0Smrg   else if (ver_1_3) {
3263464ebd5Sriastradh      major = 1;
3273464ebd5Sriastradh      minor = 3;
328cdc920a0Smrg   }
329cdc920a0Smrg   else {
3303464ebd5Sriastradh      major = 1;
3313464ebd5Sriastradh      minor = 2;
3323464ebd5Sriastradh   }
3333464ebd5Sriastradh
334af69d88dSmrg   version = major * 10 + minor;
335af69d88dSmrg
336af69d88dSmrg   if (api == API_OPENGL_CORE && version < 31)
337af69d88dSmrg      return 0;
338af69d88dSmrg
339af69d88dSmrg   return version;
340cdc920a0Smrg}
341cdc920a0Smrg
342af69d88dSmrgstatic GLuint
343af69d88dSmrgcompute_version_es1(const struct gl_extensions *extensions)
3443464ebd5Sriastradh{
3453464ebd5Sriastradh   /* OpenGL ES 1.0 is derived from OpenGL 1.3 */
346af69d88dSmrg   const GLboolean ver_1_0 = (extensions->ARB_texture_env_combine &&
347af69d88dSmrg                              extensions->ARB_texture_env_dot3);
3483464ebd5Sriastradh   /* OpenGL ES 1.1 is derived from OpenGL 1.5 */
3493464ebd5Sriastradh   const GLboolean ver_1_1 = (ver_1_0 &&
350af69d88dSmrg                              extensions->EXT_point_parameters);
3513464ebd5Sriastradh
3523464ebd5Sriastradh   if (ver_1_1) {
353af69d88dSmrg      return 11;
3543464ebd5Sriastradh   } else if (ver_1_0) {
355af69d88dSmrg      return 10;
3563464ebd5Sriastradh   } else {
357af69d88dSmrg      return 0;
3583464ebd5Sriastradh   }
3593464ebd5Sriastradh}
3603464ebd5Sriastradh
361af69d88dSmrgstatic GLuint
362af69d88dSmrgcompute_version_es2(const struct gl_extensions *extensions)
3633464ebd5Sriastradh{
3643464ebd5Sriastradh   /* OpenGL ES 2.0 is derived from OpenGL 2.0 */
365af69d88dSmrg   const GLboolean ver_2_0 = (extensions->ARB_texture_cube_map &&
366af69d88dSmrg                              extensions->EXT_blend_color &&
367af69d88dSmrg                              extensions->EXT_blend_func_separate &&
368af69d88dSmrg                              extensions->EXT_blend_minmax &&
369af69d88dSmrg                              extensions->ARB_vertex_shader &&
370af69d88dSmrg                              extensions->ARB_fragment_shader &&
371af69d88dSmrg                              extensions->ARB_texture_non_power_of_two &&
372af69d88dSmrg                              extensions->EXT_blend_equation_separate);
373af69d88dSmrg   /* FINISHME: This list isn't quite right. */
374af69d88dSmrg   const GLboolean ver_3_0 = (extensions->ARB_half_float_vertex &&
375af69d88dSmrg                              extensions->ARB_internalformat_query &&
376af69d88dSmrg                              extensions->ARB_map_buffer_range &&
377af69d88dSmrg                              extensions->ARB_shader_texture_lod &&
378af69d88dSmrg                              extensions->ARB_texture_float &&
379af69d88dSmrg                              extensions->ARB_texture_rg &&
380af69d88dSmrg                              extensions->ARB_texture_compression_rgtc &&
381af69d88dSmrg                              extensions->EXT_draw_buffers2 &&
382af69d88dSmrg                              /* extensions->ARB_framebuffer_object && */
383af69d88dSmrg                              extensions->EXT_framebuffer_sRGB &&
384af69d88dSmrg                              extensions->EXT_packed_float &&
385af69d88dSmrg                              extensions->EXT_texture_array &&
386af69d88dSmrg                              extensions->EXT_texture_shared_exponent &&
387af69d88dSmrg                              extensions->EXT_transform_feedback &&
388af69d88dSmrg                              extensions->NV_conditional_render &&
389af69d88dSmrg                              extensions->ARB_draw_instanced &&
390af69d88dSmrg                              extensions->ARB_uniform_buffer_object &&
391af69d88dSmrg                              extensions->EXT_texture_snorm &&
392af69d88dSmrg                              extensions->NV_primitive_restart &&
393af69d88dSmrg                              extensions->OES_depth_texture_cube_map);
394af69d88dSmrg   if (ver_3_0) {
395af69d88dSmrg      return 30;
396af69d88dSmrg   } else if (ver_2_0) {
397af69d88dSmrg      return 20;
3983464ebd5Sriastradh   } else {
399af69d88dSmrg      return 0;
4003464ebd5Sriastradh   }
401af69d88dSmrg}
4023464ebd5Sriastradh
403af69d88dSmrgGLuint
404af69d88dSmrg_mesa_get_version(const struct gl_extensions *extensions,
405af69d88dSmrg                  struct gl_constants *consts, gl_api api)
406af69d88dSmrg{
407af69d88dSmrg   switch (api) {
408af69d88dSmrg   case API_OPENGL_COMPAT:
409af69d88dSmrg      /* Disable GLSL 1.40 and later for legacy contexts.
410af69d88dSmrg       * This disallows creation of the GL 3.1 compatibility context. */
411af69d88dSmrg      if (consts->GLSLVersion > 130) {
412af69d88dSmrg         consts->GLSLVersion = 130;
413af69d88dSmrg      }
414af69d88dSmrg      /* fall through */
415af69d88dSmrg   case API_OPENGL_CORE:
416af69d88dSmrg      return compute_version(extensions, consts, api);
417af69d88dSmrg   case API_OPENGLES:
418af69d88dSmrg      return compute_version_es1(extensions);
419af69d88dSmrg   case API_OPENGLES2:
420af69d88dSmrg      return compute_version_es2(extensions);
4213464ebd5Sriastradh   }
422af69d88dSmrg   return 0;
4233464ebd5Sriastradh}
424cdc920a0Smrg
425cdc920a0Smrg/**
426af69d88dSmrg * Set the context's Version and VersionString fields.
4273464ebd5Sriastradh * This should only be called once as part of context initialization
4283464ebd5Sriastradh * or to perform version check for GLX_ARB_create_context_profile.
429cdc920a0Smrg */
430cdc920a0Smrgvoid
4313464ebd5Sriastradh_mesa_compute_version(struct gl_context *ctx)
432cdc920a0Smrg{
433af69d88dSmrg   if (ctx->Version)
4343464ebd5Sriastradh      return;
435cdc920a0Smrg
436af69d88dSmrg   ctx->Version = _mesa_get_version(&ctx->Extensions, &ctx->Const, ctx->API);
437af69d88dSmrg
4383464ebd5Sriastradh   switch (ctx->API) {
439af69d88dSmrg   case API_OPENGL_COMPAT:
440af69d88dSmrg   case API_OPENGL_CORE:
441af69d88dSmrg      create_version_string(ctx, "");
4423464ebd5Sriastradh      break;
443af69d88dSmrg
4443464ebd5Sriastradh   case API_OPENGLES:
445af69d88dSmrg      if (!ctx->Version) {
446af69d88dSmrg         _mesa_problem(ctx, "Incomplete OpenGL ES 1.0 support.");
447af69d88dSmrg         return;
448af69d88dSmrg      }
449af69d88dSmrg      create_version_string(ctx, "OpenGL ES-CM ");
4503464ebd5Sriastradh      break;
451af69d88dSmrg
4523464ebd5Sriastradh   case API_OPENGLES2:
453af69d88dSmrg      if (!ctx->Version) {
454af69d88dSmrg         _mesa_problem(ctx, "Incomplete OpenGL ES 2.0 support.");
455af69d88dSmrg         return;
456af69d88dSmrg      }
457af69d88dSmrg      create_version_string(ctx, "OpenGL ES ");
4583464ebd5Sriastradh      break;
459cdc920a0Smrg   }
460cdc920a0Smrg}
461