mesa: if MESA_DEBUG=context, create a debug context
authorBrian Paul <brianp@vmware.com>
Tue, 15 Nov 2016 22:56:04 +0000 (15:56 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 16 Nov 2016 16:34:10 +0000 (09:34 -0700)
A number of drivers report useful debug/perf information accessible
through GL_ARB_debug_output and with debug contexts (i.e. setting the
GLX_CONTEXT_DEBUG_BIT_ARB flag).  But few applications actually use
the GL_ARB_debug_output extension.

This change lets one set the MESA_DEBUG env var to "context" to force-set
a debug context and report debug/perf messages to stderr (or whatever
file MESA_LOG_FILE is set to).  This is a useful debugging tool.

The small change in st_api_create_context() is needed so that
st_update_debug_callback() gets called to hook up the driver debug
callbacks when ST_CONTEXT_FLAG_DEBUG was not set, but MESA_DEBUG=context.

v2: use %.*s format string instead of allocating temporary buffer.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/mesa/main/debug.c
src/mesa/main/debug_output.c
src/mesa/main/mtypes.h
src/mesa/state_tracker/st_manager.c

index 5ca7d5ce500a3ca886cc269dc673438b7c45f009..3471b26aad860bb11f20eb3c78274829ffb1703a 100644 (file)
@@ -189,7 +189,8 @@ set_debug_flags(const char *str)
       { "silent", DEBUG_SILENT }, /* turn off debug messages */
       { "flush", DEBUG_ALWAYS_FLUSH }, /* flush after each drawing command */
       { "incomplete_tex", DEBUG_INCOMPLETE_TEXTURE },
-      { "incomplete_fbo", DEBUG_INCOMPLETE_FBO }
+      { "incomplete_fbo", DEBUG_INCOMPLETE_FBO },
+      { "context", DEBUG_CONTEXT } /* force set GL_CONTEXT_FLAG_DEBUG_BIT flag */
    };
    GLuint i;
 
index 85f64bd459fd5a69a839ac81a18f4d6aa98a7f71..4e9209b2377cce8a72161d55456fffddec646e11 100644 (file)
@@ -99,6 +99,7 @@ struct gl_debug_state
    const void *CallbackData;
    GLboolean SyncOutput;
    GLboolean DebugOutput;
+   GLboolean LogToStderr;
 
    struct gl_debug_group *Groups[MAX_DEBUG_GROUP_STACK_DEPTH];
    struct gl_debug_message GroupMessages[MAX_DEBUG_GROUP_STACK_DEPTH];
@@ -617,6 +618,10 @@ debug_log_message(struct gl_debug_state *debug,
    GLint nextEmpty;
    struct gl_debug_message *emptySlot;
 
+   if (debug->LogToStderr) {
+      _mesa_log("Mesa debug output: %.*s\n", len, buf);
+   }
+
    assert(len < MAX_DEBUG_MESSAGE_LENGTH);
 
    if (log->NumMessages == MAX_DEBUG_LOGGED_MESSAGES)
@@ -845,6 +850,7 @@ log_msg_locked_and_unlock(struct gl_context *ctx,
    }
 
    if (ctx->Debug->Callback) {
+      /* Call the user's callback function */
       GLenum gl_source = debug_source_enums[source];
       GLenum gl_type = debug_type_enums[type];
       GLenum gl_severity = debug_severity_enums[severity];
@@ -860,6 +866,7 @@ log_msg_locked_and_unlock(struct gl_context *ctx,
       callback(gl_source, gl_type, id, gl_severity, len, buf, data);
    }
    else {
+      /* add debug message to queue */
       debug_log_message(ctx->Debug, source, type, id, severity, len, buf);
       _mesa_unlock_debug_state(ctx);
    }
@@ -1267,6 +1274,20 @@ void
 _mesa_init_debug_output(struct gl_context *ctx)
 {
    mtx_init(&ctx->DebugMutex, mtx_plain);
+
+   if (MESA_DEBUG_FLAGS & DEBUG_CONTEXT) {
+      /* If the MESA_DEBUG env is set to "context", we'll turn on the
+       * GL_CONTEXT_FLAG_DEBUG_BIT context flag and log debug output
+       * messages to stderr (or whatever MESA_LOG_FILE points at).
+       */
+      struct gl_debug_state *debug = _mesa_lock_debug_state(ctx);
+      if (!debug) {
+         return;
+      }
+      debug->DebugOutput = GL_TRUE;
+      debug->LogToStderr = GL_TRUE;
+      ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT;
+   }
 }
 
 
index 5e9804036c098e44c9c36e6476bebb605211ee99..66bc07e59632586a2650d25300fe36d97ef6ee27 100644 (file)
@@ -4679,7 +4679,8 @@ enum _debug
    DEBUG_SILENT                 = (1 << 0),
    DEBUG_ALWAYS_FLUSH          = (1 << 1),
    DEBUG_INCOMPLETE_TEXTURE     = (1 << 2),
-   DEBUG_INCOMPLETE_FBO         = (1 << 3)
+   DEBUG_INCOMPLETE_FBO         = (1 << 3),
+   DEBUG_CONTEXT                = (1 << 4)
 };
 
 #ifdef __cplusplus
index 0f71e6311b1f901ac73a116167701b5858de8255..c3d8286b5a712daa0c7d2a592e0737d34c0b6492 100644 (file)
@@ -680,7 +680,9 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi,
       }
 
       st->ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT;
+   }
 
+   if (st->ctx->Const.ContextFlags & GL_CONTEXT_FLAG_DEBUG_BIT) {
       st_update_debug_callback(st);
    }