Commit 2123bfcc authored by Nicolai Hähnle's avatar Nicolai Hähnle

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's avatarIlia Mirkin <imirkin@alum.mit.edu>
parent b16c9be4
......@@ -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;
}
......@@ -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);
}
}
......@@ -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, ... )
{
......
......@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment