[Mesa-dev] [PATCH v2 1/2] gallium: expose a debug message callback settable by context owner

Ilia Mirkin imirkin at alum.mit.edu
Fri Oct 30 14:26:59 PDT 2015


This will allow gallium drivers to send messages to KHR_debug endpoints

Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
---
 src/gallium/auxiliary/util/u_debug.h | 38 ++++++++++++++++++++++++++++++++++++
 src/gallium/docs/source/context.rst  |  3 +++
 src/gallium/include/pipe/p_context.h |  4 ++++
 src/gallium/include/pipe/p_defines.h | 35 +++++++++++++++++++++++++++++++++
 src/gallium/include/pipe/p_state.h   | 29 +++++++++++++++++++++++++++
 src/mesa/state_tracker/st_context.c  | 22 ++++++++++++++++++++-
 6 files changed, 130 insertions(+), 1 deletion(-)

diff --git a/src/gallium/auxiliary/util/u_debug.h b/src/gallium/auxiliary/util/u_debug.h
index 926063a..08d0efc 100644
--- a/src/gallium/auxiliary/util/u_debug.h
+++ b/src/gallium/auxiliary/util/u_debug.h
@@ -42,6 +42,7 @@
 #include "os/os_misc.h"
 
 #include "pipe/p_format.h"
+#include "pipe/p_state.h"
 
 
 #ifdef	__cplusplus
@@ -262,6 +263,43 @@ void _debug_assert_fail(const char *expr,
    _debug_printf("error: %s\n", __msg)
 #endif
 
+/**
+ * Output a debug log message to the debug info callback.
+ */
+#define pipe_debug_message(info, source, type, severity, fmt, ...) do { \
+   static unsigned id = 0; \
+   _pipe_debug_message(info, &id, \
+                       PIPE_DEBUG_SOURCE_ ## source,\
+                       PIPE_DEBUG_TYPE_ ## type, \
+                       PIPE_DEBUG_SEVERITY_ ## severity, \
+                       fmt, __VA_ARGS__); \
+} while (0)
+
+static inline void
+_pipe_debug_message(
+   struct pipe_debug_info *info,
+   unsigned *id,
+   enum pipe_debug_source source,
+   enum pipe_debug_type type,
+   enum pipe_debug_severity severity,
+   const char *fmt, ...) _util_printf_format(6, 7);
+
+static inline void
+_pipe_debug_message(
+   struct pipe_debug_info *info,
+   unsigned *id,
+   enum pipe_debug_source source,
+   enum pipe_debug_type type,
+   enum pipe_debug_severity severity,
+   const char *fmt, ...)
+{
+   va_list args;
+   va_start(args, fmt);
+   if (info && info->debug_message)
+      info->debug_message(info->data, id, source, type, severity, fmt, args);
+   va_end(args);
+}
+
 
 /**
  * Used by debug_dump_enum and debug_dump_flags to describe symbols.
diff --git a/src/gallium/docs/source/context.rst b/src/gallium/docs/source/context.rst
index a7d08d2..5cae4d6 100644
--- a/src/gallium/docs/source/context.rst
+++ b/src/gallium/docs/source/context.rst
@@ -84,6 +84,9 @@ objects. They all follow simple, one-method binding calls, e.g.
     levels. This corresponds to GL's ``PATCH_DEFAULT_OUTER_LEVEL``.
   * ``default_inner_level`` is the default value for the inner tessellation
     levels. This corresponds to GL's ``PATCH_DEFAULT_INNER_LEVEL``.
+* ``set_debug_info`` sets the callback to be used for reporting
+  various debug messages, eventually reported via KHR_debug and
+  similar mechanisms.
 
 
 Sampler Views
diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h
index 6f9fe76..0d5eeab 100644
--- a/src/gallium/include/pipe/p_context.h
+++ b/src/gallium/include/pipe/p_context.h
@@ -45,6 +45,7 @@ struct pipe_blit_info;
 struct pipe_box;
 struct pipe_clip_state;
 struct pipe_constant_buffer;
+struct pipe_debug_info;
 struct pipe_depth_stencil_alpha_state;
 struct pipe_draw_info;
 struct pipe_fence_handle;
@@ -238,6 +239,9 @@ struct pipe_context {
                           const float default_outer_level[4],
                           const float default_inner_level[2]);
 
+   void (*set_debug_info)(struct pipe_context *,
+                          struct pipe_debug_info *);
+
    /**
     * Bind an array of shader buffers that will be used by a shader.
     * Any buffers that were previously bound to the specified range
diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
index b15c880..860ebc6 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -868,6 +868,41 @@ struct pipe_driver_query_group_info
    unsigned num_queries;
 };
 
+enum pipe_debug_source
+{
+   PIPE_DEBUG_SOURCE_API,
+   PIPE_DEBUG_SOURCE_WINDOW_SYSTEM,
+   PIPE_DEBUG_SOURCE_SHADER_COMPILER,
+   PIPE_DEBUG_SOURCE_THIRD_PARTY,
+   PIPE_DEBUG_SOURCE_APPLICATION,
+   PIPE_DEBUG_SOURCE_OTHER,
+   PIPE_DEBUG_SOURCE_COUNT
+};
+
+enum pipe_debug_type
+{
+   PIPE_DEBUG_TYPE_ERROR,
+   PIPE_DEBUG_TYPE_DEPRECATED,
+   PIPE_DEBUG_TYPE_UNDEFINED,
+   PIPE_DEBUG_TYPE_PORTABILITY,
+   PIPE_DEBUG_TYPE_PERFORMANCE,
+   PIPE_DEBUG_TYPE_OTHER,
+   PIPE_DEBUG_TYPE_MARKER,
+   PIPE_DEBUG_TYPE_PUSH_GROUP,
+   PIPE_DEBUG_TYPE_POP_GROUP,
+   PIPE_DEBUG_TYPE_COUNT
+};
+
+enum pipe_debug_severity
+{
+   PIPE_DEBUG_SEVERITY_LOW,
+   PIPE_DEBUG_SEVERITY_MEDIUM,
+   PIPE_DEBUG_SEVERITY_HIGH,
+   PIPE_DEBUG_SEVERITY_NOTIFICATION,
+   PIPE_DEBUG_SEVERITY_COUNT
+};
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
index 4bf8d46..2843bb6 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -684,6 +684,35 @@ struct pipe_compute_state
    unsigned req_input_mem; /**< Required size of the INPUT resource. */
 };
 
+/**
+ * Structure that contains a callback for debug messages from the driver back
+ * to the state tracker.
+ */
+struct pipe_debug_info
+{
+   /**
+    * Callback for the driver to report debug/performance/etc information back
+    * to the state tracker.
+    *
+    * \param data       user-supplied data pointer
+    * \param id         message type identifier, if pointed value is 0, then a
+    *                   new id is assigned
+    * \param source     PIPE_DEBUG_SOURCE_*
+    * \param type       PIPE_DEBUG_TYPE_*
+    * \param severity   PIPE_DEBUG_SEVERITY_*
+    * \param format     printf-style format string
+    * \param args       args for format string
+    */
+   void (*debug_message)(void *data,
+                         unsigned *id,
+                         enum pipe_debug_source source,
+                         enum pipe_debug_type type,
+                         enum pipe_debug_severity severity,
+                         const char *fmt,
+                         va_list args);
+   void *data;
+};
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index 6e20fd1..0cdd135 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -106,6 +106,19 @@ void st_invalidate_state(struct gl_context * ctx, GLuint new_state)
    _vbo_InvalidateState(ctx, new_state);
 }
 
+static void
+st_debug_message(void *data,
+                 unsigned *id,
+                 enum pipe_debug_source source,
+                 enum pipe_debug_type type,
+                 enum pipe_debug_severity severity,
+                 const char *fmt,
+                 va_list args)
+{
+   struct st_context *st = data;
+   _mesa_gl_vdebug(st->ctx, id, source, type, severity, fmt, args);
+}
+
 
 static void
 st_destroy_context_priv(struct st_context *st)
@@ -120,6 +133,9 @@ st_destroy_context_priv(struct st_context *st)
    st_destroy_drawtex(st);
    st_destroy_perfmon(st);
 
+   if (st->pipe->set_debug_info)
+      st->pipe->set_debug_info(st->pipe, NULL);
+
    for (shader = 0; shader < ARRAY_SIZE(st->state.sampler_views); shader++) {
       for (i = 0; i < ARRAY_SIZE(st->state.sampler_views[0]); i++) {
          pipe_sampler_view_release(st->pipe,
@@ -162,7 +178,11 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
 
    /* XXX: this is one-off, per-screen init: */
    st_debug_init();
-   
+   if (pipe->set_debug_info) {
+      struct pipe_debug_info info = { st_debug_message, st };
+      pipe->set_debug_info(pipe, &info);
+   }
+
    /* state tracker needs the VBO module */
    _vbo_CreateContext(ctx);
 
-- 
2.4.10



More information about the mesa-dev mailing list