From: Nicolai Hähnle Date: Mon, 4 Jan 2016 22:31:05 +0000 (-0500) Subject: st/mesa: make KHR_debug output independent of context creation flags (v2) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2123bfcc9c8b375ba46bb59d493ddeac1b7291a6;hp=b16c9be4a5561bd825176a228c300331f989e837;p=mesa.git st/mesa: make KHR_debug output independent of context creation flags (v2) 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. v2: - re-add the proper initialization of debug contexts (Ilia Mirkin) - silence a potential warning (Ilia Mirkin) Reviewed-by: Ilia Mirkin --- diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index 724c3c5938a..31cc99dca89 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -79,6 +79,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() */ @@ -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 6d859c6ab5b..134366db09d 100644 --- a/src/mesa/state_tracker/st_debug.c +++ b/src/mesa/state_tracker/st_debug.c @@ -104,3 +104,75 @@ 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; + default: + unreachable("invalid debug type"); + } + _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 288eccf9f9c..ed3ead82914 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 d0d261f4fde..385e26b946e 100644 --- a/src/mesa/state_tracker/st_manager.c +++ b/src/mesa/state_tracker/st_manager.c @@ -39,6 +39,7 @@ #include "st_texture.h" #include "st_context.h" +#include "st_debug.h" #include "st_extensions.h" #include "st_format.h" #include "st_cb_fbo.h" @@ -623,58 +624,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,17 +672,15 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi, return NULL; } - if (attribs->flags & ST_CONTEXT_FLAG_DEBUG){ + 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; } + 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); - } + st_enable_debug_output(st, TRUE); } if (attribs->flags & ST_CONTEXT_FLAG_FORWARD_COMPATIBLE)