[PATCH vkd3d 04/41] vkd3d-shader: Add path for debug dumping SPIR-V as well.

Hans-Kristian Arntzen post at arntzen-software.no
Wed Jan 29 05:51:29 CST 2020


Signed-off-by: Hans-Kristian Arntzen <post at arntzen-software.no>
---
 libs/vkd3d-shader/vkd3d_shader_main.c | 35 +++++++++++++++++++++------
 1 file changed, 28 insertions(+), 7 deletions(-)

diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index aa486cc..fb89de4 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -25,16 +25,13 @@ VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG");
 STATIC_ASSERT(MEMBER_SIZE(struct vkd3d_shader_scan_info, uav_counter_mask) * CHAR_BIT >= VKD3D_SHADER_MAX_UNORDERED_ACCESS_VIEWS);
 STATIC_ASSERT(MEMBER_SIZE(struct vkd3d_shader_scan_info, uav_read_mask) * CHAR_BIT >= VKD3D_SHADER_MAX_UNORDERED_ACCESS_VIEWS);
 
-static void vkd3d_shader_dump_blob(const char *path, const char *prefix, const void *data, size_t size)
+static void vkd3d_shader_dump_blob(const char *path, const char *prefix, const void *data, size_t size,
+        unsigned int id, const char *ext)
 {
-    static int shader_id = 0;
     char filename[1024];
-    unsigned int id;
     FILE *f;
 
-    id = InterlockedIncrement(&shader_id) - 1;
-
-    snprintf(filename, ARRAY_SIZE(filename), "%s/vkd3d-shader-%s-%u.dxbc", path, prefix, id);
+    snprintf(filename, ARRAY_SIZE(filename), "%s/vkd3d-shader-%s-%u.%s", path, prefix, id, ext);
     if ((f = fopen(filename, "wb")))
     {
         if (fwrite(data, 1, size, f) != size)
@@ -50,6 +47,26 @@ static void vkd3d_shader_dump_blob(const char *path, const char *prefix, const v
 
 static void vkd3d_shader_dump_shader(enum vkd3d_shader_type type, const struct vkd3d_shader_code *shader)
 {
+    static int shader_id = 0;
+    static bool enabled = true;
+    const char *path;
+
+    if (!enabled)
+        return;
+
+    if (!(path = getenv("VKD3D_SHADER_DUMP_PATH")))
+    {
+        enabled = false;
+        return;
+    }
+
+    vkd3d_shader_dump_blob(path, shader_get_type_prefix(type), shader->code, shader->size,
+                           InterlockedIncrement(&shader_id) - 1, "dxbc");
+}
+
+static void vkd3d_shader_dump_spirv_shader(enum vkd3d_shader_type type, const struct vkd3d_shader_code *shader)
+{
+    static int shader_id = 0;
     static bool enabled = true;
     const char *path;
 
@@ -62,7 +79,8 @@ static void vkd3d_shader_dump_shader(enum vkd3d_shader_type type, const struct v
         return;
     }
 
-    vkd3d_shader_dump_blob(path, shader_get_type_prefix(type), shader->code, shader->size);
+    vkd3d_shader_dump_blob(path, shader_get_type_prefix(type), shader->code, shader->size,
+                           InterlockedIncrement(&shader_id) - 1, "spv");
 }
 
 struct vkd3d_shader_parser
@@ -190,6 +208,9 @@ int vkd3d_shader_compile_dxbc(const struct vkd3d_shader_code *dxbc,
     if (ret >= 0)
         ret = vkd3d_dxbc_compiler_generate_spirv(spirv_compiler, spirv);
 
+    if (ret == 0)
+        vkd3d_shader_dump_spirv_shader(parser.shader_version.type, spirv);
+
     vkd3d_dxbc_compiler_destroy(spirv_compiler);
     vkd3d_shader_parser_destroy(&parser);
     return ret;
-- 
2.25.0




More information about the wine-devel mailing list