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