From 20afd5c45bc5d805d60522965dae1c9dd8aef129 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Mon, 22 Oct 2018 16:11:58 +0200 Subject: [PATCH] debug: Add skeleton for switchable logging No real flags are defined, only the macros and functions. VREND_DEBUG(flag, ctx, ...) translates to fprintf(stderr, ...) that is enabled based on whether logging is enabled for flag in context ctx VREND_DEBUG_EXT(flag, ctx, X) can be used to add code sequenses as X, e.g. specific logging calls like for streams. v2: Make use of variadic macros to make the VREND_DEBUG macro more like a call to *printf (Following a suggestion by Gurchetan) v3: Already include debug header in vrend_renderer.c Reviewed-by: Gurchetan Singh Tested-by: Jakob Bornecrantz Signed-off-by: Gert Wollny Signed-off-by: Jakob Bornecrantz --- src/Makefile.am | 2 ++ src/vrend_debug.c | 48 +++++++++++++++++++++++++++++++++++ src/vrend_debug.h | 59 ++++++++++++++++++++++++++++++++++++++++++++ src/vrend_renderer.c | 18 +++++++++++++- src/vrend_renderer.h | 4 +++ 5 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 src/vrend_debug.c create mode 100644 src/vrend_debug.h diff --git a/src/Makefile.am b/src/Makefile.am index e7c3fda..ee5fc27 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -27,6 +27,8 @@ libvrend_la_SOURCES = \ vrend_shader.h \ vrend_object.c \ vrend_object.h \ + vrend_debug.c \ + vrend_debug.h \ vrend_decode.c \ vrend_formats.c \ vrend_blitter.c \ diff --git a/src/vrend_debug.c b/src/vrend_debug.c new file mode 100644 index 0000000..9bf8727 --- /dev/null +++ b/src/vrend_debug.c @@ -0,0 +1,48 @@ +/************************************************************************** + * + * Copyright (C) 2018 Collabora Ltd + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#include "vrend_debug.h" +#include "vrend_renderer.h" +#include "util/u_debug.h" +#include +#include +static const struct debug_named_value vrend_debug_options[] = { + DEBUG_NAMED_VALUE_END +}; + +static uint64_t vrend_debug_flags = 0; +static int vrend_debug_flags_initalized = 0; +void vrend_init_debug_flags() +{ + if (!vrend_debug_flags_initalized) { + vrend_debug_flags_initalized = 1; + vrend_debug_flags = debug_get_flags_option("VREND_DEBUG", + vrend_debug_options, 0); + } +} + +unsigned vrend_debug(struct vrend_context *ctx, enum virgl_debug_flags flag) +{ + return (vrend_debug_flags & flag) || vrend_context_has_debug_flag(ctx, flag); +} diff --git a/src/vrend_debug.h b/src/vrend_debug.h new file mode 100644 index 0000000..b9126de --- /dev/null +++ b/src/vrend_debug.h @@ -0,0 +1,59 @@ +/************************************************************************** + * + * Copyright (C) 2018 Collabora Ltd + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#ifndef vrend_debug_h +#define vrend_debug_h + +struct vrend_context; +void vrend_print_context_name(struct vrend_context *ctx); + +enum virgl_debug_flags { + dummy +}; + +void vrend_init_debug_flags(void); + +unsigned vrend_debug(struct vrend_context *ctx, enum virgl_debug_flags flag); + +#ifndef NDEBUG +#define VREND_DEBUG(flag, ctx, ...) \ + if (vrend_debug(ctx, flag)) \ + do { \ + vrend_print_context_name(ctx); \ + fprintf(stderr, __VA_ARGS__); \ + } while (0) + +#define VREND_DEBUG_EXT(flag, ctx, X) \ + if (vrend_debug(ctx, flag)) \ + do { \ + vrend_print_context_name(ctx); \ + X; \ + } while (0) + +#else +#define VREND_DEBUG(flag, ctx, fmt, ...) +#define VREND_DEBUG_EXT(flag, ctx, X) +#endif + +#endif diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index 93e782f..5fc23e7 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -47,6 +47,7 @@ #include "vrend_shader.h" #include "vrend_renderer.h" +#include "vrend_debug.h" #include "virgl_hw.h" @@ -577,6 +578,8 @@ struct vrend_context { struct list_head ctx_entry; struct vrend_shader_cfg shader_cfg; + + unsigned debug_flags; }; static struct vrend_resource *vrend_renderer_ctx_res_lookup(struct vrend_context *ctx, int res_handle); @@ -8632,6 +8635,19 @@ void vrend_renderer_create_sub_ctx(struct vrend_context *ctx, int sub_ctx_id) ctx->sub0 = sub; } +unsigned vrend_context_has_debug_flag(struct vrend_context *ctx, enum virgl_debug_flags flag) +{ + return ctx && (ctx->debug_flags & flag); +} + +void vrend_print_context_name(struct vrend_context *ctx) +{ + if (ctx) + fprintf(stderr, "%s: ", ctx->debug_name); + else + fprintf(stderr, "HOST: "); +} + void vrend_renderer_destroy_sub_ctx(struct vrend_context *ctx, int sub_ctx_id) { struct vrend_sub_context *sub, *tofree = NULL; @@ -8699,7 +8715,7 @@ void vrend_renderer_reset(void) vrend_object_fini_resource_table(); vrend_decode_reset(true); vrend_object_init_resource_table(); - vrend_renderer_context_create_internal(0, 0, NULL); + vrend_renderer_context_create_internal(0, strlen("HOST"), "HOST"); } int vrend_renderer_get_poll_fd(void) diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h index e495147..f0873be 100644 --- a/src/vrend_renderer.h +++ b/src/vrend_renderer.h @@ -28,6 +28,7 @@ #include "pipe/p_state.h" #include "util/u_inlines.h" #include "virgl_protocol.h" +#include "vrend_debug.h" #include "vrend_iov.h" #include "virgl_hw.h" #include @@ -409,6 +410,9 @@ void vrend_renderer_reset(void); int vrend_renderer_get_poll_fd(void); void vrend_decode_reset(bool ctx_0_only); +unsigned vrend_context_has_debug_flag(struct vrend_context *ctx, + enum virgl_debug_flags flag); + unsigned vrend_renderer_query_multisample_caps(unsigned max_samples, struct virgl_caps_v2 *caps);