getstring.c revision c3d61d378574878deedb44d84f506ca23e66c6ca
1/* 2 * Mesa 3-D graphics library 3 * Version: 7.1 4 * 5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included 15 * in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 26 27#include "glheader.h" 28#include "context.h" 29#include "get.h" 30#include "version.h" 31#include "enums.h" 32#include "extensions.h" 33 34 35/** 36 * Examine enabled GL extensions to determine GL version. 37 * \return version string 38 */ 39static const char * 40compute_version(const GLcontext *ctx) 41{ 42 static const char *version_1_2 = "1.2 Mesa " MESA_VERSION_STRING; 43 static const char *version_1_3 = "1.3 Mesa " MESA_VERSION_STRING; 44 static const char *version_1_4 = "1.4 Mesa " MESA_VERSION_STRING; 45 static const char *version_1_5 = "1.5 Mesa " MESA_VERSION_STRING; 46 static const char *version_2_0 = "2.0 Mesa " MESA_VERSION_STRING; 47 static const char *version_2_1 = "2.1 Mesa " MESA_VERSION_STRING; 48 49 const GLboolean ver_1_3 = (ctx->Extensions.ARB_multisample && 50 ctx->Extensions.ARB_multitexture && 51 ctx->Extensions.ARB_texture_border_clamp && 52 ctx->Extensions.ARB_texture_compression && 53 ctx->Extensions.ARB_texture_cube_map && 54 ctx->Extensions.EXT_texture_env_add && 55 ctx->Extensions.ARB_texture_env_combine && 56 ctx->Extensions.ARB_texture_env_dot3); 57 const GLboolean ver_1_4 = (ver_1_3 && 58 ctx->Extensions.ARB_depth_texture && 59 ctx->Extensions.ARB_shadow && 60 ctx->Extensions.ARB_texture_env_crossbar && 61 ctx->Extensions.ARB_texture_mirrored_repeat && 62 ctx->Extensions.ARB_window_pos && 63 ctx->Extensions.EXT_blend_color && 64 ctx->Extensions.EXT_blend_func_separate && 65 ctx->Extensions.EXT_blend_minmax && 66 ctx->Extensions.EXT_blend_subtract && 67 ctx->Extensions.EXT_fog_coord && 68 ctx->Extensions.EXT_multi_draw_arrays && 69 ctx->Extensions.EXT_point_parameters && 70 ctx->Extensions.EXT_secondary_color && 71 ctx->Extensions.EXT_stencil_wrap && 72 ctx->Extensions.EXT_texture_lod_bias && 73 ctx->Extensions.SGIS_generate_mipmap); 74 const GLboolean ver_1_5 = (ver_1_4 && 75 ctx->Extensions.ARB_occlusion_query && 76 ctx->Extensions.ARB_vertex_buffer_object && 77 ctx->Extensions.EXT_shadow_funcs); 78 const GLboolean ver_2_0 = (ver_1_5 && 79 ctx->Extensions.ARB_draw_buffers && 80 ctx->Extensions.ARB_point_sprite && 81 ctx->Extensions.ARB_shader_objects && 82 ctx->Extensions.ARB_vertex_shader && 83 ctx->Extensions.ARB_fragment_shader && 84 ctx->Extensions.ARB_texture_non_power_of_two && 85 ctx->Extensions.EXT_blend_equation_separate && 86 87 /* Technically, 2.0 requires the functionality 88 * of the EXT version. Enable 2.0 if either 89 * extension is available, and assume that a 90 * driver that only exposes the ATI extension 91 * will fallback to software when necessary. 92 */ 93 (ctx->Extensions.EXT_stencil_two_side 94 || ctx->Extensions.ATI_separate_stencil)); 95 const GLboolean ver_2_1 = (ver_2_0 && 96 ctx->Extensions.ARB_shading_language_120 && 97 ctx->Extensions.EXT_pixel_buffer_object && 98 ctx->Extensions.EXT_texture_sRGB); 99 if (ver_2_1) 100 return version_2_1; 101 if (ver_2_0) 102 return version_2_0; 103 if (ver_1_5) 104 return version_1_5; 105 if (ver_1_4) 106 return version_1_4; 107 if (ver_1_3) 108 return version_1_3; 109 return version_1_2; 110} 111 112 113 114/** 115 * Query string-valued state. The return value should _not_ be freed by 116 * the caller. 117 * 118 * \param name the state variable to query. 119 * 120 * \sa glGetString(). 121 * 122 * Tries to get the string from dd_function_table::GetString, otherwise returns 123 * the hardcoded strings. 124 */ 125const GLubyte * GLAPIENTRY 126_mesa_GetString( GLenum name ) 127{ 128 GET_CURRENT_CONTEXT(ctx); 129 static const char *vendor = "Brian Paul"; 130 static const char *renderer = "Mesa"; 131 132 if (!ctx) 133 return NULL; 134 135 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, NULL); 136 137 /* this is a required driver function */ 138 assert(ctx->Driver.GetString); 139 { 140 /* Give the driver the chance to handle this query */ 141 const GLubyte *str = (*ctx->Driver.GetString)(ctx, name); 142 if (str) 143 return str; 144 } 145 146 switch (name) { 147 case GL_VENDOR: 148 return (const GLubyte *) vendor; 149 case GL_RENDERER: 150 return (const GLubyte *) renderer; 151 case GL_VERSION: 152 return (const GLubyte *) compute_version(ctx); 153 case GL_EXTENSIONS: 154 if (!ctx->Extensions.String) 155 ctx->Extensions.String = _mesa_make_extension_string(ctx); 156 return (const GLubyte *) ctx->Extensions.String; 157#if FEATURE_ARB_shading_language_100 158 case GL_SHADING_LANGUAGE_VERSION_ARB: 159 if (ctx->Extensions.ARB_shading_language_120) 160 return (const GLubyte *) "1.20"; 161 else if (ctx->Extensions.ARB_shading_language_100) 162 return (const GLubyte *) "1.10"; 163 goto error; 164#endif 165#if FEATURE_NV_fragment_program || FEATURE_ARB_fragment_program || \ 166 FEATURE_NV_vertex_program || FEATURE_ARB_vertex_program 167 case GL_PROGRAM_ERROR_STRING_NV: 168 if (ctx->Extensions.NV_fragment_program || 169 ctx->Extensions.ARB_fragment_program || 170 ctx->Extensions.NV_vertex_program || 171 ctx->Extensions.ARB_vertex_program) { 172 return (const GLubyte *) ctx->Program.ErrorString; 173 } 174 /* FALL-THROUGH */ 175#endif 176#if FEATURE_ARB_shading_language_100 177 error: 178#endif 179 default: 180 _mesa_error( ctx, GL_INVALID_ENUM, "glGetString" ); 181 return (const GLubyte *) 0; 182 } 183} 184 185 186/** 187 * Return pointer-valued state, such as a vertex array pointer. 188 * 189 * \param pname names state to be queried 190 * \param params returns the pointer value 191 * 192 * \sa glGetPointerv(). 193 * 194 * Tries to get the specified pointer via dd_function_table::GetPointerv, 195 * otherwise gets the specified pointer from the current context. 196 */ 197void GLAPIENTRY 198_mesa_GetPointerv( GLenum pname, GLvoid **params ) 199{ 200 GET_CURRENT_CONTEXT(ctx); 201 const GLuint clientUnit = ctx->Array.ActiveTexture; 202 ASSERT_OUTSIDE_BEGIN_END(ctx); 203 204 if (!params) 205 return; 206 207 if (MESA_VERBOSE & VERBOSE_API) 208 _mesa_debug(ctx, "glGetPointerv %s\n", _mesa_lookup_enum_by_nr(pname)); 209 210 if (ctx->Driver.GetPointerv 211 && (*ctx->Driver.GetPointerv)(ctx, pname, params)) 212 return; 213 214 switch (pname) { 215 case GL_VERTEX_ARRAY_POINTER: 216 *params = (GLvoid *) ctx->Array.ArrayObj->Vertex.Ptr; 217 break; 218 case GL_NORMAL_ARRAY_POINTER: 219 *params = (GLvoid *) ctx->Array.ArrayObj->Normal.Ptr; 220 break; 221 case GL_COLOR_ARRAY_POINTER: 222 *params = (GLvoid *) ctx->Array.ArrayObj->Color.Ptr; 223 break; 224 case GL_SECONDARY_COLOR_ARRAY_POINTER_EXT: 225 *params = (GLvoid *) ctx->Array.ArrayObj->SecondaryColor.Ptr; 226 break; 227 case GL_FOG_COORDINATE_ARRAY_POINTER_EXT: 228 *params = (GLvoid *) ctx->Array.ArrayObj->FogCoord.Ptr; 229 break; 230 case GL_INDEX_ARRAY_POINTER: 231 *params = (GLvoid *) ctx->Array.ArrayObj->Index.Ptr; 232 break; 233 case GL_TEXTURE_COORD_ARRAY_POINTER: 234 *params = (GLvoid *) ctx->Array.ArrayObj->TexCoord[clientUnit].Ptr; 235 break; 236 case GL_EDGE_FLAG_ARRAY_POINTER: 237 *params = (GLvoid *) ctx->Array.ArrayObj->EdgeFlag.Ptr; 238 break; 239 case GL_FEEDBACK_BUFFER_POINTER: 240 *params = ctx->Feedback.Buffer; 241 break; 242 case GL_SELECTION_BUFFER_POINTER: 243 *params = ctx->Select.Buffer; 244 break; 245#if FEATURE_point_size_array 246 case GL_POINT_SIZE_ARRAY_POINTER_OES: 247 *params = (GLvoid *) ctx->Array.ArrayObj->PointSize.Ptr; 248 break; 249#endif 250 default: 251 _mesa_error( ctx, GL_INVALID_ENUM, "glGetPointerv" ); 252 return; 253 } 254} 255 256 257/** 258 * Returns the current GL error code, or GL_NO_ERROR. 259 * \return current error code 260 * 261 * Returns __GLcontextRec::ErrorValue. 262 */ 263GLenum GLAPIENTRY 264_mesa_GetError( void ) 265{ 266 GET_CURRENT_CONTEXT(ctx); 267 GLenum e = ctx->ErrorValue; 268 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0); 269 270 if (MESA_VERBOSE & VERBOSE_API) 271 _mesa_debug(ctx, "glGetError <-- %s\n", _mesa_lookup_enum_by_nr(e)); 272 273 ctx->ErrorValue = (GLenum) GL_NO_ERROR; 274 ctx->ErrorDebugCount = 0; 275 return e; 276} 277