[Mesa-dev] [PATCH] mesa: if MESA_DEBUG=context, create a debug context
Gustaw Smolarczyk
wielkiegie at gmail.com
Thu Nov 17 15:22:51 UTC 2016
2016-11-16 0:05 GMT+01:00 Brian Paul <brianp at vmware.com>:
> 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.
> ---
> src/mesa/main/debug.c | 3 ++-
> src/mesa/main/debug_output.c | 28 ++++++++++++++++++++++++++++
> src/mesa/main/mtypes.h | 3 ++-
> src/mesa/state_tracker/st_manager.c | 2 ++
> 4 files changed, 34 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/main/debug.c b/src/mesa/main/debug.c
> index 5ca7d5c..3471b26 100644
> --- a/src/mesa/main/debug.c
> +++ b/src/mesa/main/debug.c
> @@ -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;
>
> diff --git a/src/mesa/main/debug_output.c b/src/mesa/main/debug_output.c
> index 85f64bd..290d626 100644
> --- a/src/mesa/main/debug_output.c
> +++ b/src/mesa/main/debug_output.c
> @@ -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,17 @@ debug_log_message(struct gl_debug_state *debug,
> GLint nextEmpty;
> struct gl_debug_message *emptySlot;
>
> + if (debug->LogToStderr) {
> + /* since 'buf' is not null terminated, make a copy and add \0 */
> + char *buf2 = malloc(len + 1);
> + if (buf2) {
> + memcpy(buf2, buf, len);
> + buf2[len] = 0;
> + _mesa_log("Mesa debug output: %s\n", buf2);
> + free(buf2);
> + }
> + }
> +
> assert(len < MAX_DEBUG_MESSAGE_LENGTH);
>
> if (log->NumMessages == MAX_DEBUG_LOGGED_MESSAGES)
> @@ -845,6 +857,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 +873,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 +1281,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;
>
Don't we want to perform an _mesa_unlock_debug_state(ctx); here?
Regards,
Gustaw
> + }
> }
>
>
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 5e98040..66bc07e 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -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
> diff --git a/src/mesa/state_tracker/st_manager.c
> b/src/mesa/state_tracker/st_manager.c
> index 0f71e63..c3d8286 100644
> --- a/src/mesa/state_tracker/st_manager.c
> +++ b/src/mesa/state_tracker/st_manager.c
> @@ -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);
> }
>
> --
> 1.9.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161117/13973366/attachment-0001.html>
More information about the mesa-dev
mailing list