<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2016-11-16 0:05 GMT+01:00 Brian Paul <span dir="ltr"><<a href="mailto:brianp@vmware.com" target="_blank">brianp@vmware.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">A number of drivers report useful debug/perf information accessible<br>
through GL_ARB_debug_output and with debug contexts (i.e. setting the<br>
GLX_CONTEXT_DEBUG_BIT_ARB flag).  But few applications actually use<br>
the GL_ARB_debug_output extension.<br>
<br>
This change lets one set the MESA_DEBUG env var to "context" to force-set<br>
a debug context and report debug/perf messages to stderr (or whatever<br>
file MESA_LOG_FILE is set to).  This is a useful debugging tool.<br>
<br>
The small change in st_api_create_context() is needed so that<br>
st_update_debug_callback() gets called to hook up the driver debug<br>
callbacks when ST_CONTEXT_FLAG_DEBUG was not set, but MESA_DEBUG=context.<br>
---<br>
 src/mesa/main/debug.c               |  3 ++-<br>
 src/mesa/main/debug_output.c        | 28 ++++++++++++++++++++++++++++<br>
 src/mesa/main/mtypes.h              |  3 ++-<br>
 src/mesa/state_tracker/st_<wbr>manager.c |  2 ++<br>
 4 files changed, 34 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/src/mesa/main/debug.c b/src/mesa/main/debug.c<br>
index 5ca7d5c..3471b26 100644<br>
--- a/src/mesa/main/debug.c<br>
+++ b/src/mesa/main/debug.c<br>
@@ -189,7 +189,8 @@ set_debug_flags(const char *str)<br>
       { "silent", DEBUG_SILENT }, /* turn off debug messages */<br>
       { "flush", DEBUG_ALWAYS_FLUSH }, /* flush after each drawing command */<br>
       { "incomplete_tex", DEBUG_INCOMPLETE_TEXTURE },<br>
-      { "incomplete_fbo", DEBUG_INCOMPLETE_FBO }<br>
+      { "incomplete_fbo", DEBUG_INCOMPLETE_FBO },<br>
+      { "context", DEBUG_CONTEXT } /* force set GL_CONTEXT_FLAG_DEBUG_BIT flag */<br>
    };<br>
    GLuint i;<br>
<br>
diff --git a/src/mesa/main/debug_output.c b/src/mesa/main/debug_output.c<br>
index 85f64bd..290d626 100644<br>
--- a/src/mesa/main/debug_output.c<br>
+++ b/src/mesa/main/debug_output.c<br>
@@ -99,6 +99,7 @@ struct gl_debug_state<br>
    const void *CallbackData;<br>
    GLboolean SyncOutput;<br>
    GLboolean DebugOutput;<br>
+   GLboolean LogToStderr;<br>
<br>
    struct gl_debug_group *Groups[MAX_DEBUG_GROUP_STACK_<wbr>DEPTH];<br>
    struct gl_debug_message GroupMessages[MAX_DEBUG_GROUP_<wbr>STACK_DEPTH];<br>
@@ -617,6 +618,17 @@ debug_log_message(struct gl_debug_state *debug,<br>
    GLint nextEmpty;<br>
    struct gl_debug_message *emptySlot;<br>
<br>
+   if (debug->LogToStderr) {<br>
+      /* since 'buf' is not null terminated, make a copy and add \0 */<br>
+      char *buf2 = malloc(len + 1);<br>
+      if (buf2) {<br>
+         memcpy(buf2, buf, len);<br>
+         buf2[len] = 0;<br>
+         _mesa_log("Mesa debug output: %s\n", buf2);<br>
+         free(buf2);<br>
+      }<br>
+   }<br>
+<br>
    assert(len < MAX_DEBUG_MESSAGE_LENGTH);<br>
<br>
    if (log->NumMessages == MAX_DEBUG_LOGGED_MESSAGES)<br>
@@ -845,6 +857,7 @@ log_msg_locked_and_unlock(<wbr>struct gl_context *ctx,<br>
    }<br>
<br>
    if (ctx->Debug->Callback) {<br>
+      /* Call the user's callback function */<br>
       GLenum gl_source = debug_source_enums[source];<br>
       GLenum gl_type = debug_type_enums[type];<br>
       GLenum gl_severity = debug_severity_enums[severity]<wbr>;<br>
@@ -860,6 +873,7 @@ log_msg_locked_and_unlock(<wbr>struct gl_context *ctx,<br>
       callback(gl_source, gl_type, id, gl_severity, len, buf, data);<br>
    }<br>
    else {<br>
+      /* add debug message to queue */<br>
       debug_log_message(ctx->Debug, source, type, id, severity, len, buf);<br>
       _mesa_unlock_debug_state(ctx);<br>
    }<br>
@@ -1267,6 +1281,20 @@ void<br>
 _mesa_init_debug_output(struct gl_context *ctx)<br>
 {<br>
    mtx_init(&ctx->DebugMutex, mtx_plain);<br>
+<br>
+   if (MESA_DEBUG_FLAGS & DEBUG_CONTEXT) {<br>
+      /* If the MESA_DEBUG env is set to "context", we'll turn on the<br>
+       * GL_CONTEXT_FLAG_DEBUG_BIT context flag and log debug output<br>
+       * messages to stderr (or whatever MESA_LOG_FILE points at).<br>
+       */<br>
+      struct gl_debug_state *debug = _mesa_lock_debug_state(ctx);<br>
+      if (!debug) {<br>
+         return;<br>
+      }<br>
+      debug->DebugOutput = GL_TRUE;<br>
+      debug->LogToStderr = GL_TRUE;<br>
+      ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT;<br></blockquote><div><br></div><div>Don't we want to perform an <span style="font-size:12.8px">_mesa_unlock_debug_state(ctx); here?</span></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">Regards,</span></div><div><span style="font-size:12.8px">Gustaw</span></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+   }<br>
 }<br>
<br>
<br>
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h<br>
index 5e98040..66bc07e 100644<br>
--- a/src/mesa/main/mtypes.h<br>
+++ b/src/mesa/main/mtypes.h<br>
@@ -4679,7 +4679,8 @@ enum _debug<br>
    DEBUG_SILENT                 = (1 << 0),<br>
    DEBUG_ALWAYS_FLUSH          = (1 << 1),<br>
    DEBUG_INCOMPLETE_TEXTURE     = (1 << 2),<br>
-   DEBUG_INCOMPLETE_FBO         = (1 << 3)<br>
+   DEBUG_INCOMPLETE_FBO         = (1 << 3),<br>
+   DEBUG_CONTEXT                = (1 << 4)<br>
 };<br>
<br>
 #ifdef __cplusplus<br>
diff --git a/src/mesa/state_tracker/st_<wbr>manager.c b/src/mesa/state_tracker/st_<wbr>manager.c<br>
index 0f71e63..c3d8286 100644<br>
--- a/src/mesa/state_tracker/st_<wbr>manager.c<br>
+++ b/src/mesa/state_tracker/st_<wbr>manager.c<br>
@@ -680,7 +680,9 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi,<br>
       }<br>
<br>
       st->ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT;<br>
+   }<br>
<br>
+   if (st->ctx->Const.ContextFlags & GL_CONTEXT_FLAG_DEBUG_BIT) {<br>
       st_update_debug_callback(st);<br>
    }<br>
<span class="gmail-HOEnZb"><font color="#888888"><br>
--<br>
1.9.1<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>