1*61046927SAndroid Build Coastguard Worker /**
2*61046927SAndroid Build Coastguard Worker * \file errors.c
3*61046927SAndroid Build Coastguard Worker * Mesa debugging and error handling functions.
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker /*
7*61046927SAndroid Build Coastguard Worker * Mesa 3-D graphics library
8*61046927SAndroid Build Coastguard Worker *
9*61046927SAndroid Build Coastguard Worker * Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
12*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
13*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
14*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
16*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
17*61046927SAndroid Build Coastguard Worker *
18*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
19*61046927SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
20*61046927SAndroid Build Coastguard Worker *
21*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
25*61046927SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26*61046927SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27*61046927SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
28*61046927SAndroid Build Coastguard Worker */
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker #include <stdarg.h>
32*61046927SAndroid Build Coastguard Worker #include <stdio.h>
33*61046927SAndroid Build Coastguard Worker #include "errors.h"
34*61046927SAndroid Build Coastguard Worker #include "enums.h"
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker #include "context.h"
37*61046927SAndroid Build Coastguard Worker #include "debug_output.h"
38*61046927SAndroid Build Coastguard Worker #include "util/detect_os.h"
39*61046927SAndroid Build Coastguard Worker #include "util/log.h"
40*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker /**
43*61046927SAndroid Build Coastguard Worker * When a new type of error is recorded, print a message describing
44*61046927SAndroid Build Coastguard Worker * previous errors which were accumulated.
45*61046927SAndroid Build Coastguard Worker */
46*61046927SAndroid Build Coastguard Worker static void
flush_delayed_errors(struct gl_context * ctx)47*61046927SAndroid Build Coastguard Worker flush_delayed_errors( struct gl_context *ctx )
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker char s[MAX_DEBUG_MESSAGE_LENGTH];
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker if (ctx->ErrorDebugCount) {
52*61046927SAndroid Build Coastguard Worker snprintf(s, MAX_DEBUG_MESSAGE_LENGTH, "%d similar %s errors",
53*61046927SAndroid Build Coastguard Worker ctx->ErrorDebugCount,
54*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(ctx->ErrorValue));
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker mesa_log_if_debug(MESA_LOG_ERROR, s);
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard Worker ctx->ErrorDebugCount = 0;
59*61046927SAndroid Build Coastguard Worker }
60*61046927SAndroid Build Coastguard Worker }
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker /**
64*61046927SAndroid Build Coastguard Worker * Report a warning (a recoverable error condition) to stderr if
65*61046927SAndroid Build Coastguard Worker * either MESA_DEBUG is defined to 1 or the MESA_DEBUG env var is set.
66*61046927SAndroid Build Coastguard Worker *
67*61046927SAndroid Build Coastguard Worker * \param ctx GL context.
68*61046927SAndroid Build Coastguard Worker * \param fmtString printf()-like format string.
69*61046927SAndroid Build Coastguard Worker */
70*61046927SAndroid Build Coastguard Worker void
_mesa_warning(struct gl_context * ctx,const char * fmtString,...)71*61046927SAndroid Build Coastguard Worker _mesa_warning( struct gl_context *ctx, const char *fmtString, ... )
72*61046927SAndroid Build Coastguard Worker {
73*61046927SAndroid Build Coastguard Worker char str[MAX_DEBUG_MESSAGE_LENGTH];
74*61046927SAndroid Build Coastguard Worker va_list args;
75*61046927SAndroid Build Coastguard Worker va_start( args, fmtString );
76*61046927SAndroid Build Coastguard Worker (void) vsnprintf( str, MAX_DEBUG_MESSAGE_LENGTH, fmtString, args );
77*61046927SAndroid Build Coastguard Worker va_end( args );
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker if (ctx)
80*61046927SAndroid Build Coastguard Worker flush_delayed_errors( ctx );
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker mesa_log_if_debug(MESA_LOG_WARN, str);
83*61046927SAndroid Build Coastguard Worker }
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker /**
87*61046927SAndroid Build Coastguard Worker * Report an internal implementation problem.
88*61046927SAndroid Build Coastguard Worker * Prints the message to stderr via fprintf().
89*61046927SAndroid Build Coastguard Worker *
90*61046927SAndroid Build Coastguard Worker * \param ctx GL context.
91*61046927SAndroid Build Coastguard Worker * \param fmtString problem description string.
92*61046927SAndroid Build Coastguard Worker */
93*61046927SAndroid Build Coastguard Worker void
_mesa_problem(const struct gl_context * ctx,const char * fmtString,...)94*61046927SAndroid Build Coastguard Worker _mesa_problem( const struct gl_context *ctx, const char *fmtString, ... )
95*61046927SAndroid Build Coastguard Worker {
96*61046927SAndroid Build Coastguard Worker va_list args;
97*61046927SAndroid Build Coastguard Worker char str[MAX_DEBUG_MESSAGE_LENGTH];
98*61046927SAndroid Build Coastguard Worker static int numCalls = 0;
99*61046927SAndroid Build Coastguard Worker
100*61046927SAndroid Build Coastguard Worker (void) ctx;
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker if (numCalls < 50) {
103*61046927SAndroid Build Coastguard Worker numCalls++;
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker va_start( args, fmtString );
106*61046927SAndroid Build Coastguard Worker vsnprintf( str, MAX_DEBUG_MESSAGE_LENGTH, fmtString, args );
107*61046927SAndroid Build Coastguard Worker va_end( args );
108*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Mesa " PACKAGE_VERSION " implementation error: %s\n",
109*61046927SAndroid Build Coastguard Worker str);
110*61046927SAndroid Build Coastguard Worker fprintf(stderr, "Please report at " PACKAGE_BUGREPORT "\n");
111*61046927SAndroid Build Coastguard Worker }
112*61046927SAndroid Build Coastguard Worker }
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker
115*61046927SAndroid Build Coastguard Worker static GLboolean
should_output(struct gl_context * ctx,GLenum error,const char * fmtString)116*61046927SAndroid Build Coastguard Worker should_output(struct gl_context *ctx, GLenum error, const char *fmtString)
117*61046927SAndroid Build Coastguard Worker {
118*61046927SAndroid Build Coastguard Worker static GLint debug = -1;
119*61046927SAndroid Build Coastguard Worker
120*61046927SAndroid Build Coastguard Worker /* Check debug environment variable only once:
121*61046927SAndroid Build Coastguard Worker */
122*61046927SAndroid Build Coastguard Worker if (debug == -1) {
123*61046927SAndroid Build Coastguard Worker const char *debugEnv = getenv("MESA_DEBUG");
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker #ifndef NDEBUG
126*61046927SAndroid Build Coastguard Worker if (debugEnv && strstr(debugEnv, "silent"))
127*61046927SAndroid Build Coastguard Worker debug = GL_FALSE;
128*61046927SAndroid Build Coastguard Worker else
129*61046927SAndroid Build Coastguard Worker debug = GL_TRUE;
130*61046927SAndroid Build Coastguard Worker #else
131*61046927SAndroid Build Coastguard Worker if (debugEnv)
132*61046927SAndroid Build Coastguard Worker debug = GL_TRUE;
133*61046927SAndroid Build Coastguard Worker else
134*61046927SAndroid Build Coastguard Worker debug = GL_FALSE;
135*61046927SAndroid Build Coastguard Worker #endif
136*61046927SAndroid Build Coastguard Worker }
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker if (debug) {
139*61046927SAndroid Build Coastguard Worker if (ctx->ErrorValue != error ||
140*61046927SAndroid Build Coastguard Worker ctx->ErrorDebugFmtString != fmtString) {
141*61046927SAndroid Build Coastguard Worker flush_delayed_errors( ctx );
142*61046927SAndroid Build Coastguard Worker ctx->ErrorDebugFmtString = fmtString;
143*61046927SAndroid Build Coastguard Worker ctx->ErrorDebugCount = 0;
144*61046927SAndroid Build Coastguard Worker return GL_TRUE;
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker ctx->ErrorDebugCount++;
147*61046927SAndroid Build Coastguard Worker }
148*61046927SAndroid Build Coastguard Worker return GL_FALSE;
149*61046927SAndroid Build Coastguard Worker }
150*61046927SAndroid Build Coastguard Worker
151*61046927SAndroid Build Coastguard Worker
152*61046927SAndroid Build Coastguard Worker void
_mesa_gl_vdebugf(struct gl_context * ctx,GLuint * id,enum mesa_debug_source source,enum mesa_debug_type type,enum mesa_debug_severity severity,const char * fmtString,va_list args)153*61046927SAndroid Build Coastguard Worker _mesa_gl_vdebugf(struct gl_context *ctx,
154*61046927SAndroid Build Coastguard Worker GLuint *id,
155*61046927SAndroid Build Coastguard Worker enum mesa_debug_source source,
156*61046927SAndroid Build Coastguard Worker enum mesa_debug_type type,
157*61046927SAndroid Build Coastguard Worker enum mesa_debug_severity severity,
158*61046927SAndroid Build Coastguard Worker const char *fmtString,
159*61046927SAndroid Build Coastguard Worker va_list args)
160*61046927SAndroid Build Coastguard Worker {
161*61046927SAndroid Build Coastguard Worker char s[MAX_DEBUG_MESSAGE_LENGTH];
162*61046927SAndroid Build Coastguard Worker int len;
163*61046927SAndroid Build Coastguard Worker
164*61046927SAndroid Build Coastguard Worker _mesa_debug_get_id(id);
165*61046927SAndroid Build Coastguard Worker
166*61046927SAndroid Build Coastguard Worker len = vsnprintf(s, MAX_DEBUG_MESSAGE_LENGTH, fmtString, args);
167*61046927SAndroid Build Coastguard Worker if (len >= MAX_DEBUG_MESSAGE_LENGTH)
168*61046927SAndroid Build Coastguard Worker /* message was truncated */
169*61046927SAndroid Build Coastguard Worker len = MAX_DEBUG_MESSAGE_LENGTH - 1;
170*61046927SAndroid Build Coastguard Worker
171*61046927SAndroid Build Coastguard Worker _mesa_log_msg(ctx, source, type, *id, severity, len, s);
172*61046927SAndroid Build Coastguard Worker }
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker
175*61046927SAndroid Build Coastguard Worker void
_mesa_gl_debugf(struct gl_context * ctx,GLuint * id,enum mesa_debug_source source,enum mesa_debug_type type,enum mesa_debug_severity severity,const char * fmtString,...)176*61046927SAndroid Build Coastguard Worker _mesa_gl_debugf(struct gl_context *ctx,
177*61046927SAndroid Build Coastguard Worker GLuint *id,
178*61046927SAndroid Build Coastguard Worker enum mesa_debug_source source,
179*61046927SAndroid Build Coastguard Worker enum mesa_debug_type type,
180*61046927SAndroid Build Coastguard Worker enum mesa_debug_severity severity,
181*61046927SAndroid Build Coastguard Worker const char *fmtString, ...)
182*61046927SAndroid Build Coastguard Worker {
183*61046927SAndroid Build Coastguard Worker va_list args;
184*61046927SAndroid Build Coastguard Worker va_start(args, fmtString);
185*61046927SAndroid Build Coastguard Worker _mesa_gl_vdebugf(ctx, id, source, type, severity, fmtString, args);
186*61046927SAndroid Build Coastguard Worker va_end(args);
187*61046927SAndroid Build Coastguard Worker }
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard Worker size_t
_mesa_gl_debug(struct gl_context * ctx,GLuint * id,enum mesa_debug_source source,enum mesa_debug_type type,enum mesa_debug_severity severity,const char * msg)190*61046927SAndroid Build Coastguard Worker _mesa_gl_debug(struct gl_context *ctx,
191*61046927SAndroid Build Coastguard Worker GLuint *id,
192*61046927SAndroid Build Coastguard Worker enum mesa_debug_source source,
193*61046927SAndroid Build Coastguard Worker enum mesa_debug_type type,
194*61046927SAndroid Build Coastguard Worker enum mesa_debug_severity severity,
195*61046927SAndroid Build Coastguard Worker const char *msg)
196*61046927SAndroid Build Coastguard Worker {
197*61046927SAndroid Build Coastguard Worker _mesa_debug_get_id(id);
198*61046927SAndroid Build Coastguard Worker
199*61046927SAndroid Build Coastguard Worker size_t len = strnlen(msg, MAX_DEBUG_MESSAGE_LENGTH);
200*61046927SAndroid Build Coastguard Worker if (len < MAX_DEBUG_MESSAGE_LENGTH) {
201*61046927SAndroid Build Coastguard Worker _mesa_log_msg(ctx, source, type, *id, severity, len, msg);
202*61046927SAndroid Build Coastguard Worker return len;
203*61046927SAndroid Build Coastguard Worker }
204*61046927SAndroid Build Coastguard Worker
205*61046927SAndroid Build Coastguard Worker /* limit the message to fit within KHR_debug buffers */
206*61046927SAndroid Build Coastguard Worker char s[MAX_DEBUG_MESSAGE_LENGTH];
207*61046927SAndroid Build Coastguard Worker strncpy(s, msg, MAX_DEBUG_MESSAGE_LENGTH - 1);
208*61046927SAndroid Build Coastguard Worker s[MAX_DEBUG_MESSAGE_LENGTH - 1] = '\0';
209*61046927SAndroid Build Coastguard Worker len = MAX_DEBUG_MESSAGE_LENGTH - 1;
210*61046927SAndroid Build Coastguard Worker _mesa_log_msg(ctx, source, type, *id, severity, len, s);
211*61046927SAndroid Build Coastguard Worker
212*61046927SAndroid Build Coastguard Worker /* report the number of characters that were logged */
213*61046927SAndroid Build Coastguard Worker return len;
214*61046927SAndroid Build Coastguard Worker }
215*61046927SAndroid Build Coastguard Worker
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker /**
218*61046927SAndroid Build Coastguard Worker * Record an OpenGL state error. These usually occur when the user
219*61046927SAndroid Build Coastguard Worker * passes invalid parameters to a GL function.
220*61046927SAndroid Build Coastguard Worker *
221*61046927SAndroid Build Coastguard Worker * If debugging is enabled (either at compile-time via the MESA_DEBUG macro, or
222*61046927SAndroid Build Coastguard Worker * run-time via the MESA_DEBUG environment variable), report the error with
223*61046927SAndroid Build Coastguard Worker * _mesa_debug().
224*61046927SAndroid Build Coastguard Worker *
225*61046927SAndroid Build Coastguard Worker * \param ctx the GL context.
226*61046927SAndroid Build Coastguard Worker * \param error the error value.
227*61046927SAndroid Build Coastguard Worker * \param fmtString printf() style format string, followed by optional args
228*61046927SAndroid Build Coastguard Worker */
229*61046927SAndroid Build Coastguard Worker void
_mesa_error(struct gl_context * ctx,GLenum error,const char * fmtString,...)230*61046927SAndroid Build Coastguard Worker _mesa_error( struct gl_context *ctx, GLenum error, const char *fmtString, ... )
231*61046927SAndroid Build Coastguard Worker {
232*61046927SAndroid Build Coastguard Worker GLboolean do_output, do_log;
233*61046927SAndroid Build Coastguard Worker /* Ideally this would be set up by the caller, so that we had proper IDs
234*61046927SAndroid Build Coastguard Worker * per different message.
235*61046927SAndroid Build Coastguard Worker */
236*61046927SAndroid Build Coastguard Worker static GLuint error_msg_id = 0;
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Worker _mesa_debug_get_id(&error_msg_id);
239*61046927SAndroid Build Coastguard Worker
240*61046927SAndroid Build Coastguard Worker do_output = should_output(ctx, error, fmtString);
241*61046927SAndroid Build Coastguard Worker
242*61046927SAndroid Build Coastguard Worker simple_mtx_lock(&ctx->DebugMutex);
243*61046927SAndroid Build Coastguard Worker if (ctx->Debug) {
244*61046927SAndroid Build Coastguard Worker do_log = _mesa_debug_is_message_enabled(ctx->Debug,
245*61046927SAndroid Build Coastguard Worker MESA_DEBUG_SOURCE_API,
246*61046927SAndroid Build Coastguard Worker MESA_DEBUG_TYPE_ERROR,
247*61046927SAndroid Build Coastguard Worker error_msg_id,
248*61046927SAndroid Build Coastguard Worker MESA_DEBUG_SEVERITY_HIGH);
249*61046927SAndroid Build Coastguard Worker }
250*61046927SAndroid Build Coastguard Worker else {
251*61046927SAndroid Build Coastguard Worker do_log = GL_FALSE;
252*61046927SAndroid Build Coastguard Worker }
253*61046927SAndroid Build Coastguard Worker simple_mtx_unlock(&ctx->DebugMutex);
254*61046927SAndroid Build Coastguard Worker
255*61046927SAndroid Build Coastguard Worker if (do_output || do_log) {
256*61046927SAndroid Build Coastguard Worker char s[MAX_DEBUG_MESSAGE_LENGTH], s2[MAX_DEBUG_MESSAGE_LENGTH];
257*61046927SAndroid Build Coastguard Worker int len;
258*61046927SAndroid Build Coastguard Worker va_list args;
259*61046927SAndroid Build Coastguard Worker
260*61046927SAndroid Build Coastguard Worker va_start(args, fmtString);
261*61046927SAndroid Build Coastguard Worker len = vsnprintf(s, MAX_DEBUG_MESSAGE_LENGTH, fmtString, args);
262*61046927SAndroid Build Coastguard Worker va_end(args);
263*61046927SAndroid Build Coastguard Worker
264*61046927SAndroid Build Coastguard Worker if (len >= MAX_DEBUG_MESSAGE_LENGTH) {
265*61046927SAndroid Build Coastguard Worker /* Too long error message. Whoever calls _mesa_error should use
266*61046927SAndroid Build Coastguard Worker * shorter strings.
267*61046927SAndroid Build Coastguard Worker */
268*61046927SAndroid Build Coastguard Worker assert(0);
269*61046927SAndroid Build Coastguard Worker return;
270*61046927SAndroid Build Coastguard Worker }
271*61046927SAndroid Build Coastguard Worker
272*61046927SAndroid Build Coastguard Worker len = snprintf(s2, MAX_DEBUG_MESSAGE_LENGTH, "%s in %s",
273*61046927SAndroid Build Coastguard Worker _mesa_enum_to_string(error), s);
274*61046927SAndroid Build Coastguard Worker if (len >= MAX_DEBUG_MESSAGE_LENGTH) {
275*61046927SAndroid Build Coastguard Worker /* Same as above. */
276*61046927SAndroid Build Coastguard Worker assert(0);
277*61046927SAndroid Build Coastguard Worker return;
278*61046927SAndroid Build Coastguard Worker }
279*61046927SAndroid Build Coastguard Worker
280*61046927SAndroid Build Coastguard Worker /* Print the error to stderr if needed. */
281*61046927SAndroid Build Coastguard Worker if (do_output) {
282*61046927SAndroid Build Coastguard Worker mesa_log_if_debug(MESA_LOG_ERROR, s2);
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker /* Log the error via ARB_debug_output if needed.*/
286*61046927SAndroid Build Coastguard Worker if (do_log) {
287*61046927SAndroid Build Coastguard Worker _mesa_log_msg(ctx, MESA_DEBUG_SOURCE_API, MESA_DEBUG_TYPE_ERROR,
288*61046927SAndroid Build Coastguard Worker error_msg_id, MESA_DEBUG_SEVERITY_HIGH, len, s2);
289*61046927SAndroid Build Coastguard Worker }
290*61046927SAndroid Build Coastguard Worker }
291*61046927SAndroid Build Coastguard Worker
292*61046927SAndroid Build Coastguard Worker /* Set the GL context error state for glGetError. */
293*61046927SAndroid Build Coastguard Worker if (ctx->ErrorValue == GL_NO_ERROR)
294*61046927SAndroid Build Coastguard Worker ctx->ErrorValue = error;
295*61046927SAndroid Build Coastguard Worker }
296*61046927SAndroid Build Coastguard Worker
297*61046927SAndroid Build Coastguard Worker void
_mesa_error_no_memory(const char * caller)298*61046927SAndroid Build Coastguard Worker _mesa_error_no_memory(const char *caller)
299*61046927SAndroid Build Coastguard Worker {
300*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
301*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, GL_OUT_OF_MEMORY, "out of memory in %s", caller);
302*61046927SAndroid Build Coastguard Worker }
303*61046927SAndroid Build Coastguard Worker
304*61046927SAndroid Build Coastguard Worker /**
305*61046927SAndroid Build Coastguard Worker * Report debug information. Print error message to stderr via fprintf()
306*61046927SAndroid Build Coastguard Worker * when debug mode is enabled by NDEBUG; otherwise no-op.
307*61046927SAndroid Build Coastguard Worker *
308*61046927SAndroid Build Coastguard Worker * \param ctx GL context.
309*61046927SAndroid Build Coastguard Worker * \param fmtString printf()-style format string, followed by optional args.
310*61046927SAndroid Build Coastguard Worker */
311*61046927SAndroid Build Coastguard Worker void
_mesa_debug(const struct gl_context * ctx,const char * fmtString,...)312*61046927SAndroid Build Coastguard Worker _mesa_debug( const struct gl_context *ctx, const char *fmtString, ... )
313*61046927SAndroid Build Coastguard Worker {
314*61046927SAndroid Build Coastguard Worker #ifndef NDEBUG
315*61046927SAndroid Build Coastguard Worker char s[MAX_DEBUG_MESSAGE_LENGTH];
316*61046927SAndroid Build Coastguard Worker va_list args;
317*61046927SAndroid Build Coastguard Worker va_start(args, fmtString);
318*61046927SAndroid Build Coastguard Worker vsnprintf(s, MAX_DEBUG_MESSAGE_LENGTH, fmtString, args);
319*61046927SAndroid Build Coastguard Worker va_end(args);
320*61046927SAndroid Build Coastguard Worker mesa_log_if_debug(MESA_LOG_DEBUG, s);
321*61046927SAndroid Build Coastguard Worker #endif /* !NDEBUG */
322*61046927SAndroid Build Coastguard Worker (void) ctx;
323*61046927SAndroid Build Coastguard Worker (void) fmtString;
324*61046927SAndroid Build Coastguard Worker }
325*61046927SAndroid Build Coastguard Worker
326*61046927SAndroid Build Coastguard Worker /**
327*61046927SAndroid Build Coastguard Worker * Report debug information from the shader compiler via GL_ARB_debug_output.
328*61046927SAndroid Build Coastguard Worker *
329*61046927SAndroid Build Coastguard Worker * \param ctx GL context.
330*61046927SAndroid Build Coastguard Worker * \param type The namespace to which this message belongs.
331*61046927SAndroid Build Coastguard Worker * \param id The message ID within the given namespace.
332*61046927SAndroid Build Coastguard Worker * \param msg The message to output. Must be null-terminated.
333*61046927SAndroid Build Coastguard Worker */
334*61046927SAndroid Build Coastguard Worker void
_mesa_shader_debug(struct gl_context * ctx,GLenum type,GLuint * id,const char * msg)335*61046927SAndroid Build Coastguard Worker _mesa_shader_debug(struct gl_context *ctx, GLenum type, GLuint *id,
336*61046927SAndroid Build Coastguard Worker const char *msg)
337*61046927SAndroid Build Coastguard Worker {
338*61046927SAndroid Build Coastguard Worker enum mesa_debug_source source = MESA_DEBUG_SOURCE_SHADER_COMPILER;
339*61046927SAndroid Build Coastguard Worker enum mesa_debug_severity severity = MESA_DEBUG_SEVERITY_HIGH;
340*61046927SAndroid Build Coastguard Worker int len;
341*61046927SAndroid Build Coastguard Worker
342*61046927SAndroid Build Coastguard Worker _mesa_debug_get_id(id);
343*61046927SAndroid Build Coastguard Worker
344*61046927SAndroid Build Coastguard Worker len = strlen(msg);
345*61046927SAndroid Build Coastguard Worker
346*61046927SAndroid Build Coastguard Worker /* Truncate the message if necessary. */
347*61046927SAndroid Build Coastguard Worker if (len >= MAX_DEBUG_MESSAGE_LENGTH)
348*61046927SAndroid Build Coastguard Worker len = MAX_DEBUG_MESSAGE_LENGTH - 1;
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker _mesa_log_msg(ctx, source, type, *id, severity, len, msg);
351*61046927SAndroid Build Coastguard Worker }
352*61046927SAndroid Build Coastguard Worker
353*61046927SAndroid Build Coastguard Worker /**
354*61046927SAndroid Build Coastguard Worker * Set the parameter as the current GL error. Used by glthread.
355*61046927SAndroid Build Coastguard Worker */
356*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_InternalSetError(GLenum error)357*61046927SAndroid Build Coastguard Worker _mesa_InternalSetError(GLenum error)
358*61046927SAndroid Build Coastguard Worker {
359*61046927SAndroid Build Coastguard Worker GET_CURRENT_CONTEXT(ctx);
360*61046927SAndroid Build Coastguard Worker _mesa_error(ctx, error, "glthread");
361*61046927SAndroid Build Coastguard Worker }
362