[Mesa-dev] [PATCH] st/mesa: make KHR_debug output independent of context creation flags
Ilia Mirkin
imirkin at alum.mit.edu
Mon Jan 4 14:40:36 PST 2016
On Mon, Jan 4, 2016 at 5:34 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> Instead, keep track of GL_DEBUG_OUTPUT and (un)install the pipe_debug_callback
> accordingly. Hardware drivers can still use the absence of the callback to
> skip more expensive operations in the normal case, and users can no longer be
> surprised by the need to set the debug flag at context creation time.
> ---
> src/mesa/state_tracker/st_context.c | 18 ++++++++++
> src/mesa/state_tracker/st_debug.c | 70 +++++++++++++++++++++++++++++++++++++
> src/mesa/state_tracker/st_debug.h | 4 +++
> src/mesa/state_tracker/st_manager.c | 64 +--------------------------------
> 4 files changed, 93 insertions(+), 63 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
> index 724c3c5..31cc99d 100644
> --- a/src/mesa/state_tracker/st_context.c
> +++ b/src/mesa/state_tracker/st_context.c
> @@ -80,6 +80,23 @@ DEBUG_GET_ONCE_BOOL_OPTION(mesa_mvp_dp4, "MESA_MVP_DP4", FALSE)
>
>
> /**
> + * Called via ctx->Driver.Enable()
> + */
> +static void st_Enable(struct gl_context * ctx, GLenum cap, GLboolean state)
> +{
> + struct st_context *st = st_context(ctx);
> +
> + switch (cap) {
> + case GL_DEBUG_OUTPUT:
> + st_enable_debug_output(st, state);
> + break;
> + default:
> + break;
> + }
> +}
> +
> +
> +/**
> * Called via ctx->Driver.UpdateState()
> */
> void st_invalidate_state(struct gl_context * ctx, GLuint new_state)
> @@ -457,5 +474,6 @@ void st_init_driver_functions(struct pipe_screen *screen,
>
> st_init_vdpau_functions(functions);
>
> + functions->Enable = st_Enable;
> functions->UpdateState = st_invalidate_state;
> }
> diff --git a/src/mesa/state_tracker/st_debug.c b/src/mesa/state_tracker/st_debug.c
> index 6d859c6..ac77558 100644
> --- a/src/mesa/state_tracker/st_debug.c
> +++ b/src/mesa/state_tracker/st_debug.c
> @@ -104,3 +104,73 @@ st_print_current(void)
> }
>
>
> +/**
> + * Installed as pipe_debug_callback when GL_DEBUG_OUTPUT is enabled.
> + */
> +static void
> +st_debug_message(void *data,
> + unsigned *id,
> + enum pipe_debug_type ptype,
> + const char *fmt,
> + va_list args)
> +{
> + struct st_context *st = data;
> + enum mesa_debug_source source;
> + enum mesa_debug_type type;
> + enum mesa_debug_severity severity;
> +
> + switch (ptype) {
> + case PIPE_DEBUG_TYPE_OUT_OF_MEMORY:
> + source = MESA_DEBUG_SOURCE_API;
> + type = MESA_DEBUG_TYPE_ERROR;
> + severity = MESA_DEBUG_SEVERITY_MEDIUM;
> + break;
> + case PIPE_DEBUG_TYPE_ERROR:
> + source = MESA_DEBUG_SOURCE_API;
> + type = MESA_DEBUG_TYPE_ERROR;
> + severity = MESA_DEBUG_SEVERITY_MEDIUM;
> + break;
> + case PIPE_DEBUG_TYPE_SHADER_INFO:
> + source = MESA_DEBUG_SOURCE_SHADER_COMPILER;
> + type = MESA_DEBUG_TYPE_OTHER;
> + severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> + break;
> + case PIPE_DEBUG_TYPE_PERF_INFO:
> + source = MESA_DEBUG_SOURCE_API;
> + type = MESA_DEBUG_TYPE_PERFORMANCE;
> + severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> + break;
> + case PIPE_DEBUG_TYPE_INFO:
> + source = MESA_DEBUG_SOURCE_API;
> + type = MESA_DEBUG_TYPE_OTHER;
> + severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> + break;
> + case PIPE_DEBUG_TYPE_FALLBACK:
> + source = MESA_DEBUG_SOURCE_API;
> + type = MESA_DEBUG_TYPE_PERFORMANCE;
> + severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> + break;
> + case PIPE_DEBUG_TYPE_CONFORMANCE:
> + source = MESA_DEBUG_SOURCE_API;
> + type = MESA_DEBUG_TYPE_OTHER;
> + severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> + break;
Perhaps add a
default:
unreachable("invalid debug type");
to avoid the stupid compiler warning?
> + }
> + _mesa_gl_vdebug(st->ctx, id, source, type, severity, fmt, args);
> +}
> +
> +void
> +st_enable_debug_output(struct st_context *st, boolean enable)
> +{
> + struct pipe_context *pipe = st->pipe;
> +
> + if (!pipe->set_debug_callback)
> + return;
> +
> + if (enable) {
> + struct pipe_debug_callback cb = { st_debug_message, st };
> + pipe->set_debug_callback(pipe, &cb);
> + } else {
> + pipe->set_debug_callback(pipe, NULL);
> + }
> +}
> diff --git a/src/mesa/state_tracker/st_debug.h b/src/mesa/state_tracker/st_debug.h
> index 288eccf..ed3ead8 100644
> --- a/src/mesa/state_tracker/st_debug.h
> +++ b/src/mesa/state_tracker/st_debug.h
> @@ -32,6 +32,8 @@
> #include "pipe/p_compiler.h"
> #include "util/u_debug.h"
>
> +struct st_context;
> +
> extern void
> st_print_current(void);
>
> @@ -59,6 +61,8 @@ extern int ST_DEBUG;
>
> void st_debug_init( void );
>
> +void st_enable_debug_output(struct st_context *st, boolean enable);
> +
> static inline void
> ST_DBG( unsigned flag, const char *fmt, ... )
> {
> diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
> index d0d261f..525aff7 100644
> --- a/src/mesa/state_tracker/st_manager.c
> +++ b/src/mesa/state_tracker/st_manager.c
> @@ -623,58 +623,6 @@ st_context_destroy(struct st_context_iface *stctxi)
> st_destroy_context(st);
> }
>
> -static void
> -st_debug_message(void *data,
> - unsigned *id,
> - enum pipe_debug_type ptype,
> - const char *fmt,
> - va_list args)
> -{
> - struct st_context *st = data;
> - enum mesa_debug_source source;
> - enum mesa_debug_type type;
> - enum mesa_debug_severity severity;
> -
> - switch (ptype) {
> - case PIPE_DEBUG_TYPE_OUT_OF_MEMORY:
> - source = MESA_DEBUG_SOURCE_API;
> - type = MESA_DEBUG_TYPE_ERROR;
> - severity = MESA_DEBUG_SEVERITY_MEDIUM;
> - break;
> - case PIPE_DEBUG_TYPE_ERROR:
> - source = MESA_DEBUG_SOURCE_API;
> - type = MESA_DEBUG_TYPE_ERROR;
> - severity = MESA_DEBUG_SEVERITY_MEDIUM;
> - break;
> - case PIPE_DEBUG_TYPE_SHADER_INFO:
> - source = MESA_DEBUG_SOURCE_SHADER_COMPILER;
> - type = MESA_DEBUG_TYPE_OTHER;
> - severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> - break;
> - case PIPE_DEBUG_TYPE_PERF_INFO:
> - source = MESA_DEBUG_SOURCE_API;
> - type = MESA_DEBUG_TYPE_PERFORMANCE;
> - severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> - break;
> - case PIPE_DEBUG_TYPE_INFO:
> - source = MESA_DEBUG_SOURCE_API;
> - type = MESA_DEBUG_TYPE_OTHER;
> - severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> - break;
> - case PIPE_DEBUG_TYPE_FALLBACK:
> - source = MESA_DEBUG_SOURCE_API;
> - type = MESA_DEBUG_TYPE_PERFORMANCE;
> - severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> - break;
> - case PIPE_DEBUG_TYPE_CONFORMANCE:
> - source = MESA_DEBUG_SOURCE_API;
> - type = MESA_DEBUG_TYPE_OTHER;
> - severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> - break;
> - }
> - _mesa_gl_vdebug(st->ctx, id, source, type, severity, fmt, args);
> -}
> -
> static struct st_context_iface *
> st_api_create_context(struct st_api *stapi, struct st_manager *smapi,
> const struct st_context_attribs *attribs,
> @@ -723,19 +671,9 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi,
> return NULL;
> }
>
> - if (attribs->flags & ST_CONTEXT_FLAG_DEBUG){
> - if (!_mesa_set_debug_state_int(st->ctx, GL_DEBUG_OUTPUT, GL_TRUE)) {
> - *error = ST_CONTEXT_ERROR_NO_MEMORY;
> - return NULL;
> - }
> + if (attribs->flags & ST_CONTEXT_FLAG_DEBUG)
> st->ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT;
>
> - if (pipe->set_debug_callback) {
> - struct pipe_debug_callback cb = { st_debug_message, st };
> - pipe->set_debug_callback(pipe, &cb);
> - }
> - }
driContextSetFlags initializes all the GL_DEBUG_OUTPUT stuff to true
for a debug context, I think you should do that too (as was previously
done, but you removed it?).
> -
> if (attribs->flags & ST_CONTEXT_FLAG_FORWARD_COMPATIBLE)
> st->ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT;
> if (attribs->flags & ST_CONTEXT_FLAG_ROBUST_ACCESS)
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list