errors.c revision ed087ee49808a692ce8a0389fcf6c9da27f99d8e
1d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org/**
2d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * \file errors.c
3d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * Mesa debugging and error handling functions.
4d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org */
5d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
6d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org/*
7d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * Mesa 3-D graphics library
85089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org * Version:  7.1
9d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org *
10d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
11d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org *
12d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
13455475957de24c9964f45cadf4965c7082d28753bashi@chromium.org * copy of this software and associated documentation files (the "Software"),
14d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * to deal in the Software without restriction, including without limitation
15d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
1774343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org * Software is furnished to do so, subject to the following conditions:
1874343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org *
19d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * The above copyright notice and this permission notice shall be included
2093aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com * in all copies or substantial portions of the Software.
21d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org *
22d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
2574343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
26d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
27d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org */
29d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
30d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
31d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include "errors.h"
325089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org
33d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include "imports.h"
34d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include "context.h"
35d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include "mtypes.h"
36d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include "version.h"
37d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
38d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
39d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#define MAXSTRING MAX_DEBUG_MESSAGE_LENGTH
40d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
41d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgvoid
42d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org_mesa_init_errors(struct gl_context *ctx)
43d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org{
44d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   ctx->Debug.Callback = NULL;
45d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   ctx->Debug.SyncOutput = GL_FALSE;
46a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   ctx->Debug.Log[0].length = 0;
47a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   ctx->Debug.NumMessages = 0;
48a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   ctx->Debug.NextMsg = 0;
49a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   ctx->Debug.NextMsgLength = 0;
50a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org}
51a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org
52d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org/**********************************************************************/
53d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org/** \name Diagnostics */
54d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org/*@{*/
55d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
56d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgstatic void
57d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgoutput_if_debug(const char *prefixString, const char *outputString,
58d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org                GLboolean newline)
59d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org{
60d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   static int debug = -1;
61d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
62d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   /* Check the MESA_DEBUG environment variable if it hasn't
63d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org    * been checked yet.  We only have to check it once...
64d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org    */
655089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   if (debug == -1) {
665089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org      char *env = _mesa_getenv("MESA_DEBUG");
675089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org
685089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org      /* In a debug build, we print warning messages *unless*
695089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org       * MESA_DEBUG is 0.  In a non-debug build, we don't
705089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org       * print warning messages *unless* MESA_DEBUG is
715089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org       * set *to any value*.
725089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org       */
735089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org#ifdef DEBUG
745089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org      debug = (env != NULL && atoi(env) == 0) ? 0 : 1;
755089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org#else
765089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org      debug = (env != NULL) ? 1 : 0;
775089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org#endif
785089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   }
795089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org
805089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   /* Now only print the string if we're required to do so. */
815089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   if (debug) {
825089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org      fprintf(stderr, "%s: %s", prefixString, outputString);
835089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org      if (newline)
84d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         fprintf(stderr, "\n");
85a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org
86d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#if defined(_WIN32) && !defined(_WIN32_WCE)
87d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      /* stderr from windows applications without console is not usually
88d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org       * visible, so communicate with the debugger instead */
89d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      {
90d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         char buf[4096];
91d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         _mesa_snprintf(buf, sizeof(buf), "%s: %s%s", prefixString, outputString, newline ? "\n" : "");
92a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org         OutputDebugStringA(buf);
93a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org      }
94a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org#endif
95a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org   }
96a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org}
97a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org
98a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org
99a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org/**
100a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org * Return string version of GL error code.
101a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org */
102a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.orgstatic const char *
103a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.orgerror_string( GLenum error )
104a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org{
105a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org   switch (error) {
106a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   case GL_NO_ERROR:
107a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org      return "GL_NO_ERROR";
108a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   case GL_INVALID_VALUE:
109a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org      return "GL_INVALID_VALUE";
110a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   case GL_INVALID_ENUM:
111a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org      return "GL_INVALID_ENUM";
112a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   case GL_INVALID_OPERATION:
113a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org      return "GL_INVALID_OPERATION";
114a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   case GL_STACK_OVERFLOW:
115a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org      return "GL_STACK_OVERFLOW";
116a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   case GL_STACK_UNDERFLOW:
117a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org      return "GL_STACK_UNDERFLOW";
118a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   case GL_OUT_OF_MEMORY:
119a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org      return "GL_OUT_OF_MEMORY";
120a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   case GL_TABLE_TOO_LARGE:
121a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org      return "GL_TABLE_TOO_LARGE";
122a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   case GL_INVALID_FRAMEBUFFER_OPERATION_EXT:
123a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org      return "GL_INVALID_FRAMEBUFFER_OPERATION";
124a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   default:
125a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org      return "unknown";
126a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org   }
127a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org}
128a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org
129a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org
130a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org/**
131f12575f6e5a4b053188d4e205ae6ceb95a60fb2cyusukes@chromium.org * When a new type of error is recorded, print a message describing
132ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org * previous errors which were accumulated.
133ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org */
134a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.orgstatic void
13500b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.comflush_delayed_errors( struct gl_context *ctx )
136a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org{
137ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org   char s[MAXSTRING];
138a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org
139a574866c0e4b1539098e64422f59d01c80cea6cfbashi@chromium.org   if (ctx->ErrorDebugCount) {
140a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org      _mesa_snprintf(s, MAXSTRING, "%d similar %s errors",
1414dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org                     ctx->ErrorDebugCount,
142a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org                     error_string(ctx->ErrorValue));
1434dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org
144eea48361b1ffcc1bded0ba25c8f747e634cd8e51ksakamoto@chromium.org      output_if_debug("Mesa", s, GL_TRUE);
145eea48361b1ffcc1bded0ba25c8f747e634cd8e51ksakamoto@chromium.org
1466462c58fa123bb89baf1ec4b7538d8f2c682dc8bbashi@chromium.org      ctx->ErrorDebugCount = 0;
1476462c58fa123bb89baf1ec4b7538d8f2c682dc8bbashi@chromium.org   }
1486462c58fa123bb89baf1ec4b7538d8f2c682dc8bbashi@chromium.org}
1496462c58fa123bb89baf1ec4b7538d8f2c682dc8bbashi@chromium.org
150a574866c0e4b1539098e64422f59d01c80cea6cfbashi@chromium.org
151a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org/**
152d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * Report a warning (a recoverable error condition) to stderr if
153d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * either DEBUG is defined or the MESA_DEBUG env var is set.
1546926d5430bbccd1cb4779c495c79707f0daef7c6bashi@chromium.org *
1556926d5430bbccd1cb4779c495c79707f0daef7c6bashi@chromium.org * \param ctx GL context.
1566926d5430bbccd1cb4779c495c79707f0daef7c6bashi@chromium.org * \param fmtString printf()-like format string.
1575089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org */
1585089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.orgvoid
1595089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org_mesa_warning( struct gl_context *ctx, const char *fmtString, ... )
1605089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org{
1615089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   char str[MAXSTRING];
1625089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   va_list args;
163d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   va_start( args, fmtString );
164d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   (void) _mesa_vsnprintf( str, MAXSTRING, fmtString, args );
165d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   va_end( args );
166d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
167d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   if (ctx)
168d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      flush_delayed_errors( ctx );
169d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
170d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   output_if_debug("Mesa warning", str, GL_TRUE);
171d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org}
172d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
17374343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org
1745089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org/**
175d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * Report an internal implementation problem.
176d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * Prints the message to stderr via fprintf().
177d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org *
178d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * \param ctx GL context.
179d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * \param fmtString problem description string.
180d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org */
181d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgvoid
182d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org_mesa_problem( const struct gl_context *ctx, const char *fmtString, ... )
183d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org{
184d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   va_list args;
185d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   char str[MAXSTRING];
186d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   static int numCalls = 0;
187d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
188d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   (void) ctx;
189d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
190d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   if (numCalls < 50) {
191d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      numCalls++;
192d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
193d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      va_start( args, fmtString );
194d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      _mesa_vsnprintf( str, MAXSTRING, fmtString, args );
195d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      va_end( args );
196d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      fprintf(stderr, "Mesa %s implementation error: %s\n",
197a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org              MESA_VERSION_STRING, str);
198d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      fprintf(stderr, "Please report at bugs.freedesktop.org\n");
199d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   }
200d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org}
201d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
202d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
203d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org/**
204d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * Record an OpenGL state error.  These usually occur when the user
205d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * passes invalid parameters to a GL function.
206d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org *
207d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * If debugging is enabled (either at compile-time via the DEBUG macro, or
208d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * run-time via the MESA_DEBUG environment variable), report the error with
209d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * _mesa_debug().
210d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org *
211d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * \param ctx the GL context.
212d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * \param error the error value.
213d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org * \param fmtString printf() style format string, followed by optional args
214d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org */
215d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgvoid
216d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org_mesa_error( struct gl_context *ctx, GLenum error, const char *fmtString, ... )
217d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org{
218d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   static GLint debug = -1;
219d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
220d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   /* Check debug environment variable only once:
221d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org    */
222d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org   if (debug == -1) {
223d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      const char *debugEnv = _mesa_getenv("MESA_DEBUG");
224d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
225d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#ifdef DEBUG
226d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      if (debugEnv && strstr(debugEnv, "silent"))
227d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         debug = GL_FALSE;
228d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      else
229d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         debug = GL_TRUE;
2305089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org#else
231d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      if (debugEnv)
232d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         debug = GL_TRUE;
233d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      else
2346926d5430bbccd1cb4779c495c79707f0daef7c6bashi@chromium.org         debug = GL_FALSE;
2356926d5430bbccd1cb4779c495c79707f0daef7c6bashi@chromium.org#endif
2365089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   }
2375089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org
2385089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   if (debug) {
2395089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org      if (ctx->ErrorValue == error &&
240d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org          ctx->ErrorDebugFmtString == fmtString) {
241d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         ctx->ErrorDebugCount++;
242d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      }
243d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      else {
244d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         char s[MAXSTRING], s2[MAXSTRING];
245d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         va_list args;
246d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
2475089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org         flush_delayed_errors( ctx );
2485089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org
2495089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org         va_start(args, fmtString);
2505089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org         _mesa_vsnprintf(s, MAXSTRING, fmtString, args);
2515089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org         va_end(args);
252a586240a3330de050e76aef6c2c6f50716f636f5bashi@chromium.org
253d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         _mesa_snprintf(s2, MAXSTRING, "%s in %s", error_string(error), s);
254d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         output_if_debug("Mesa: User error", s2, GL_TRUE);
255d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org
256d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         ctx->ErrorDebugFmtString = fmtString;
257d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org         ctx->ErrorDebugCount = 0;
258d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org      }
25974343ba7bd420519a9a4f7b22977d7771286f6f8ksakamoto@chromium.org   }
2605089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org
2615089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   _mesa_record_error(ctx, error);
2625089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org}
2635089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org
2645089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org
2655089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org/**
2665089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org * Report debug information.  Print error message to stderr via fprintf().
2675089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org * No-op if DEBUG mode not enabled.
2685089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org *
2695089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org * \param ctx GL context.
2705089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org * \param fmtString printf()-style format string, followed by optional args.
2715089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org */
272455475957de24c9964f45cadf4965c7082d28753bashi@chromium.orgvoid
2735089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org_mesa_debug( const struct gl_context *ctx, const char *fmtString, ... )
2745089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org{
2755089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org#ifdef DEBUG
2765089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   char s[MAXSTRING];
2775089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   va_list args;
2785089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   va_start(args, fmtString);
2795089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   _mesa_vsnprintf(s, MAXSTRING, fmtString, args);
2805089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org   va_end(args);
281455475957de24c9964f45cadf4965c7082d28753bashi@chromium.org   output_if_debug("Mesa", s, GL_FALSE);
282455475957de24c9964f45cadf4965c7082d28753bashi@chromium.org#endif /* DEBUG */
283455475957de24c9964f45cadf4965c7082d28753bashi@chromium.org   (void) ctx;
284455475957de24c9964f45cadf4965c7082d28753bashi@chromium.org   (void) fmtString;
285455475957de24c9964f45cadf4965c7082d28753bashi@chromium.org}
2865089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org
2875089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org/*@}*/
288455475957de24c9964f45cadf4965c7082d28753bashi@chromium.org