[PATCH vkd3d 6/6] vkd3d-common: Rework debug infrastructure.

Giovanni Mascellani gmascellani at codeweavers.com
Thu May 12 08:54:17 CDT 2022


Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>

Il 10/05/22 20:21, Matteo Bruni ha scritto:
> Mostly so that the debug primitives don't depend on a shared
> variable.
> 
> Signed-off-by: Matteo Bruni <mbruni at codeweavers.com>
> ---
> This allows to keep using a separate debug env var for vkd3d-shader
> even when building vkd3d as static lib(s). That will eventually make
> it possible to drop the related change in the vkd3d copy imported into
> Wine.
> 
>   include/private/vkd3d_debug.h         | 32 +++++++++++++++++----------
>   libs/vkd3d-common/blob.c              |  2 ++
>   libs/vkd3d-common/debug.c             | 23 +++++++++----------
>   libs/vkd3d-common/error.c             |  2 ++
>   libs/vkd3d-common/memory.c            |  2 ++
>   libs/vkd3d-shader/d3dbc.c             |  2 ++
>   libs/vkd3d-shader/dxbc.c              |  2 ++
>   libs/vkd3d-shader/hlsl.c              |  2 ++
>   libs/vkd3d-shader/hlsl.l              |  2 ++
>   libs/vkd3d-shader/hlsl.y              |  2 ++
>   libs/vkd3d-shader/hlsl_codegen.c      |  2 ++
>   libs/vkd3d-shader/hlsl_constant_ops.c |  2 ++
>   libs/vkd3d-shader/hlsl_sm1.c          |  2 ++
>   libs/vkd3d-shader/hlsl_sm4.c          |  2 ++
>   libs/vkd3d-shader/preproc.l           |  2 ++
>   libs/vkd3d-shader/preproc.y           |  2 ++
>   libs/vkd3d-shader/spirv.c             |  2 ++
>   libs/vkd3d-shader/trace.c             |  2 ++
>   libs/vkd3d-shader/vkd3d_shader_main.c |  2 +-
>   libs/vkd3d/command.c                  |  2 ++
>   libs/vkd3d/device.c                   |  2 ++
>   libs/vkd3d/resource.c                 |  2 ++
>   libs/vkd3d/state.c                    |  2 ++
>   libs/vkd3d/utils.c                    |  2 ++
>   24 files changed, 73 insertions(+), 26 deletions(-)
> 
> diff --git a/include/private/vkd3d_debug.h b/include/private/vkd3d_debug.h
> index 8ab653ae..bc3bf5c9 100644
> --- a/include/private/vkd3d_debug.h
> +++ b/include/private/vkd3d_debug.h
> @@ -44,9 +44,15 @@ enum vkd3d_dbg_level
>       VKD3D_DBG_LEVEL_TRACE,
>   };
>   
> -enum vkd3d_dbg_level vkd3d_dbg_get_level(void);
> +struct vkd3d_debug_channel
> +{
> +    const char name[64];
> +    enum vkd3d_dbg_level level;
> +};
> +
> +enum vkd3d_dbg_level vkd3d_dbg_get_level(struct vkd3d_debug_channel *channel);
>   
> -void vkd3d_dbg_printf(enum vkd3d_dbg_level level, const char *function, const char *fmt, ...) VKD3D_PRINTF_FUNC(3, 4);
> +void vkd3d_dbg_printf(struct vkd3d_debug_channel *channel, enum vkd3d_dbg_level level, const char *function, const char *fmt, ...) VKD3D_PRINTF_FUNC(4, 5);
>   
>   const char *vkd3d_dbg_sprintf(const char *fmt, ...) VKD3D_PRINTF_FUNC(1, 2);
>   const char *vkd3d_dbg_vsprintf(const char *fmt, va_list args);
> @@ -54,13 +60,15 @@ const char *debugstr_a(const char *str);
>   const char *debugstr_an(const char *str, size_t n);
>   const char *debugstr_w(const WCHAR *wstr, size_t wchar_size);
>   
> -#define VKD3D_DBG_LOG(level) \
> +#define VKD3D_DBG_LOG(channel, level) \
>           do { \
> +        struct vkd3d_debug_channel *vkd3d_dbg_channel = &channel; \
>           const enum vkd3d_dbg_level vkd3d_dbg_level = VKD3D_DBG_LEVEL_##level; \
>           VKD3D_DBG_PRINTF
>   
> -#define VKD3D_DBG_LOG_ONCE(first_time_level, level) \
> +#define VKD3D_DBG_LOG_ONCE(channel, first_time_level, level) \
>           do { \
> +        struct vkd3d_debug_channel *vkd3d_dbg_channel = &channel; \
>           static bool vkd3d_dbg_next_time; \
>           const enum vkd3d_dbg_level vkd3d_dbg_level = vkd3d_dbg_next_time \
>           ? VKD3D_DBG_LEVEL_##level : VKD3D_DBG_LEVEL_##first_time_level; \
> @@ -68,29 +76,29 @@ const char *debugstr_w(const WCHAR *wstr, size_t wchar_size);
>           VKD3D_DBG_PRINTF
>   
>   #define VKD3D_DBG_PRINTF(...) \
> -        vkd3d_dbg_printf(vkd3d_dbg_level, __FUNCTION__, __VA_ARGS__); } while (0)
> +        vkd3d_dbg_printf(vkd3d_dbg_channel, vkd3d_dbg_level, __FUNCTION__, __VA_ARGS__); } while (0)
>   
>   #ifndef TRACE
> -#define TRACE VKD3D_DBG_LOG(TRACE)
> +#define TRACE VKD3D_DBG_LOG(vkd3d_debug_channel, TRACE)
>   #endif
>   
>   #ifndef WARN
> -#define WARN  VKD3D_DBG_LOG(WARN)
> +#define WARN  VKD3D_DBG_LOG(vkd3d_debug_channel, WARN)
>   #endif
>   
>   #ifndef FIXME
> -#define FIXME VKD3D_DBG_LOG(FIXME)
> +#define FIXME VKD3D_DBG_LOG(vkd3d_debug_channel, FIXME)
>   #endif
>   
> -#define ERR   VKD3D_DBG_LOG(ERR)
> +#define ERR   VKD3D_DBG_LOG(vkd3d_debug_channel, ERR)
>   
>   #ifndef TRACE_ON
> -#define TRACE_ON() (vkd3d_dbg_get_level() == VKD3D_DBG_LEVEL_TRACE)
> +#define TRACE_ON() (vkd3d_dbg_get_level(&vkd3d_debug_channel) == VKD3D_DBG_LEVEL_TRACE)
>   #endif
>   
> -#define FIXME_ONCE VKD3D_DBG_LOG_ONCE(FIXME, WARN)
> +#define FIXME_ONCE VKD3D_DBG_LOG_ONCE(vkd3d_debug_channel, FIXME, WARN)
>   
> -#define VKD3D_DEBUG_ENV_NAME(name) const char *vkd3d_dbg_env_name = name
> +#define VKD3D_DEBUG_ENV_NAME(name) static struct vkd3d_debug_channel vkd3d_debug_channel = {name, ~0u};
>   
>   static inline const char *debugstr_guid(const GUID *guid)
>   {
> diff --git a/libs/vkd3d-common/blob.c b/libs/vkd3d-common/blob.c
> index c46abb55..1cb817ce 100644
> --- a/libs/vkd3d-common/blob.c
> +++ b/libs/vkd3d-common/blob.c
> @@ -23,6 +23,8 @@
>   #include "vkd3d_debug.h"
>   #include "vkd3d_memory.h"
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG");
> +
>   struct vkd3d_blob
>   {
>       ID3D10Blob ID3DBlob_iface;
> diff --git a/libs/vkd3d-common/debug.c b/libs/vkd3d-common/debug.c
> index 4868f3fb..0cbf2fbe 100644
> --- a/libs/vkd3d-common/debug.c
> +++ b/libs/vkd3d-common/debug.c
> @@ -31,8 +31,6 @@
>   #define VKD3D_DEBUG_BUFFER_COUNT 64
>   #define VKD3D_DEBUG_BUFFER_SIZE 512
>   
> -extern const char *vkd3d_dbg_env_name;
> -
>   static const char *debug_level_names[] =
>   {
>       /* VKD3D_DBG_LEVEL_NONE  */ "none",
> @@ -42,37 +40,36 @@ static const char *debug_level_names[] =
>       /* VKD3D_DBG_LEVEL_TRACE */ "trace",
>   };
>   
> -enum vkd3d_dbg_level vkd3d_dbg_get_level(void)
> +enum vkd3d_dbg_level vkd3d_dbg_get_level(struct vkd3d_debug_channel *channel)
>   {
> -    static unsigned int level = ~0u;
>       const char *vkd3d_debug;
>       unsigned int i;
>   
> -    if (level != ~0u)
> -        return level;
> +    if (channel->level != ~0u)
> +        return channel->level;
>   
> -    if (!(vkd3d_debug = getenv(vkd3d_dbg_env_name)))
> +    if (!(vkd3d_debug = getenv(channel->name)))
>           vkd3d_debug = "";
>   
>       for (i = 0; i < ARRAY_SIZE(debug_level_names); ++i)
>       {
>           if (!strcmp(debug_level_names[i], vkd3d_debug))
>           {
> -            level = i;
> -            return level;
> +            channel->level = i;
> +            return channel->level;
>           }
>       }
>   
>       /* Default debug level. */
> -    level = VKD3D_DBG_LEVEL_FIXME;
> -    return level;
> +    channel->level = VKD3D_DBG_LEVEL_FIXME;
> +    return channel->level;
>   }
>   
> -void vkd3d_dbg_printf(enum vkd3d_dbg_level level, const char *function, const char *fmt, ...)
> +void vkd3d_dbg_printf(struct vkd3d_debug_channel *channel, enum vkd3d_dbg_level level, const char *function, const char *fmt, ...)
>   {
>       va_list args;
>   
> -    if (vkd3d_dbg_get_level() < level)
> +    if (vkd3d_dbg_get_level(channel) < level)
>           return;
>   
>       assert(level < ARRAY_SIZE(debug_level_names));
> diff --git a/libs/vkd3d-common/error.c b/libs/vkd3d-common/error.c
> index 81c1fd97..51928148 100644
> --- a/libs/vkd3d-common/error.c
> +++ b/libs/vkd3d-common/error.c
> @@ -19,6 +19,8 @@
>   #include "vkd3d_common.h"
>   #include "vkd3d_debug.h"
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG");
> +
>   HRESULT hresult_from_vkd3d_result(int vkd3d_result)
>   {
>       switch (vkd3d_result)
> diff --git a/libs/vkd3d-common/memory.c b/libs/vkd3d-common/memory.c
> index f46f180c..3546e136 100644
> --- a/libs/vkd3d-common/memory.c
> +++ b/libs/vkd3d-common/memory.c
> @@ -19,6 +19,8 @@
>   
>   #include "vkd3d_memory.h"
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG");
> +
>   void *vkd3d_malloc(size_t size)
>   {
>       void *ptr;
> diff --git a/libs/vkd3d-shader/d3dbc.c b/libs/vkd3d-shader/d3dbc.c
> index c5518752..e0e5c16e 100644
> --- a/libs/vkd3d-shader/d3dbc.c
> +++ b/libs/vkd3d-shader/d3dbc.c
> @@ -24,6 +24,8 @@
>   
>   #include "vkd3d_shader_private.h"
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   #define VKD3D_SM1_VS  0xfffeu
>   #define VKD3D_SM1_PS  0xffffu
>   
> diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
> index 17be2306..410ed371 100644
> --- a/libs/vkd3d-shader/dxbc.c
> +++ b/libs/vkd3d-shader/dxbc.c
> @@ -21,6 +21,8 @@
>   #include "vkd3d_shader_private.h"
>   #include "sm4.h"
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   void dxbc_writer_init(struct dxbc_writer *dxbc)
>   {
>       memset(dxbc, 0, sizeof(*dxbc));
> diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
> index 7239b183..ffee93a6 100644
> --- a/libs/vkd3d-shader/hlsl.c
> +++ b/libs/vkd3d-shader/hlsl.c
> @@ -22,6 +22,8 @@
>   #include "hlsl.h"
>   #include <stdio.h>
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   void hlsl_note(struct hlsl_ctx *ctx, const struct vkd3d_shader_location *loc,
>           enum vkd3d_shader_log_level level, const char *fmt, ...)
>   {
> diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l
> index 2c398bc8..70a24c16 100644
> --- a/libs/vkd3d-shader/hlsl.l
> +++ b/libs/vkd3d-shader/hlsl.l
> @@ -24,6 +24,8 @@
>   #include "hlsl.h"
>   #include "hlsl.tab.h"
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   #define YYSTYPE HLSL_YYSTYPE
>   #define YYLTYPE HLSL_YYLTYPE
>   
> diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
> index 44e4964f..7d2f5014 100644
> --- a/libs/vkd3d-shader/hlsl.y
> +++ b/libs/vkd3d-shader/hlsl.y
> @@ -108,6 +108,8 @@ int yylex(HLSL_YYSTYPE *yylval_param, HLSL_YYLTYPE *yylloc_param, void *yyscanne
>   %code
>   {
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   #define YYLLOC_DEFAULT(cur, rhs, n) (cur) = YYRHSLOC(rhs, !!n)
>   
>   static void yyerror(YYLTYPE *loc, void *scanner, struct hlsl_ctx *ctx, const char *s)
> diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
> index 78b22910..0794cebd 100644
> --- a/libs/vkd3d-shader/hlsl_codegen.c
> +++ b/libs/vkd3d-shader/hlsl_codegen.c
> @@ -21,6 +21,8 @@
>   #include "hlsl.h"
>   #include <stdio.h>
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   /* Split uniforms into two variables representing the constant and temp
>    * registers, and copy the former to the latter, so that writes to uniforms
>    * work. */
> diff --git a/libs/vkd3d-shader/hlsl_constant_ops.c b/libs/vkd3d-shader/hlsl_constant_ops.c
> index d8787c21..647afc98 100644
> --- a/libs/vkd3d-shader/hlsl_constant_ops.c
> +++ b/libs/vkd3d-shader/hlsl_constant_ops.c
> @@ -22,6 +22,8 @@
>   
>   #include "hlsl.h"
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   static bool fold_cast(struct hlsl_ctx *ctx, struct hlsl_ir_constant *dst, struct hlsl_ir_constant *src)
>   {
>       unsigned int k;
> diff --git a/libs/vkd3d-shader/hlsl_sm1.c b/libs/vkd3d-shader/hlsl_sm1.c
> index 0cdd3917..a6d14b32 100644
> --- a/libs/vkd3d-shader/hlsl_sm1.c
> +++ b/libs/vkd3d-shader/hlsl_sm1.c
> @@ -21,6 +21,8 @@
>   #include "hlsl.h"
>   #include <stdio.h>
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   bool hlsl_sm1_register_from_semantic(struct hlsl_ctx *ctx, const struct hlsl_semantic *semantic,
>           bool output, D3DSHADER_PARAM_REGISTER_TYPE *type, unsigned int *reg)
>   {
> diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c
> index a5fc094b..ce35d603 100644
> --- a/libs/vkd3d-shader/hlsl_sm4.c
> +++ b/libs/vkd3d-shader/hlsl_sm4.c
> @@ -23,6 +23,8 @@
>   #include "vkd3d_d3dcommon.h"
>   #include "sm4.h"
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   static void write_sm4_block(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *buffer, const struct hlsl_block *block);
>   
>   static bool type_is_integer(const struct hlsl_type *type)
> diff --git a/libs/vkd3d-shader/preproc.l b/libs/vkd3d-shader/preproc.l
> index 7686e018..f4db270d 100644
> --- a/libs/vkd3d-shader/preproc.l
> +++ b/libs/vkd3d-shader/preproc.l
> @@ -22,6 +22,8 @@
>   
>   #include "preproc.tab.h"
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   #undef ERROR  /* defined in wingdi.h */
>   
>   #define YYSTYPE PREPROC_YYSTYPE
> diff --git a/libs/vkd3d-shader/preproc.y b/libs/vkd3d-shader/preproc.y
> index 3f02ac03..79870503 100644
> --- a/libs/vkd3d-shader/preproc.y
> +++ b/libs/vkd3d-shader/preproc.y
> @@ -46,6 +46,8 @@ int preproc_yylex(PREPROC_YYSTYPE *yylval_param, PREPROC_YYLTYPE *yylloc_param,
>   %code
>   {
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   #define YYLLOC_DEFAULT(cur, rhs, n) (cur) = YYRHSLOC(rhs, !!n)
>   
>   #ifndef S_ISREG
> diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
> index 89b16305..b62a3f20 100644
> --- a/libs/vkd3d-shader/spirv.c
> +++ b/libs/vkd3d-shader/spirv.c
> @@ -34,6 +34,8 @@
>   # include "vulkan/GLSL.std.450.h"
>   #endif  /* HAVE_SPIRV_UNIFIED1_GLSL_STD_450_H */
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   #ifdef HAVE_SPIRV_TOOLS
>   # include "spirv-tools/libspirv.h"
>   
> diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c
> index 6c30edc9..80803d78 100644
> --- a/libs/vkd3d-shader/trace.c
> +++ b/libs/vkd3d-shader/trace.c
> @@ -27,6 +27,8 @@
>   #include <stdio.h>
>   #include <math.h>
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
> +
>   static const char * const shader_opcode_names[] =
>   {
>       [VKD3DSIH_ABS                             ] = "abs",
> diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
> index 62baf17f..398d430b 100644
> --- a/libs/vkd3d-shader/vkd3d_shader_main.c
> +++ b/libs/vkd3d-shader/vkd3d_shader_main.c
> @@ -140,7 +140,7 @@ void vkd3d_shader_trace_text_(const char *text, size_t size, const char *functio
>               q = end;
>           else
>               ++q;
> -        vkd3d_dbg_printf(VKD3D_DBG_LEVEL_TRACE, function, "%.*s", (int)(q - p), p);
> +        vkd3d_dbg_printf(&vkd3d_debug_channel, VKD3D_DBG_LEVEL_TRACE, function, "%.*s", (int)(q - p), p);
>       }
>   }
>   
> diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
> index 55e6be58..60928bfc 100644
> --- a/libs/vkd3d/command.c
> +++ b/libs/vkd3d/command.c
> @@ -20,6 +20,8 @@
>   
>   #include "vkd3d_private.h"
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG");
> +
>   static void d3d12_fence_incref(struct d3d12_fence *fence);
>   static void d3d12_fence_decref(struct d3d12_fence *fence);
>   static HRESULT d3d12_fence_signal(struct d3d12_fence *fence, uint64_t value, VkFence vk_fence);
> diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
> index 5f8108ec..cfc8ed89 100644
> --- a/libs/vkd3d/device.c
> +++ b/libs/vkd3d/device.c
> @@ -19,6 +19,8 @@
>   #include "vkd3d_private.h"
>   #include "vkd3d_version.h"
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG");
> +
>   struct vkd3d_struct
>   {
>       enum vkd3d_structure_type type;
> diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
> index 68c28cd1..596b8f9e 100644
> --- a/libs/vkd3d/resource.c
> +++ b/libs/vkd3d/resource.c
> @@ -24,6 +24,8 @@
>   
>   LONG64 object_global_serial_id;
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG");
> +
>   static inline bool is_cpu_accessible_heap(const D3D12_HEAP_PROPERTIES *properties)
>   {
>       if (properties->Type == D3D12_HEAP_TYPE_DEFAULT)
> diff --git a/libs/vkd3d/state.c b/libs/vkd3d/state.c
> index 97e2856d..06260dab 100644
> --- a/libs/vkd3d/state.c
> +++ b/libs/vkd3d/state.c
> @@ -21,6 +21,8 @@
>   #include "vkd3d_private.h"
>   #include "vkd3d_shaders.h"
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG");
> +
>   /* ID3D12RootSignature */
>   static inline struct d3d12_root_signature *impl_from_ID3D12RootSignature(ID3D12RootSignature *iface)
>   {
> diff --git a/libs/vkd3d/utils.c b/libs/vkd3d/utils.c
> index 8169b14b..73037654 100644
> --- a/libs/vkd3d/utils.c
> +++ b/libs/vkd3d/utils.c
> @@ -20,6 +20,8 @@
>   
>   #include <errno.h>
>   
> +VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG");
> +
>   #define COLOR         (VK_IMAGE_ASPECT_COLOR_BIT)
>   #define DEPTH         (VK_IMAGE_ASPECT_DEPTH_BIT)
>   #define STENCIL       (VK_IMAGE_ASPECT_STENCIL_BIT)



More information about the wine-devel mailing list