summaryrefslogtreecommitdiffstats
path: root/src/mesa/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/main')
-rw-r--r--src/mesa/main/errors.c125
1 files changed, 84 insertions, 41 deletions
diff --git a/src/mesa/main/errors.c b/src/mesa/main/errors.c
index f84a3c12e0a..dcae2f538dc 100644
--- a/src/mesa/main/errors.c
+++ b/src/mesa/main/errors.c
@@ -81,6 +81,7 @@ static const GLenum debug_severity_enums[] = {
GL_DEBUG_SEVERITY_NOTIFICATION,
};
+
static enum mesa_debug_source
gl_enum_to_debug_source(GLenum e)
{
@@ -141,6 +142,7 @@ debug_get_id(GLuint *id)
}
}
+
/*
* We store a bitfield in the hash table, with five possible values total.
*
@@ -182,6 +184,7 @@ enum {
ENABLED = ENABLED_BIT | FOUND_BIT
};
+
/**
* Returns the state of the given message source/type/ID tuple.
*/
@@ -194,21 +197,23 @@ should_log(struct gl_context *ctx,
{
GLint gstack = ctx->Debug.GroupStackDepth;
struct gl_debug_namespace *nspace =
- &ctx->Debug.Namespaces[gstack][source][type];
+ &ctx->Debug.Namespaces[gstack][source][type];
uintptr_t state;
if (!ctx->Debug.DebugOutput)
return GL_FALSE;
/* In addition to not being able to store zero as a value, HashTable also
- can't use zero as a key. */
+ * can't use zero as a key.
+ */
if (id)
state = (uintptr_t)_mesa_HashLookup(nspace->IDs, id);
else
state = nspace->ZeroID;
/* Only do this once for each ID. This makes sure the ID exists in,
- at most, one list, and does not pointlessly appear multiple times. */
+ * at most, one list, and does not pointlessly appear multiple times.
+ */
if (!(state & KNOWN_SEVERITY)) {
struct gl_debug_severity *entry;
@@ -238,6 +243,7 @@ out:
return !!(state & ENABLED_BIT);
}
+
/**
* Sets the state of the given message source/type/ID tuple.
*/
@@ -249,11 +255,12 @@ set_message_state(struct gl_context *ctx,
{
GLint gstack = ctx->Debug.GroupStackDepth;
struct gl_debug_namespace *nspace =
- &ctx->Debug.Namespaces[gstack][source][type];
+ &ctx->Debug.Namespaces[gstack][source][type];
uintptr_t state;
/* In addition to not being able to store zero as a value, HashTable also
- can't use zero as a key. */
+ * can't use zero as a key.
+ */
if (id)
state = (uintptr_t)_mesa_HashLookup(nspace->IDs, id);
else
@@ -274,6 +281,7 @@ set_message_state(struct gl_context *ctx,
nspace->ZeroID = state;
}
+
static void
store_message_details(struct gl_debug_msg *emptySlot,
enum mesa_debug_source source,
@@ -307,7 +315,8 @@ store_message_details(struct gl_debug_msg *emptySlot,
}
}
- /**
+
+/**
* Remap any type exclusive to KHR_debug to something suitable
* for ARB_debug_output
*/
@@ -326,6 +335,7 @@ remap_type(GLenum type) {
return type;
}
+
/**
* Remap severity exclusive to KHR_debug to something suitable
* for ARB_debug_output
@@ -339,6 +349,7 @@ remap_severity(GLenum severity) {
return severity;
}
+
/**
* 'buf' is not necessarily a null-terminated string. When logging, copy
* 'len' characters from it, store them in a new, null-terminated string,
@@ -366,10 +377,7 @@ log_msg(struct gl_context *ctx, enum mesa_debug_source source,
gl_severity = remap_severity(gl_severity);
gl_type = remap_type(gl_type);
}
- ctx->Debug.Callback(debug_source_enums[source],
- gl_type,
- id,
- gl_severity,
+ ctx->Debug.Callback(debug_source_enums[source], gl_type, id, gl_severity,
len, buf, ctx->Debug.CallbackData);
return;
}
@@ -389,6 +397,7 @@ log_msg(struct gl_context *ctx, enum mesa_debug_source source,
ctx->Debug.NumMessages++;
}
+
/**
* Pop the oldest debug message out of the log.
* Writes the message string, including the null terminator, into 'buf',
@@ -423,15 +432,20 @@ get_msg(struct gl_context *ctx, GLenum *source, GLenum *type,
if (caller == MESSAGE_LOG_ARB)
*severity = remap_severity(*severity);
}
- if (source)
+
+ if (source) {
*source = debug_source_enums[msg->source];
+ }
+
if (type) {
*type = debug_type_enums[msg->type];
if (caller == MESSAGE_LOG_ARB)
*type = remap_type(*type);
}
- if (id)
+
+ if (id) {
*id = msg->id;
+ }
if (buf) {
assert(msg->message[length-1] == '\0');
@@ -451,6 +465,7 @@ get_msg(struct gl_context *ctx, GLenum *source, GLenum *type,
return length;
}
+
/**
* Verify that source, type, and severity are valid enums.
* glDebugMessageInsertARB only accepts two values for 'source',
@@ -523,14 +538,14 @@ validate_params(struct gl_context *ctx, unsigned caller,
return GL_TRUE;
error:
- {
- _mesa_error(ctx, GL_INVALID_ENUM, "bad values passed to %s"
- "(source=0x%x, type=0x%x, severity=0x%x)", callerstr,
- source, type, severity);
- }
+ _mesa_error(ctx, GL_INVALID_ENUM, "bad values passed to %s"
+ "(source=0x%x, type=0x%x, severity=0x%x)", callerstr,
+ source, type, severity);
+
return GL_FALSE;
}
+
/**
* Set the state of all message IDs found in the given intersection of
* 'source', 'type', and 'severity'. The _COUNT enum can be used for
@@ -573,8 +588,8 @@ control_messages(struct gl_context *ctx,
sevmax = severity+1;
}
- for (sev = severity; sev < sevmax; sev++)
- for (s = source; s < smax; s++)
+ for (sev = severity; sev < sevmax; sev++) {
+ for (s = source; s < smax; s++) {
for (t = type; t < tmax; t++) {
struct simple_node *node;
struct gl_debug_severity *entry;
@@ -588,8 +603,11 @@ control_messages(struct gl_context *ctx,
set_message_state(ctx, s, t, entry->ID, enabled);
}
}
+ }
+ }
}
+
/**
* Debugging-message namespaces with the source APPLICATION or THIRD_PARTY
* require special handling, since the IDs in them are controlled by clients,
@@ -621,6 +639,7 @@ control_app_messages(struct gl_context *ctx, GLenum esource, GLenum etype,
control_messages(ctx, source, type, severity, enabled);
}
+
/**
* This is a generic message control function for use by both
* glDebugMessageControlARB and glDebugMessageControl.
@@ -658,6 +677,7 @@ message_control(GLenum gl_source, GLenum gl_type,
count, ids, enabled);
}
+
/**
* This is a generic message insert function.
* Validation of source, type and severity parameters should be done
@@ -665,7 +685,7 @@ message_control(GLenum gl_source, GLenum gl_type,
*/
static void
message_insert(GLenum source, GLenum type, GLuint id,
- GLenum severity, GLint length, const GLchar* buf,
+ GLenum severity, GLint length, const GLchar *buf,
const char *callerstr)
{
GET_CURRENT_CONTEXT(ctx);
@@ -687,14 +707,15 @@ message_insert(GLenum source, GLenum type, GLuint id,
gl_enum_to_debug_severity(severity), length, buf);
}
+
/**
* This is a generic message insert function for use by both
* glGetDebugMessageLogARB and glGetDebugMessageLog.
*/
static GLuint
-get_message_log(GLuint count, GLsizei logSize, GLenum* sources,
- GLenum* types, GLenum* ids, GLenum* severities,
- GLsizei* lengths, GLchar* messageLog,
+get_message_log(GLuint count, GLsizei logSize, GLenum *sources,
+ GLenum *types, GLenum *ids, GLenum *severities,
+ GLsizei *lengths, GLchar *messageLog,
unsigned caller, const char *callerstr)
{
GET_CURRENT_CONTEXT(ctx);
@@ -738,11 +759,13 @@ get_message_log(GLuint count, GLsizei logSize, GLenum* sources,
return ret;
}
+
static void
do_nothing(GLuint key, void *data, void *userData)
{
}
+
static void
free_errors_data(struct gl_context *ctx, GLint gstack)
{
@@ -751,7 +774,7 @@ free_errors_data(struct gl_context *ctx, GLint gstack)
enum mesa_debug_severity sev;
/* Tear down state for filtering debug messages. */
- for (s = 0; s < MESA_DEBUG_SOURCE_COUNT; s++)
+ for (s = 0; s < MESA_DEBUG_SOURCE_COUNT; s++) {
for (t = 0; t < MESA_DEBUG_TYPE_COUNT; t++) {
_mesa_HashDeleteAll(ctx->Debug.Namespaces[gstack][s][t].IDs,
do_nothing, NULL);
@@ -767,12 +790,14 @@ free_errors_data(struct gl_context *ctx, GLint gstack)
}
}
}
+ }
}
+
void GLAPIENTRY
_mesa_DebugMessageInsert(GLenum source, GLenum type, GLuint id,
GLenum severity, GLint length,
- const GLchar* buf)
+ const GLchar *buf)
{
const char *callerstr = "glDebugMessageInsert";
@@ -781,14 +806,14 @@ _mesa_DebugMessageInsert(GLenum source, GLenum type, GLuint id,
if (!validate_params(ctx, INSERT, callerstr, source, type, severity))
return; /* GL_INVALID_ENUM */
- message_insert(source, type, id, severity, length, buf,
- callerstr);
+ message_insert(source, type, id, severity, length, buf, callerstr);
}
+
GLuint GLAPIENTRY
-_mesa_GetDebugMessageLog(GLuint count, GLsizei logSize, GLenum* sources,
- GLenum* types, GLenum* ids, GLenum* severities,
- GLsizei* lengths, GLchar* messageLog)
+_mesa_GetDebugMessageLog(GLuint count, GLsizei logSize, GLenum *sources,
+ GLenum *types, GLenum *ids, GLenum *severities,
+ GLsizei *lengths, GLchar *messageLog)
{
const char *callerstr = "glGetDebugMessageLog";
@@ -796,6 +821,7 @@ _mesa_GetDebugMessageLog(GLuint count, GLsizei logSize, GLenum* sources,
lengths, messageLog, MESSAGE_LOG, callerstr);
}
+
void GLAPIENTRY
_mesa_DebugMessageControl(GLenum source, GLenum type, GLenum severity,
GLsizei count, const GLuint *ids,
@@ -807,6 +833,7 @@ _mesa_DebugMessageControl(GLenum source, GLenum type, GLenum severity,
enabled, CONTROL, callerstr);
}
+
void GLAPIENTRY
_mesa_DebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
{
@@ -816,6 +843,7 @@ _mesa_DebugMessageCallback(GLDEBUGPROC callback, const void *userParam)
ctx->Debug.ARBCallback = GL_FALSE;
}
+
void GLAPIENTRY
_mesa_PushDebugGroup(GLenum source, GLuint id, GLsizei length,
const GLchar *message)
@@ -864,7 +892,7 @@ _mesa_PushDebugGroup(GLenum source, GLuint id, GLsizei length,
/* inherit the control volume of the debug group previously residing on
* the top of the debug group stack
*/
- for (s = 0; s < MESA_DEBUG_SOURCE_COUNT; s++)
+ for (s = 0; s < MESA_DEBUG_SOURCE_COUNT; s++) {
for (t = 0; t < MESA_DEBUG_TYPE_COUNT; t++) {
/* copy id settings */
ctx->Debug.Namespaces[currStackDepth][s][t].IDs =
@@ -875,7 +903,8 @@ _mesa_PushDebugGroup(GLenum source, GLuint id, GLsizei length,
struct simple_node *node;
/* copy default settings for unknown ids */
- ctx->Debug.Defaults[currStackDepth][sev][s][t] = ctx->Debug.Defaults[prevStackDepth][sev][s][t];
+ ctx->Debug.Defaults[currStackDepth][sev][s][t] =
+ ctx->Debug.Defaults[prevStackDepth][sev][s][t];
/* copy known id severity settings */
make_empty_list(&ctx->Debug.Namespaces[currStackDepth][s][t].Severity[sev]);
@@ -890,8 +919,10 @@ _mesa_PushDebugGroup(GLenum source, GLuint id, GLsizei length,
}
}
}
+ }
}
+
void GLAPIENTRY
_mesa_PopDebugGroup(void)
{
@@ -928,10 +959,11 @@ _mesa_PopDebugGroup(void)
free_errors_data(ctx, prevStackDepth);
}
+
void GLAPIENTRY
_mesa_DebugMessageInsertARB(GLenum source, GLenum type, GLuint id,
GLenum severity, GLint length,
- const GLcharARB* buf)
+ const GLcharARB *buf)
{
const char *callerstr = "glDebugMessageInsertARB";
@@ -940,14 +972,14 @@ _mesa_DebugMessageInsertARB(GLenum source, GLenum type, GLuint id,
if (!validate_params(ctx, INSERT_ARB, callerstr, source, type, severity))
return; /* GL_INVALID_ENUM */
- message_insert(source, type, id, severity, length, buf,
- callerstr);
+ message_insert(source, type, id, severity, length, buf, callerstr);
}
+
GLuint GLAPIENTRY
-_mesa_GetDebugMessageLogARB(GLuint count, GLsizei logSize, GLenum* sources,
- GLenum* types, GLenum* ids, GLenum* severities,
- GLsizei* lengths, GLcharARB* messageLog)
+_mesa_GetDebugMessageLogARB(GLuint count, GLsizei logSize, GLenum *sources,
+ GLenum *types, GLenum *ids, GLenum *severities,
+ GLsizei *lengths, GLcharARB *messageLog)
{
const char *callerstr = "glGetDebugMessageLogARB";
@@ -955,6 +987,7 @@ _mesa_GetDebugMessageLogARB(GLuint count, GLsizei logSize, GLenum* sources,
lengths, messageLog, MESSAGE_LOG_ARB, callerstr);
}
+
void GLAPIENTRY
_mesa_DebugMessageControlARB(GLenum gl_source, GLenum gl_type,
GLenum gl_severity,
@@ -967,6 +1000,7 @@ _mesa_DebugMessageControlARB(GLenum gl_source, GLenum gl_type,
enabled, CONTROL_ARB, callerstr);
}
+
void GLAPIENTRY
_mesa_DebugMessageCallbackARB(GLDEBUGPROCARB callback, const void *userParam)
{
@@ -976,6 +1010,7 @@ _mesa_DebugMessageCallbackARB(GLDEBUGPROCARB callback, const void *userParam)
ctx->Debug.ARBCallback = GL_TRUE;
}
+
void
_mesa_init_errors(struct gl_context *ctx)
{
@@ -998,16 +1033,19 @@ _mesa_init_errors(struct gl_context *ctx)
sizeof ctx->Debug.Defaults[0][MESA_DEBUG_SEVERITY_LOW]);
/* Initialize state for filtering known debug messages. */
- for (s = 0; s < MESA_DEBUG_SOURCE_COUNT; s++)
+ for (s = 0; s < MESA_DEBUG_SOURCE_COUNT; s++) {
for (t = 0; t < MESA_DEBUG_TYPE_COUNT; t++) {
ctx->Debug.Namespaces[0][s][t].IDs = _mesa_NewHashTable();
assert(ctx->Debug.Namespaces[0][s][t].IDs);
- for (sev = 0; sev < MESA_DEBUG_SEVERITY_COUNT; sev++)
+ for (sev = 0; sev < MESA_DEBUG_SEVERITY_COUNT; sev++) {
make_empty_list(&ctx->Debug.Namespaces[0][s][t].Severity[sev]);
+ }
}
+ }
}
+
/**
* Loop through debug group stack tearing down states for
* filtering debug messages.
@@ -1022,6 +1060,7 @@ _mesa_free_errors_data(struct gl_context *ctx)
}
}
+
/**********************************************************************/
/** \name Diagnostics */
/*@{*/
@@ -1077,6 +1116,7 @@ output_if_debug(const char *prefixString, const char *outputString,
}
}
+
/**
* When a new type of error is recorded, print a message describing
* previous errors which were accumulated.
@@ -1149,6 +1189,7 @@ _mesa_problem( const struct gl_context *ctx, const char *fmtString, ... )
}
}
+
static GLboolean
should_output(struct gl_context *ctx, GLenum error, const char *fmtString)
{
@@ -1185,6 +1226,7 @@ should_output(struct gl_context *ctx, GLenum error, const char *fmtString)
return GL_FALSE;
}
+
void
_mesa_gl_debug(struct gl_context *ctx,
GLuint *id,
@@ -1247,7 +1289,8 @@ _mesa_error( struct gl_context *ctx, GLenum error, const char *fmtString, ... )
if (len >= MAX_DEBUG_MESSAGE_LENGTH) {
/* Too long error message. Whoever calls _mesa_error should use
- * shorter strings. */
+ * shorter strings.
+ */
ASSERT(0);
return;
}