On 10/31/2015 11:45 AM, Ilia Mirkin wrote:
On Sat, Oct 31, 2015 at 10:23 AM, Brian Paul <bri...@vmware.com> wrote:On 10/30/2015 11:15 PM, Ilia Mirkin wrote:This will allow gallium drivers to send messages to KHR_debug endpoints Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> --- src/gallium/auxiliary/util/u_debug.c | 16 ++++++++++++++++ src/gallium/auxiliary/util/u_debug.h | 24 ++++++++++++++++++++++++ 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 +++++++++++++++++++++++++++++ 6 files changed, 111 insertions(+) diff --git a/src/gallium/auxiliary/util/u_debug.c b/src/gallium/auxiliary/util/u_debug.c index 7388a49..81280ea 100644 --- a/src/gallium/auxiliary/util/u_debug.c +++ b/src/gallium/auxiliary/util/u_debug.c @@ -70,6 +70,22 @@ void _debug_vprintf(const char *format, va_list ap) #endif } +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); +} + void debug_disable_error_message_boxes(void) diff --git a/src/gallium/auxiliary/util/u_debug.h b/src/gallium/auxiliary/util/u_debug.h index 926063a..a4ce88b 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_defines.h" #ifdef __cplusplus @@ -262,6 +263,29 @@ 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) + +struct pipe_debug_info; + +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); + /** * 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 *);Evidently, the implementation of this function must make a copy of the pipe_debug_info and can't just save the pointer. Could you add a comment about that? 'info' could be const-qualified too.Will do. I believe that's how all the set_foo's work though, no?
I think so but would have to check to be sure.
+ /** * 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 +};I think these enums are overkill and not really a good match for what we want to communicate. In nouveau you report fence stalls as API, OTHER, NOTIFICATION. At least, OTHER could be replaced with PERFORMANCE, I think. In nv50/nvc0, shader info is reported as SHADER_COMPILER, OTHER, NOTIFICATION. I can imagine a lot of future messages being reported as OTHER/NOTIFICATION, which doesn't add much value.SHADER_COMPILER/OTHER/NOTIFICATION is what the i965 compiler uses to report shader-db info, and what the shader-db runner is rigged for.Maybe we could boil things down to a single enum. How about: enum pipe_debug_type { PIPE_DEBUG_TYPE_OUT_OF_MEMORY, PIPE_DEBUG_TYPE_ERROR, // generic errors PIPE_DEBUG_TYPE_SHADER_INFO, PIPE_DEBUG_TYPE_PERF_INFO, PIPE_DEBUG_TYPE_INFO, // generic info of interest PIPE_DEBUG_TYPE_FALLBACK, // some fallback was hit PIPE_DEBUG_TYPE_CONFORMANCE // non-conformance issue. };Sure! Can you provide the mapping that each one should have onto the KHR_debug/ARB_debug_output types? Please make sure that one of them is SHADER_COMPILER/OTHER/NOTIFICATION, as I need that for shader-db. The reason that I wanted to just reuse the GL types is that I have no idea what any of these mean or how they're meant to be distinguished from one another. My hope was that this would cause less bike-shedding.
How about this: PIPE_DEBUG_TYPE_OUT_OF_MEMORY: API/ERROR/MEDIUM PIPE_DEBUG_TYPE_ERROR: API/ERROR/MEDIUM PIPE_DEBUG_TYPE_SHADER_INFO: SHADER_COMPILER/OTHER/NOTIFICATION PIPE_DEBUG_TYPE_PERF_INFO: API/PERFORMANCE/NOTIFICATION PIPE_DEBUG_TYPE_INFO: API/OTHER/NOTIFICATION PIPE_DEBUG_TYPE_FALLBACK: API/PERFORMANCE/NOTIFICATION PIPE_DEBUG_TYPE_CONFORMANCE: API/OTHER/NOTIFICATION
Note that this will prevent virgl from passing the host's message types through, but I guess that's not such a huge deal.
Perhaps Dave can chime in if this is a concern for him now. -Brian _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev