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