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