Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / mesa / main / version.c
1 /*
2  * Mesa 3-D graphics library
3  *
4  * Copyright (C) 2010  VMware, Inc.  All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23
24
25 #include "imports.h"
26 #include "mtypes.h"
27 #include "version.h"
28 #include "git_sha1.h"
29
30
31
32 /**
33  * Examine enabled GL extensions to determine GL version.
34  * Return major and minor version numbers.
35  */
36 static void
37 compute_version(struct gl_context *ctx)
38 {
39    GLuint major, minor;
40    static const int max = 100;
41
42    const GLboolean ver_1_3 = (ctx->Extensions.ARB_multisample &&
43                               ctx->Extensions.ARB_multitexture &&
44                               ctx->Extensions.ARB_texture_border_clamp &&
45                               ctx->Extensions.ARB_texture_compression &&
46                               ctx->Extensions.ARB_texture_cube_map &&
47                               ctx->Extensions.EXT_texture_env_add &&
48                               ctx->Extensions.ARB_texture_env_combine &&
49                               ctx->Extensions.ARB_texture_env_dot3);
50    const GLboolean ver_1_4 = (ver_1_3 &&
51                               ctx->Extensions.ARB_depth_texture &&
52                               ctx->Extensions.ARB_shadow &&
53                               ctx->Extensions.ARB_texture_env_crossbar &&
54                               ctx->Extensions.ARB_texture_mirrored_repeat &&
55                               ctx->Extensions.ARB_window_pos &&
56                               ctx->Extensions.EXT_blend_color &&
57                               ctx->Extensions.EXT_blend_func_separate &&
58                               ctx->Extensions.EXT_blend_minmax &&
59                               ctx->Extensions.EXT_blend_subtract &&
60                               ctx->Extensions.EXT_fog_coord &&
61                               ctx->Extensions.EXT_multi_draw_arrays &&
62                               ctx->Extensions.EXT_point_parameters &&
63                               ctx->Extensions.EXT_secondary_color &&
64                               ctx->Extensions.EXT_stencil_wrap &&
65                               ctx->Extensions.EXT_texture_lod_bias &&
66                               ctx->Extensions.SGIS_generate_mipmap);
67    const GLboolean ver_1_5 = (ver_1_4 &&
68                               ctx->Extensions.ARB_occlusion_query &&
69                               ctx->Extensions.ARB_vertex_buffer_object &&
70                               ctx->Extensions.EXT_shadow_funcs);
71    const GLboolean ver_2_0 = (ver_1_5 &&
72                               ctx->Extensions.ARB_draw_buffers &&
73                               ctx->Extensions.ARB_point_sprite &&
74                               ctx->Extensions.ARB_shader_objects &&
75                               ctx->Extensions.ARB_vertex_shader &&
76                               ctx->Extensions.ARB_fragment_shader &&
77                               ctx->Extensions.ARB_texture_non_power_of_two &&
78                               ctx->Extensions.EXT_blend_equation_separate &&
79
80                               /* Technically, 2.0 requires the functionality
81                                * of the EXT version.  Enable 2.0 if either
82                                * extension is available, and assume that a
83                                * driver that only exposes the ATI extension
84                                * will fallback to software when necessary.
85                                */
86                               (ctx->Extensions.EXT_stencil_two_side
87                                || ctx->Extensions.ATI_separate_stencil));
88    const GLboolean ver_2_1 = (ver_2_0 &&
89                               ctx->Const.GLSLVersion >= 120 &&
90                               ctx->Extensions.EXT_pixel_buffer_object &&
91                               ctx->Extensions.EXT_texture_sRGB);
92    const GLboolean ver_3_0 = (ver_2_1 &&
93                               ctx->Extensions.ARB_color_buffer_float &&
94                               ctx->Extensions.ARB_depth_buffer_float &&
95                               ctx->Extensions.ARB_half_float_pixel &&
96                               ctx->Extensions.ARB_map_buffer_range &&
97                               ctx->Extensions.ARB_texture_float &&
98                               ctx->Extensions.ARB_texture_rg &&
99                               ctx->Extensions.ARB_texture_compression_rgtc &&
100                               ctx->Extensions.APPLE_vertex_array_object &&
101                               ctx->Extensions.EXT_draw_buffers2 &&
102                               ctx->Extensions.EXT_framebuffer_blit &&
103                               ctx->Extensions.EXT_framebuffer_multisample &&
104                               ctx->Extensions.EXT_framebuffer_object &&
105                               ctx->Extensions.EXT_framebuffer_sRGB &&
106                               ctx->Extensions.EXT_packed_depth_stencil &&
107                               ctx->Extensions.EXT_packed_float &&
108                               ctx->Extensions.EXT_texture_array &&
109                               ctx->Extensions.EXT_texture_integer &&
110                               ctx->Extensions.EXT_texture_shared_exponent &&
111                               ctx->Extensions.EXT_transform_feedback &&
112                               ctx->Extensions.NV_conditional_render);
113    const GLboolean ver_3_1 = (ver_3_0 &&
114                               ctx->Extensions.ARB_copy_buffer &&
115                               ctx->Extensions.ARB_draw_instanced &&
116                               ctx->Extensions.ARB_texture_buffer_object &&
117                               ctx->Extensions.ARB_uniform_buffer_object &&
118                               ctx->Extensions.EXT_texture_snorm &&
119                               ctx->Extensions.NV_primitive_restart &&
120                               ctx->Extensions.NV_texture_rectangle &&
121                               ctx->Const.MaxVertexTextureImageUnits >= 16);
122    const GLboolean ver_3_2 = (ver_3_1 &&
123                               ctx->Extensions.ARB_depth_clamp &&
124                               ctx->Extensions.ARB_draw_elements_base_vertex &&
125                               ctx->Extensions.ARB_fragment_coord_conventions &&
126                               ctx->Extensions.ARB_geometry_shader4 &&
127                               ctx->Extensions.EXT_provoking_vertex &&
128                               ctx->Extensions.ARB_seamless_cube_map &&
129                               ctx->Extensions.ARB_sync &&
130                               ctx->Extensions.ARB_texture_multisample &&
131                               ctx->Extensions.EXT_vertex_array_bgra);
132    const GLboolean ver_3_3 = (ver_3_2 &&
133                               ctx->Extensions.ARB_blend_func_extended &&
134                               ctx->Extensions.ARB_explicit_attrib_location &&
135                               ctx->Extensions.ARB_instanced_arrays &&
136                               ctx->Extensions.ARB_occlusion_query2 &&
137                               ctx->Extensions.ARB_sampler_objects &&
138                               ctx->Extensions.ARB_texture_rgb10_a2ui &&
139                               ctx->Extensions.ARB_timer_query &&
140                               ctx->Extensions.ARB_vertex_type_2_10_10_10_rev &&
141                               ctx->Extensions.EXT_texture_swizzle);
142
143    if (ver_3_3) {
144       major = 3;
145       minor = 3;
146    }
147    else if (ver_3_2) {
148       major = 3;
149       minor = 2;
150    }
151    else if (ver_3_1) {
152       major = 3;
153       minor = 1;
154    }
155    else if (ver_3_0) {
156       major = 3;
157       minor = 0;
158    }
159    else if (ver_2_1) {
160       major = 2;
161       minor = 1;
162    }
163    else if (ver_2_0) {
164       major = 2;
165       minor = 0;
166    }
167    else if (ver_1_5) {
168       major = 1;
169       minor = 5;
170    }
171    else if (ver_1_4) {
172       major = 1;
173       minor = 4;
174    }
175    else if (ver_1_3) {
176       major = 1;
177       minor = 3;
178    }
179    else {
180       major = 1;
181       minor = 2;
182    }
183
184    ctx->VersionMajor = major;
185    ctx->VersionMinor = minor;
186    ctx->VersionString = (char *) malloc(max);
187    if (ctx->VersionString) {
188       _mesa_snprintf(ctx->VersionString, max,
189                      "%u.%u Mesa " MESA_VERSION_STRING
190 #ifdef MESA_GIT_SHA1
191                      " (" MESA_GIT_SHA1 ")"
192 #endif
193                      ,
194                      ctx->VersionMajor, ctx->VersionMinor);
195    }
196 }
197
198 static void
199 compute_version_es1(struct gl_context *ctx)
200 {
201    static const int max = 100;
202
203    /* OpenGL ES 1.0 is derived from OpenGL 1.3 */
204    const GLboolean ver_1_0 = (ctx->Extensions.ARB_multisample &&
205                               ctx->Extensions.ARB_multitexture &&
206                               ctx->Extensions.ARB_texture_compression &&
207                               ctx->Extensions.EXT_texture_env_add &&
208                               ctx->Extensions.ARB_texture_env_combine &&
209                               ctx->Extensions.ARB_texture_env_dot3);
210    /* OpenGL ES 1.1 is derived from OpenGL 1.5 */
211    const GLboolean ver_1_1 = (ver_1_0 &&
212                               ctx->Extensions.EXT_point_parameters &&
213                               ctx->Extensions.SGIS_generate_mipmap &&
214                               ctx->Extensions.ARB_vertex_buffer_object);
215
216    if (ver_1_1) {
217       ctx->VersionMajor = 1;
218       ctx->VersionMinor = 1;
219    } else if (ver_1_0) {
220       ctx->VersionMajor = 1;
221       ctx->VersionMinor = 0;
222    } else {
223       _mesa_problem(ctx, "Incomplete OpenGL ES 1.0 support.");
224    }
225
226    ctx->VersionString = (char *) malloc(max);
227    if (ctx->VersionString) {
228       _mesa_snprintf(ctx->VersionString, max,
229                      "OpenGL ES-CM 1.%d Mesa " MESA_VERSION_STRING,
230                      ctx->VersionMinor);
231    }
232 }
233
234 static void
235 compute_version_es2(struct gl_context *ctx)
236 {
237    static const int max = 100;
238
239    /* OpenGL ES 2.0 is derived from OpenGL 2.0 */
240    const GLboolean ver_2_0 = (ctx->Extensions.ARB_multisample &&
241                               ctx->Extensions.ARB_multitexture &&
242                               ctx->Extensions.ARB_texture_compression &&
243                               ctx->Extensions.ARB_texture_cube_map &&
244                               ctx->Extensions.ARB_texture_mirrored_repeat &&
245                               ctx->Extensions.EXT_blend_color &&
246                               ctx->Extensions.EXT_blend_func_separate &&
247                               ctx->Extensions.EXT_blend_minmax &&
248                               ctx->Extensions.EXT_blend_subtract &&
249                               ctx->Extensions.EXT_stencil_wrap &&
250                               ctx->Extensions.ARB_vertex_buffer_object &&
251                               ctx->Extensions.ARB_shader_objects &&
252                               ctx->Extensions.ARB_vertex_shader &&
253                               ctx->Extensions.ARB_fragment_shader &&
254                               ctx->Extensions.ARB_texture_non_power_of_two &&
255                               ctx->Extensions.EXT_blend_equation_separate);
256    if (ver_2_0) {
257       ctx->VersionMajor = 2;
258       ctx->VersionMinor = 0;
259    } else {
260       _mesa_problem(ctx, "Incomplete OpenGL ES 2.0 support.");
261    }
262
263    ctx->VersionString = (char *) malloc(max);
264    if (ctx->VersionString) {
265       _mesa_snprintf(ctx->VersionString, max,
266                      "OpenGL ES 2.0 Mesa " MESA_VERSION_STRING);
267    }
268 }
269
270 /**
271  * Set the context's VersionMajor, VersionMinor, VersionString fields.
272  * This should only be called once as part of context initialization
273  * or to perform version check for GLX_ARB_create_context_profile.
274  */
275 void
276 _mesa_compute_version(struct gl_context *ctx)
277 {
278    if (ctx->VersionMajor)
279       return;
280
281    switch (ctx->API) {
282    case API_OPENGL:
283       compute_version(ctx);
284       break;
285    case API_OPENGLES:
286       compute_version_es1(ctx);
287       break;
288    case API_OPENGLES2:
289       compute_version_es2(ctx);
290       break;
291    }
292
293 }