1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Mesa 3-D graphics library
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
8*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
9*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
11*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
12*61046927SAndroid Build Coastguard Worker *
13*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
14*61046927SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
15*61046927SAndroid Build Coastguard Worker *
16*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20*61046927SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21*61046927SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22*61046927SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
23*61046927SAndroid Build Coastguard Worker */
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
27*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
28*61046927SAndroid Build Coastguard Worker #include "context.h"
29*61046927SAndroid Build Coastguard Worker #include "debug_output.h"
30*61046927SAndroid Build Coastguard Worker #include "get.h"
31*61046927SAndroid Build Coastguard Worker #include "enums.h"
32*61046927SAndroid Build Coastguard Worker #include "extensions.h"
33*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
34*61046927SAndroid Build Coastguard Worker #include "macros.h"
35*61046927SAndroid Build Coastguard Worker #include "version.h"
36*61046927SAndroid Build Coastguard Worker #include "spirv_extensions.h"
37*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker #include "pipe/p_context.h"
40*61046927SAndroid Build Coastguard Worker #include "pipe/p_screen.h"
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker /**
43*61046927SAndroid Build Coastguard Worker * Return the string for a glGetString(GL_SHADING_LANGUAGE_VERSION) query.
44*61046927SAndroid Build Coastguard Worker */
45*61046927SAndroid Build Coastguard Worker static const GLubyte *
shading_language_version(struct gl_context * ctx)46*61046927SAndroid Build Coastguard Worker shading_language_version(struct gl_context *ctx)
47*61046927SAndroid Build Coastguard Worker {
48*61046927SAndroid Build Coastguard Worker switch (ctx->API) {
49*61046927SAndroid Build Coastguard Worker case API_OPENGL_COMPAT:
50*61046927SAndroid Build Coastguard Worker case API_OPENGL_CORE:
51*61046927SAndroid Build Coastguard Worker switch (ctx->Const.GLSLVersion) {
52*61046927SAndroid Build Coastguard Worker case 120:
53*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "1.20";
54*61046927SAndroid Build Coastguard Worker case 130:
55*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "1.30";
56*61046927SAndroid Build Coastguard Worker case 140:
57*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "1.40";
58*61046927SAndroid Build Coastguard Worker case 150:
59*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "1.50";
60*61046927SAndroid Build Coastguard Worker case 330:
61*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "3.30";
62*61046927SAndroid Build Coastguard Worker case 400:
63*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "4.00";
64*61046927SAndroid Build Coastguard Worker case 410:
65*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "4.10";
66*61046927SAndroid Build Coastguard Worker case 420:
67*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "4.20";
68*61046927SAndroid Build Coastguard Worker case 430:
69*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "4.30";
70*61046927SAndroid Build Coastguard Worker case 440:
71*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "4.40";
72*61046927SAndroid Build Coastguard Worker case 450:
73*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "4.50";
74*61046927SAndroid Build Coastguard Worker case 460:
75*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "4.60";
76*61046927SAndroid Build Coastguard Worker default:
77*61046927SAndroid Build Coastguard Worker _mesa_problem(ctx,
78*61046927SAndroid Build Coastguard Worker "Invalid GLSL version in shading_language_version()");
79*61046927SAndroid Build Coastguard Worker return (const GLubyte *) 0;
80*61046927SAndroid Build Coastguard Worker }
81*61046927SAndroid Build Coastguard Worker break;
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Worker case API_OPENGLES2:
84*61046927SAndroid Build Coastguard Worker switch (ctx->Version) {
85*61046927SAndroid Build Coastguard Worker case 20:
86*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "OpenGL ES GLSL ES 1.0.16";
87*61046927SAndroid Build Coastguard Worker case 30:
88*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "OpenGL ES GLSL ES 3.00";
89*61046927SAndroid Build Coastguard Worker case 31:
90*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "OpenGL ES GLSL ES 3.10";
91*61046927SAndroid Build Coastguard Worker case 32:
92*61046927SAndroid Build Coastguard Worker return (const GLubyte *) "OpenGL ES GLSL ES 3.20";
93*61046927SAndroid Build Coastguard Worker default:
94*61046927SAndroid Build Coastguard Worker _mesa_problem(ctx,
95*61046927SAndroid Build Coastguard Worker "Invalid OpenGL ES version in shading_language_version()");
96*61046927SAndroid Build Coastguard Worker return (const GLubyte *) 0;
97*61046927SAndroid Build Coastguard Worker }
98*61046927SAndroid Build Coastguard Worker case API_OPENGLES:
99*61046927SAndroid Build Coastguard Worker FALLTHROUGH;
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker default:
102*61046927SAndroid Build Coastguard Worker _mesa_problem(ctx, "Unexpected API value in shading_language_version()");
103*61046927SAndroid Build Coastguard Worker return (const GLubyte *) 0;
104*61046927SAndroid Build Coastguard Worker }
105*61046927SAndroid Build Coastguard Worker }
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Worker
108*61046927SAndroid Build Coastguard Worker /**
109*61046927SAndroid Build Coastguard Worker * Query string-valued state. The return value should _not_ be freed by
110*61046927SAndroid Build Coastguard Worker * the caller.
111*61046927SAndroid Build Coastguard Worker *
112*61046927SAndroid Build Coastguard Worker * \param name the state variable to query.
113*61046927SAndroid Build Coastguard Worker *
114*61046927SAndroid Build Coastguard Worker * \sa glGetString().
115*61046927SAndroid Build Coastguard Worker *
116*61046927SAndroid Build Coastguard Worker * Tries to get the string from dd_function_table::GetString, otherwise returns
117*61046927SAndroid Build Coastguard Worker * the hardcoded strings.
118*61046927SAndroid Build Coastguard Worker */
119*61046927SAndroid Build Coastguard Worker const GLubyte * GLAPIENTRY
_mesa_GetString(GLenum name)120*61046927SAndroid Build Coastguard Worker _mesa_GetString( GLenum name )
121*61046927SAndroid Build Coastguard Worker {
122*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
123*61046927SAndroid Build Coastguard Worker static const char *vendor = "Brian Paul";
124*61046927SAndroid Build Coastguard Worker static const char *renderer = "Mesa";
125*61046927SAndroid Build Coastguard Worker
126*61046927SAndroid Build Coastguard Worker if (!ctx)
127*61046927SAndroid Build Coastguard Worker return NULL;
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard Worker ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, NULL);
130*61046927SAndroid Build Coastguard Worker
131*61046927SAndroid Build Coastguard Worker if (ctx->Const.VendorOverride && name == GL_VENDOR) {
132*61046927SAndroid Build Coastguard Worker return (const GLubyte *) ctx->Const.VendorOverride;
133*61046927SAndroid Build Coastguard Worker }
134*61046927SAndroid Build Coastguard Worker
135*61046927SAndroid Build Coastguard Worker if (ctx->Const.RendererOverride && name == GL_RENDERER) {
136*61046927SAndroid Build Coastguard Worker return (const GLubyte *) ctx->Const.RendererOverride;
137*61046927SAndroid Build Coastguard Worker }
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard Worker struct pipe_screen *screen = ctx->pipe->screen;
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker switch (name) {
142*61046927SAndroid Build Coastguard Worker case GL_VENDOR: {
143*61046927SAndroid Build Coastguard Worker const GLubyte *str = (const GLubyte *)screen->get_vendor(screen);
144*61046927SAndroid Build Coastguard Worker if (str)
145*61046927SAndroid Build Coastguard Worker return str;
146*61046927SAndroid Build Coastguard Worker return (const GLubyte *) vendor;
147*61046927SAndroid Build Coastguard Worker }
148*61046927SAndroid Build Coastguard Worker case GL_RENDERER: {
149*61046927SAndroid Build Coastguard Worker const GLubyte *str = (const GLubyte *)screen->get_name(screen);
150*61046927SAndroid Build Coastguard Worker if (str)
151*61046927SAndroid Build Coastguard Worker return str;
152*61046927SAndroid Build Coastguard Worker return (const GLubyte *) renderer;
153*61046927SAndroid Build Coastguard Worker }
154*61046927SAndroid Build Coastguard Worker case GL_VERSION:
155*61046927SAndroid Build Coastguard Worker return (const GLubyte *) ctx->VersionString;
156*61046927SAndroid Build Coastguard Worker case GL_EXTENSIONS:
157*61046927SAndroid Build Coastguard Worker if (_mesa_is_desktop_gl_core(ctx)) {
158*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glGetString(GL_EXTENSIONS)");
159*61046927SAndroid Build Coastguard Worker return (const GLubyte *) 0;
160*61046927SAndroid Build Coastguard Worker }
161*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.String)
162*61046927SAndroid Build Coastguard Worker ctx->Extensions.String = _mesa_make_extension_string(ctx);
163*61046927SAndroid Build Coastguard Worker return (const GLubyte *) ctx->Extensions.String;
164*61046927SAndroid Build Coastguard Worker case GL_SHADING_LANGUAGE_VERSION:
165*61046927SAndroid Build Coastguard Worker if (_mesa_is_gles1(ctx))
166*61046927SAndroid Build Coastguard Worker break;
167*61046927SAndroid Build Coastguard Worker return shading_language_version(ctx);
168*61046927SAndroid Build Coastguard Worker case GL_PROGRAM_ERROR_STRING_ARB:
169*61046927SAndroid Build Coastguard Worker if (_mesa_is_desktop_gl_compat(ctx) &&
170*61046927SAndroid Build Coastguard Worker (ctx->Extensions.ARB_fragment_program ||
171*61046927SAndroid Build Coastguard Worker ctx->Extensions.ARB_vertex_program)) {
172*61046927SAndroid Build Coastguard Worker return (const GLubyte *) ctx->Program.ErrorString;
173*61046927SAndroid Build Coastguard Worker }
174*61046927SAndroid Build Coastguard Worker break;
175*61046927SAndroid Build Coastguard Worker default:
176*61046927SAndroid Build Coastguard Worker break;
177*61046927SAndroid Build Coastguard Worker }
178*61046927SAndroid Build Coastguard Worker
179*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glGetString" );
180*61046927SAndroid Build Coastguard Worker return (const GLubyte *) 0;
181*61046927SAndroid Build Coastguard Worker }
182*61046927SAndroid Build Coastguard Worker
183*61046927SAndroid Build Coastguard Worker
184*61046927SAndroid Build Coastguard Worker /**
185*61046927SAndroid Build Coastguard Worker * GL3
186*61046927SAndroid Build Coastguard Worker */
187*61046927SAndroid Build Coastguard Worker const GLubyte * GLAPIENTRY
_mesa_GetStringi(GLenum name,GLuint index)188*61046927SAndroid Build Coastguard Worker _mesa_GetStringi(GLenum name, GLuint index)
189*61046927SAndroid Build Coastguard Worker {
190*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
191*61046927SAndroid Build Coastguard Worker
192*61046927SAndroid Build Coastguard Worker if (!ctx)
193*61046927SAndroid Build Coastguard Worker return NULL;
194*61046927SAndroid Build Coastguard Worker
195*61046927SAndroid Build Coastguard Worker ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, NULL);
196*61046927SAndroid Build Coastguard Worker
197*61046927SAndroid Build Coastguard Worker switch (name) {
198*61046927SAndroid Build Coastguard Worker case GL_EXTENSIONS:
199*61046927SAndroid Build Coastguard Worker if (index >= _mesa_get_extension_count(ctx)) {
200*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glGetStringi(index=%u)", index);
201*61046927SAndroid Build Coastguard Worker return (const GLubyte *) 0;
202*61046927SAndroid Build Coastguard Worker }
203*61046927SAndroid Build Coastguard Worker return _mesa_get_enabled_extension(ctx, index);
204*61046927SAndroid Build Coastguard Worker case GL_SHADING_LANGUAGE_VERSION:
205*61046927SAndroid Build Coastguard Worker {
206*61046927SAndroid Build Coastguard Worker char *version;
207*61046927SAndroid Build Coastguard Worker int num;
208*61046927SAndroid Build Coastguard Worker if (!_mesa_is_desktop_gl(ctx) || ctx->Version < 43) {
209*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM,
210*61046927SAndroid Build Coastguard Worker "glGetStringi(GL_SHADING_LANGUAGE_VERSION): "
211*61046927SAndroid Build Coastguard Worker "supported only in GL4.3 and later");
212*61046927SAndroid Build Coastguard Worker return (const GLubyte *) 0;
213*61046927SAndroid Build Coastguard Worker }
214*61046927SAndroid Build Coastguard Worker num = _mesa_get_shading_language_version(ctx, index, &version);
215*61046927SAndroid Build Coastguard Worker if (index >= num) {
216*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE,
217*61046927SAndroid Build Coastguard Worker "glGetStringi(GL_SHADING_LANGUAGE_VERSION, index=%d)",
218*61046927SAndroid Build Coastguard Worker index);
219*61046927SAndroid Build Coastguard Worker return (const GLubyte *) 0;
220*61046927SAndroid Build Coastguard Worker }
221*61046927SAndroid Build Coastguard Worker return (const GLubyte *) version;
222*61046927SAndroid Build Coastguard Worker }
223*61046927SAndroid Build Coastguard Worker case GL_SPIR_V_EXTENSIONS:
224*61046927SAndroid Build Coastguard Worker if (!ctx->Extensions.ARB_spirv_extensions) {
225*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glGetStringi");
226*61046927SAndroid Build Coastguard Worker return (const GLubyte *) 0;
227*61046927SAndroid Build Coastguard Worker }
228*61046927SAndroid Build Coastguard Worker
229*61046927SAndroid Build Coastguard Worker if (index >= _mesa_get_spirv_extension_count(ctx)) {
230*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_VALUE, "glGetStringi(index=%u)", index);
231*61046927SAndroid Build Coastguard Worker return (const GLubyte *) 0;
232*61046927SAndroid Build Coastguard Worker }
233*61046927SAndroid Build Coastguard Worker return _mesa_get_enabled_spirv_extension(ctx, index);
234*61046927SAndroid Build Coastguard Worker
235*61046927SAndroid Build Coastguard Worker default:
236*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_INVALID_ENUM, "glGetStringi");
237*61046927SAndroid Build Coastguard Worker return (const GLubyte *) 0;
238*61046927SAndroid Build Coastguard Worker }
239*61046927SAndroid Build Coastguard Worker }
240*61046927SAndroid Build Coastguard Worker
241*61046927SAndroid Build Coastguard Worker
242*61046927SAndroid Build Coastguard Worker void
_get_vao_pointerv(GLenum pname,struct gl_vertex_array_object * vao,GLvoid ** params,const char * callerstr)243*61046927SAndroid Build Coastguard Worker _get_vao_pointerv(GLenum pname, struct gl_vertex_array_object* vao,
244*61046927SAndroid Build Coastguard Worker GLvoid **params, const char* callerstr )
245*61046927SAndroid Build Coastguard Worker {
246*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
247*61046927SAndroid Build Coastguard Worker const GLuint clientUnit = ctx->Array.ActiveTexture;
248*61046927SAndroid Build Coastguard Worker
249*61046927SAndroid Build Coastguard Worker if (!params)
250*61046927SAndroid Build Coastguard Worker return;
251*61046927SAndroid Build Coastguard Worker
252*61046927SAndroid Build Coastguard Worker if (MESA_VERBOSE & VERBOSE_API)
253*61046927SAndroid Build Coastguard Worker _mesa_debug(ctx, "%s %s\n", callerstr, _mesa_enum_to_string(pname));
254*61046927SAndroid Build Coastguard Worker
255*61046927SAndroid Build Coastguard Worker switch (pname) {
256*61046927SAndroid Build Coastguard Worker case GL_VERTEX_ARRAY_POINTER:
257*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
258*61046927SAndroid Build Coastguard Worker goto invalid_pname;
259*61046927SAndroid Build Coastguard Worker *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_POS].Ptr;
260*61046927SAndroid Build Coastguard Worker break;
261*61046927SAndroid Build Coastguard Worker case GL_NORMAL_ARRAY_POINTER:
262*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
263*61046927SAndroid Build Coastguard Worker goto invalid_pname;
264*61046927SAndroid Build Coastguard Worker *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_NORMAL].Ptr;
265*61046927SAndroid Build Coastguard Worker break;
266*61046927SAndroid Build Coastguard Worker case GL_COLOR_ARRAY_POINTER:
267*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
268*61046927SAndroid Build Coastguard Worker goto invalid_pname;
269*61046927SAndroid Build Coastguard Worker *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_COLOR0].Ptr;
270*61046927SAndroid Build Coastguard Worker break;
271*61046927SAndroid Build Coastguard Worker case GL_SECONDARY_COLOR_ARRAY_POINTER_EXT:
272*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
273*61046927SAndroid Build Coastguard Worker goto invalid_pname;
274*61046927SAndroid Build Coastguard Worker *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_COLOR1].Ptr;
275*61046927SAndroid Build Coastguard Worker break;
276*61046927SAndroid Build Coastguard Worker case GL_FOG_COORDINATE_ARRAY_POINTER_EXT:
277*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
278*61046927SAndroid Build Coastguard Worker goto invalid_pname;
279*61046927SAndroid Build Coastguard Worker *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_FOG].Ptr;
280*61046927SAndroid Build Coastguard Worker break;
281*61046927SAndroid Build Coastguard Worker case GL_INDEX_ARRAY_POINTER:
282*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
283*61046927SAndroid Build Coastguard Worker goto invalid_pname;
284*61046927SAndroid Build Coastguard Worker *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Ptr;
285*61046927SAndroid Build Coastguard Worker break;
286*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COORD_ARRAY_POINTER:
287*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
288*61046927SAndroid Build Coastguard Worker goto invalid_pname;
289*61046927SAndroid Build Coastguard Worker *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_TEX(clientUnit)].Ptr;
290*61046927SAndroid Build Coastguard Worker break;
291*61046927SAndroid Build Coastguard Worker case GL_EDGE_FLAG_ARRAY_POINTER:
292*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
293*61046927SAndroid Build Coastguard Worker goto invalid_pname;
294*61046927SAndroid Build Coastguard Worker *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Ptr;
295*61046927SAndroid Build Coastguard Worker break;
296*61046927SAndroid Build Coastguard Worker case GL_FEEDBACK_BUFFER_POINTER:
297*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
298*61046927SAndroid Build Coastguard Worker goto invalid_pname;
299*61046927SAndroid Build Coastguard Worker *params = ctx->Feedback.Buffer;
300*61046927SAndroid Build Coastguard Worker break;
301*61046927SAndroid Build Coastguard Worker case GL_SELECTION_BUFFER_POINTER:
302*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGL_COMPAT)
303*61046927SAndroid Build Coastguard Worker goto invalid_pname;
304*61046927SAndroid Build Coastguard Worker *params = ctx->Select.Buffer;
305*61046927SAndroid Build Coastguard Worker break;
306*61046927SAndroid Build Coastguard Worker case GL_POINT_SIZE_ARRAY_POINTER_OES:
307*61046927SAndroid Build Coastguard Worker if (ctx->API != API_OPENGLES)
308*61046927SAndroid Build Coastguard Worker goto invalid_pname;
309*61046927SAndroid Build Coastguard Worker *params = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_POINT_SIZE].Ptr;
310*61046927SAndroid Build Coastguard Worker break;
311*61046927SAndroid Build Coastguard Worker case GL_DEBUG_CALLBACK_FUNCTION_ARB:
312*61046927SAndroid Build Coastguard Worker case GL_DEBUG_CALLBACK_USER_PARAM_ARB:
313*61046927SAndroid Build Coastguard Worker *params = _mesa_get_debug_state_ptr(ctx, pname);
314*61046927SAndroid Build Coastguard Worker break;
315*61046927SAndroid Build Coastguard Worker default:
316*61046927SAndroid Build Coastguard Worker goto invalid_pname;
317*61046927SAndroid Build Coastguard Worker }
318*61046927SAndroid Build Coastguard Worker
319*61046927SAndroid Build Coastguard Worker return;
320*61046927SAndroid Build Coastguard Worker
321*61046927SAndroid Build Coastguard Worker invalid_pname:
322*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "%s", callerstr);
323*61046927SAndroid Build Coastguard Worker return;
324*61046927SAndroid Build Coastguard Worker }
325*61046927SAndroid Build Coastguard Worker
326*61046927SAndroid Build Coastguard Worker
327*61046927SAndroid Build Coastguard Worker /**
328*61046927SAndroid Build Coastguard Worker * Return pointer-valued state, such as a vertex array pointer.
329*61046927SAndroid Build Coastguard Worker *
330*61046927SAndroid Build Coastguard Worker * \param pname names state to be queried
331*61046927SAndroid Build Coastguard Worker * \param params returns the pointer value
332*61046927SAndroid Build Coastguard Worker *
333*61046927SAndroid Build Coastguard Worker * \sa glGetPointerv().
334*61046927SAndroid Build Coastguard Worker *
335*61046927SAndroid Build Coastguard Worker * Tries to get the specified pointer via dd_function_table::GetPointerv,
336*61046927SAndroid Build Coastguard Worker * otherwise gets the specified pointer from the current context.
337*61046927SAndroid Build Coastguard Worker */
338*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetPointerv(GLenum pname,GLvoid ** params)339*61046927SAndroid Build Coastguard Worker _mesa_GetPointerv( GLenum pname, GLvoid **params )
340*61046927SAndroid Build Coastguard Worker {
341*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
342*61046927SAndroid Build Coastguard Worker const char *callerstr;
343*61046927SAndroid Build Coastguard Worker
344*61046927SAndroid Build Coastguard Worker if (_mesa_is_desktop_gl(ctx))
345*61046927SAndroid Build Coastguard Worker callerstr = "glGetPointerv";
346*61046927SAndroid Build Coastguard Worker else
347*61046927SAndroid Build Coastguard Worker callerstr = "glGetPointervKHR";
348*61046927SAndroid Build Coastguard Worker
349*61046927SAndroid Build Coastguard Worker if (!params)
350*61046927SAndroid Build Coastguard Worker return;
351*61046927SAndroid Build Coastguard Worker
352*61046927SAndroid Build Coastguard Worker _get_vao_pointerv(pname, ctx->Array.VAO, params, callerstr);
353*61046927SAndroid Build Coastguard Worker }
354*61046927SAndroid Build Coastguard Worker
355*61046927SAndroid Build Coastguard Worker
356*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetPointerIndexedvEXT(GLenum pname,GLuint index,GLvoid ** params)357*61046927SAndroid Build Coastguard Worker _mesa_GetPointerIndexedvEXT( GLenum pname, GLuint index, GLvoid **params )
358*61046927SAndroid Build Coastguard Worker {
359*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
360*61046927SAndroid Build Coastguard Worker
361*61046927SAndroid Build Coastguard Worker if (!params)
362*61046927SAndroid Build Coastguard Worker return;
363*61046927SAndroid Build Coastguard Worker
364*61046927SAndroid Build Coastguard Worker if (MESA_VERBOSE & VERBOSE_API)
365*61046927SAndroid Build Coastguard Worker _mesa_debug(ctx, "%s %s\n", "glGetPointerIndexedvEXT", _mesa_enum_to_string(pname));
366*61046927SAndroid Build Coastguard Worker
367*61046927SAndroid Build Coastguard Worker switch (pname) {
368*61046927SAndroid Build Coastguard Worker case GL_TEXTURE_COORD_ARRAY_POINTER:
369*61046927SAndroid Build Coastguard Worker *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_TEX(index)].Ptr;
370*61046927SAndroid Build Coastguard Worker break;
371*61046927SAndroid Build Coastguard Worker default:
372*61046927SAndroid Build Coastguard Worker goto invalid_pname;
373*61046927SAndroid Build Coastguard Worker }
374*61046927SAndroid Build Coastguard Worker
375*61046927SAndroid Build Coastguard Worker return;
376*61046927SAndroid Build Coastguard Worker
377*61046927SAndroid Build Coastguard Worker invalid_pname:
378*61046927SAndroid Build Coastguard Worker _mesa_error( ctx, GL_INVALID_ENUM, "glGetPointerIndexedvEXT");
379*61046927SAndroid Build Coastguard Worker return;
380*61046927SAndroid Build Coastguard Worker }
381*61046927SAndroid Build Coastguard Worker
382*61046927SAndroid Build Coastguard Worker /**
383*61046927SAndroid Build Coastguard Worker * Returns the current GL error code, or GL_NO_ERROR.
384*61046927SAndroid Build Coastguard Worker * \return current error code
385*61046927SAndroid Build Coastguard Worker *
386*61046927SAndroid Build Coastguard Worker * Returns __struct gl_contextRec::ErrorValue.
387*61046927SAndroid Build Coastguard Worker */
388*61046927SAndroid Build Coastguard Worker GLenum GLAPIENTRY
_mesa_GetError(void)389*61046927SAndroid Build Coastguard Worker _mesa_GetError( void )
390*61046927SAndroid Build Coastguard Worker {
391*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
392*61046927SAndroid Build Coastguard Worker GLenum e = ctx->ErrorValue;
393*61046927SAndroid Build Coastguard Worker ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
394*61046927SAndroid Build Coastguard Worker
395*61046927SAndroid Build Coastguard Worker /* From Issue (3) of the KHR_no_error spec:
396*61046927SAndroid Build Coastguard Worker *
397*61046927SAndroid Build Coastguard Worker * "Should glGetError() always return NO_ERROR or have undefined
398*61046927SAndroid Build Coastguard Worker * results?
399*61046927SAndroid Build Coastguard Worker *
400*61046927SAndroid Build Coastguard Worker * RESOLVED: It should for all errors except OUT_OF_MEMORY."
401*61046927SAndroid Build Coastguard Worker */
402*61046927SAndroid Build Coastguard Worker if (_mesa_is_no_error_enabled(ctx) && e != GL_OUT_OF_MEMORY) {
403*61046927SAndroid Build Coastguard Worker e = GL_NO_ERROR;
404*61046927SAndroid Build Coastguard Worker }
405*61046927SAndroid Build Coastguard Worker
406*61046927SAndroid Build Coastguard Worker if (MESA_VERBOSE & VERBOSE_API)
407*61046927SAndroid Build Coastguard Worker _mesa_debug(ctx, "glGetError <-- %s\n", _mesa_enum_to_string(e));
408*61046927SAndroid Build Coastguard Worker
409*61046927SAndroid Build Coastguard Worker ctx->ErrorValue = (GLenum) GL_NO_ERROR;
410*61046927SAndroid Build Coastguard Worker ctx->ErrorDebugCount = 0;
411*61046927SAndroid Build Coastguard Worker return e;
412*61046927SAndroid Build Coastguard Worker }
413