OSDN Git Service

20e7a014d12dd224b609f7fce49c02f18fe227f4
[android-x86/external-mesa.git] / src / mesa / main / getstring.c
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 "enums.h"
31 #include "extensions.h"
32 #include "mfeatures.h"
33 #include "mtypes.h"
34
35
36 /**
37  * Return the string for a glGetString(GL_SHADING_LANGUAGE_VERSION) query.
38  */
39 static const GLubyte *
40 shading_language_version(struct gl_context *ctx)
41 {
42    switch (ctx->API) {
43    case API_OPENGL_COMPAT:
44    case API_OPENGL_CORE:
45       if (!ctx->Extensions.ARB_shader_objects) {
46          _mesa_error(ctx, GL_INVALID_ENUM, "glGetString");
47          return (const GLubyte *) 0;
48       }
49
50       switch (ctx->Const.GLSLVersion) {
51       case 110:
52          return (const GLubyte *) "1.10";
53       case 120:
54          return (const GLubyte *) "1.20";
55       case 130:
56          return (const GLubyte *) "1.30";
57       case 140:
58          return (const GLubyte *) "1.40";
59       case 150:
60          return (const GLubyte *) "1.50";
61       case 330:
62          return (const GLubyte *) "3.30";
63       case 400:
64          return (const GLubyte *) "4.00";
65       case 410:
66          return (const GLubyte *) "4.10";
67       case 420:
68          return (const GLubyte *) "4.20";
69       default:
70          _mesa_problem(ctx,
71                        "Invalid GLSL version in shading_language_version()");
72          return (const GLubyte *) 0;
73       }
74       break;
75
76    case API_OPENGLES2:
77       return (const GLubyte *) "OpenGL ES GLSL ES 1.0.16";
78
79    case API_OPENGLES:
80       /* fall-through */
81
82    default:
83       _mesa_problem(ctx, "Unexpected API value in shading_language_version()");
84       return (const GLubyte *) 0;
85    }
86 }
87
88
89 /**
90  * Query string-valued state.  The return value should _not_ be freed by
91  * the caller.
92  *
93  * \param name  the state variable to query.
94  *
95  * \sa glGetString().
96  *
97  * Tries to get the string from dd_function_table::GetString, otherwise returns
98  * the hardcoded strings.
99  */
100 const GLubyte * GLAPIENTRY
101 _mesa_GetString( GLenum name )
102 {
103    GET_CURRENT_CONTEXT(ctx);
104    static const char *vendor = "Brian Paul";
105    static const char *renderer = "Mesa";
106
107    if (!ctx)
108       return NULL;
109
110    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, NULL);
111
112    /* this is a required driver function */
113    assert(ctx->Driver.GetString);
114    {
115       /* Give the driver the chance to handle this query */
116       const GLubyte *str = (*ctx->Driver.GetString)(ctx, name);
117       if (str)
118          return str;
119    }
120
121    switch (name) {
122       case GL_VENDOR:
123          return (const GLubyte *) vendor;
124       case GL_RENDERER:
125          return (const GLubyte *) renderer;
126       case GL_VERSION:
127          return (const GLubyte *) ctx->VersionString;
128       case GL_EXTENSIONS:
129          if (ctx->API == API_OPENGL_CORE) {
130             _mesa_error(ctx, GL_INVALID_ENUM, "glGetString(GL_EXTENSIONS)");
131             return (const GLubyte *) 0;
132          }
133          return (const GLubyte *) ctx->Extensions.String;
134       case GL_SHADING_LANGUAGE_VERSION:
135          if (ctx->API == API_OPENGLES)
136             break;
137          return shading_language_version(ctx);
138       case GL_PROGRAM_ERROR_STRING_NV:
139          if (ctx->API == API_OPENGL_COMPAT &&
140              (ctx->Extensions.ARB_fragment_program ||
141               ctx->Extensions.ARB_vertex_program)) {
142             return (const GLubyte *) ctx->Program.ErrorString;
143          }
144          break;
145       default:
146          break;
147    }
148
149    _mesa_error( ctx, GL_INVALID_ENUM, "glGetString" );
150    return (const GLubyte *) 0;
151 }
152
153
154 /**
155  * GL3
156  */
157 const GLubyte * GLAPIENTRY
158 _mesa_GetStringi(GLenum name, GLuint index)
159 {
160    GET_CURRENT_CONTEXT(ctx);
161
162    if (!ctx)
163       return NULL;
164
165    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, NULL);
166
167    switch (name) {
168    case GL_EXTENSIONS:
169       if (index >= _mesa_get_extension_count(ctx)) {
170          _mesa_error(ctx, GL_INVALID_VALUE, "glGetStringi(index=%u)", index);
171          return (const GLubyte *) 0;
172       }
173       return _mesa_get_enabled_extension(ctx, index);
174    default:
175       _mesa_error( ctx, GL_INVALID_ENUM, "glGetString" );
176       return (const GLubyte *) 0;
177    }
178 }
179
180
181
182 /**
183  * Return pointer-valued state, such as a vertex array pointer.
184  *
185  * \param pname  names state to be queried
186  * \param params  returns the pointer value
187  *
188  * \sa glGetPointerv().
189  *
190  * Tries to get the specified pointer via dd_function_table::GetPointerv,
191  * otherwise gets the specified pointer from the current context.
192  */
193 void GLAPIENTRY
194 _mesa_GetPointerv( GLenum pname, GLvoid **params )
195 {
196    GET_CURRENT_CONTEXT(ctx);
197    const GLuint clientUnit = ctx->Array.ActiveTexture;
198    ASSERT_OUTSIDE_BEGIN_END(ctx);
199
200    if (!params)
201       return;
202
203    if (MESA_VERBOSE & VERBOSE_API)
204       _mesa_debug(ctx, "glGetPointerv %s\n", _mesa_lookup_enum_by_nr(pname));
205
206    switch (pname) {
207       case GL_VERTEX_ARRAY_POINTER:
208          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
209             goto invalid_pname;
210          *params = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_POS].Ptr;
211          break;
212       case GL_NORMAL_ARRAY_POINTER:
213          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
214             goto invalid_pname;
215          *params = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Ptr;
216          break;
217       case GL_COLOR_ARRAY_POINTER:
218          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
219             goto invalid_pname;
220          *params = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Ptr;
221          break;
222       case GL_SECONDARY_COLOR_ARRAY_POINTER_EXT:
223          if (ctx->API != API_OPENGL_COMPAT)
224             goto invalid_pname;
225          *params = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_COLOR1].Ptr;
226          break;
227       case GL_FOG_COORDINATE_ARRAY_POINTER_EXT:
228          if (ctx->API != API_OPENGL_COMPAT)
229             goto invalid_pname;
230          *params = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_FOG].Ptr;
231          break;
232       case GL_INDEX_ARRAY_POINTER:
233          if (ctx->API != API_OPENGL_COMPAT)
234             goto invalid_pname;
235          *params = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Ptr;
236          break;
237       case GL_TEXTURE_COORD_ARRAY_POINTER:
238          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
239             goto invalid_pname;
240          *params = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_TEX(clientUnit)].Ptr;
241          break;
242       case GL_EDGE_FLAG_ARRAY_POINTER:
243          if (ctx->API != API_OPENGL_COMPAT)
244             goto invalid_pname;
245          *params = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Ptr;
246          break;
247       case GL_FEEDBACK_BUFFER_POINTER:
248          if (ctx->API != API_OPENGL_COMPAT)
249             goto invalid_pname;
250          *params = ctx->Feedback.Buffer;
251          break;
252       case GL_SELECTION_BUFFER_POINTER:
253          if (ctx->API != API_OPENGL_COMPAT)
254             goto invalid_pname;
255          *params = ctx->Select.Buffer;
256          break;
257       case GL_POINT_SIZE_ARRAY_POINTER_OES:
258          if (ctx->API != API_OPENGLES)
259             goto invalid_pname;
260          *params = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_POINT_SIZE].Ptr;
261          break;
262       case GL_DEBUG_CALLBACK_FUNCTION_ARB:
263          if (!_mesa_is_desktop_gl(ctx))
264             goto invalid_pname;
265          *params = (GLvoid *) ctx->Debug.Callback;
266          break;
267       case GL_DEBUG_CALLBACK_USER_PARAM_ARB:
268          if (!_mesa_is_desktop_gl(ctx))
269             goto invalid_pname;
270          *params = ctx->Debug.CallbackData;
271          break;
272       default:
273          goto invalid_pname;
274    }
275
276    return;
277
278 invalid_pname:
279    _mesa_error( ctx, GL_INVALID_ENUM, "glGetPointerv" );
280    return;
281 }
282
283
284 /**
285  * Returns the current GL error code, or GL_NO_ERROR.
286  * \return current error code
287  *
288  * Returns __struct gl_contextRec::ErrorValue.
289  */
290 GLenum GLAPIENTRY
291 _mesa_GetError( void )
292 {
293    GET_CURRENT_CONTEXT(ctx);
294    GLenum e = ctx->ErrorValue;
295    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
296
297    if (MESA_VERBOSE & VERBOSE_API)
298       _mesa_debug(ctx, "glGetError <-- %s\n", _mesa_lookup_enum_by_nr(e));
299
300    ctx->ErrorValue = (GLenum) GL_NO_ERROR;
301    ctx->ErrorDebugCount = 0;
302    return e;
303 }
304
305 /**
306  * Returns an error code specified by GL_ARB_robustness, or GL_NO_ERROR.
307  * \return current context status
308  */
309 GLenum GLAPIENTRY
310 _mesa_GetGraphicsResetStatusARB( void )
311 {
312    GET_CURRENT_CONTEXT(ctx);
313    GLenum status = ctx->ResetStatus;
314
315    if (MESA_VERBOSE & VERBOSE_API)
316       _mesa_debug(ctx, "glGetGraphicsResetStatusARB"
317                        "(always returns GL_NO_ERROR)\n");
318
319    return status;
320 }