Zebediah Figura : vkd3d-shader: Allow writing log output via a custom callback.

Alexandre Julliard julliard at winehq.org
Tue Jun 7 15:36:06 CDT 2022


Module: vkd3d
Branch: master
Commit: 174172887b2b8c5a1a0e2d94c4c596511664ac61
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=174172887b2b8c5a1a0e2d94c4c596511664ac61

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Wed Jun  1 19:01:00 2022 -0500

vkd3d-shader: Allow writing log output via a custom callback.

When using PE vkd3d through Wine, debug output may be swallowed by writing to
Win32 stderr. Avoid this by providing a way to hook up vkd3d log output to Wine
output.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 include/private/vkd3d_debug.h         |  1 +
 include/vkd3d_shader.h                | 15 +++++++++++++++
 include/vkd3d_types.h                 |  4 ++++
 libs/vkd3d-common/debug.c             | 28 ++++++++++++++++++++++++++--
 libs/vkd3d-shader/vkd3d_shader.map    |  1 +
 libs/vkd3d-shader/vkd3d_shader_main.c |  5 +++++
 6 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/include/private/vkd3d_debug.h b/include/private/vkd3d_debug.h
index 8ab653ae..579c33d3 100644
--- a/include/private/vkd3d_debug.h
+++ b/include/private/vkd3d_debug.h
@@ -47,6 +47,7 @@ enum vkd3d_dbg_level
 enum vkd3d_dbg_level vkd3d_dbg_get_level(void);
 
 void vkd3d_dbg_printf(enum vkd3d_dbg_level level, const char *function, const char *fmt, ...) VKD3D_PRINTF_FUNC(3, 4);
+void vkd3d_dbg_set_log_callback(PFN_vkd3d_log callback);
 
 const char *vkd3d_dbg_sprintf(const char *fmt, ...) VKD3D_PRINTF_FUNC(1, 2);
 const char *vkd3d_dbg_vsprintf(const char *fmt, va_list args);
diff --git a/include/vkd3d_shader.h b/include/vkd3d_shader.h
index 05d235f9..1e5a332e 100644
--- a/include/vkd3d_shader.h
+++ b/include/vkd3d_shader.h
@@ -1806,6 +1806,18 @@ VKD3D_SHADER_API void vkd3d_shader_free_shader_signature(struct vkd3d_shader_sig
 VKD3D_SHADER_API int vkd3d_shader_preprocess(const struct vkd3d_shader_compile_info *compile_info,
         struct vkd3d_shader_code *out, char **messages);
 
+/**
+ * Set a callback to be called when vkd3d-shader outputs debug logging.
+ *
+ * If NULL, or if this function has not been called, libvkd3d-shader will print
+ * all enabled log output to stderr.
+ *
+ * \param callback Callback function to set.
+ *
+ * \since 1.4
+ */
+VKD3D_SHADER_API void vkd3d_shader_set_log_callback(PFN_vkd3d_log callback);
+
 #endif  /* VKD3D_SHADER_NO_PROTOTYPES */
 
 /** Type of vkd3d_shader_get_version(). */
@@ -1859,6 +1871,9 @@ typedef void (*PFN_vkd3d_shader_free_shader_signature)(struct vkd3d_shader_signa
 typedef void (*PFN_vkd3d_shader_preprocess)(struct vkd3d_shader_compile_info *compile_info,
         struct vkd3d_shader_code *out, char **messages);
 
+/** Type of vkd3d_shader_set_log_callback(). \since 1.4 */
+typedef void (*PFN_vkd3d_shader_set_log_callback)(PFN_vkd3d_log callback);
+
 #ifdef __cplusplus
 }
 #endif  /* __cplusplus */
diff --git a/include/vkd3d_types.h b/include/vkd3d_types.h
index 7014f4c2..4a7aca23 100644
--- a/include/vkd3d_types.h
+++ b/include/vkd3d_types.h
@@ -19,6 +19,8 @@
 #ifndef __VKD3D_TYPES_H
 #define __VKD3D_TYPES_H
 
+#include <stdarg.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif  /* __cplusplus */
@@ -53,6 +55,8 @@ enum vkd3d_result
     VKD3D_FORCE_32_BIT_ENUM(VKD3D_RESULT),
 };
 
+typedef void (*PFN_vkd3d_log)(const char *format, va_list args);
+
 #ifdef _WIN32
 # define VKD3D_IMPORT __declspec(dllimport)
 # define VKD3D_EXPORT __declspec(dllexport)
diff --git a/libs/vkd3d-common/debug.c b/libs/vkd3d-common/debug.c
index 4868f3fb..0b9e765a 100644
--- a/libs/vkd3d-common/debug.c
+++ b/libs/vkd3d-common/debug.c
@@ -68,6 +68,25 @@ enum vkd3d_dbg_level vkd3d_dbg_get_level(void)
     return level;
 }
 
+static PFN_vkd3d_log log_callback;
+
+static void vkd3d_dbg_voutput(const char *fmt, va_list args)
+{
+    if (log_callback)
+        log_callback(fmt, args);
+    else
+        vfprintf(stderr, fmt, args);
+}
+
+static void vkd3d_dbg_output(const char *fmt, ...)
+{
+    va_list args;
+
+    va_start(args, fmt);
+    vkd3d_dbg_voutput(fmt, args);
+    va_end(args);
+}
+
 void vkd3d_dbg_printf(enum vkd3d_dbg_level level, const char *function, const char *fmt, ...)
 {
     va_list args;
@@ -77,12 +96,17 @@ void vkd3d_dbg_printf(enum vkd3d_dbg_level level, const char *function, const ch
 
     assert(level < ARRAY_SIZE(debug_level_names));
 
-    fprintf(stderr, "%s:%s: ", debug_level_names[level], function);
+    vkd3d_dbg_output("%s:%s ", debug_level_names[level], function);
     va_start(args, fmt);
-    vfprintf(stderr, fmt, args);
+    vkd3d_dbg_voutput(fmt, args);
     va_end(args);
 }
 
+void vkd3d_dbg_set_log_callback(PFN_vkd3d_log callback)
+{
+    log_callback = callback;
+}
+
 static char *get_buffer(void)
 {
     static char buffers[VKD3D_DEBUG_BUFFER_COUNT][VKD3D_DEBUG_BUFFER_SIZE];
diff --git a/libs/vkd3d-shader/vkd3d_shader.map b/libs/vkd3d-shader/vkd3d_shader.map
index 2e49fe24..cac96972 100644
--- a/libs/vkd3d-shader/vkd3d_shader.map
+++ b/libs/vkd3d-shader/vkd3d_shader.map
@@ -17,6 +17,7 @@ global:
     vkd3d_shader_preprocess;
     vkd3d_shader_scan;
     vkd3d_shader_serialize_root_signature;
+    vkd3d_shader_set_log_callback;
 
 local: *;
 };
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index 6fd32435..7d0157fc 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -1550,3 +1550,8 @@ int vkd3d_shader_preprocess(const struct vkd3d_shader_compile_info *compile_info
     vkd3d_shader_message_context_cleanup(&message_context);
     return ret;
 }
+
+void vkd3d_shader_set_log_callback(PFN_vkd3d_log callback)
+{
+    vkd3d_dbg_set_log_callback(callback);
+}




More information about the wine-cvs mailing list