radv: disassemble SPIR-V binaries with RADV_DEBUG=spirv
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 30 Aug 2017 13:12:21 +0000 (15:12 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 1 Sep 2017 07:41:54 +0000 (09:41 +0200)
This introduces a new separate option because the output can
be quite verbose. If spirv-dis is not found in the path, this
debug option is useless.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_debug.c
src/amd/vulkan/radv_debug.h
src/amd/vulkan/radv_device.c
src/amd/vulkan/radv_pipeline.c

index 2c3f01526f478327975683cb69a82eb34173d24b..9913c06ec2375039b1ca324abd0c19efddcf3880 100644 (file)
@@ -62,3 +62,34 @@ radv_dump_trace(struct radv_device *device, struct radeon_winsys_cs *cs)
        device->ws->cs_dump(cs, f, (const int*)device->trace_id_ptr, 2);
        fclose(f);
 }
+
+void
+radv_print_spirv(struct radv_shader_module *module, FILE *fp)
+{
+       char path[] = "/tmp/fileXXXXXX";
+       char line[2048], command[128];
+       FILE *p;
+       int fd;
+
+       /* Dump the binary into a temporary file. */
+       fd = mkstemp(path);
+       if (fd < 0)
+               return;
+
+       if (write(fd, module->data, module->size) == -1)
+               goto fail;
+
+       sprintf(command, "spirv-dis %s", path);
+
+       /* Disassemble using spirv-dis if installed. */
+       p = popen(command, "r");
+       if (p) {
+               while (fgets(line, sizeof(line), p))
+                       fprintf(fp, "%s", line);
+               pclose(p);
+       }
+
+fail:
+       close(fd);
+       unlink(path);
+}
index cbb095f747b10b564d42ab357b3c268f81921a18..c5e83347279cda877d96362302f67c3ea8d75ab2 100644 (file)
@@ -37,6 +37,7 @@ enum {
        RADV_DEBUG_UNSAFE_MATH       =  0x80,
        RADV_DEBUG_ALL_BOS           = 0x100,
        RADV_DEBUG_NO_IBS            = 0x200,
+       RADV_DEBUG_DUMP_SPIRV        = 0x400,
 };
 
 enum {
@@ -50,4 +51,7 @@ radv_init_trace(struct radv_device *device);
 void
 radv_dump_trace(struct radv_device *device, struct radeon_winsys_cs *cs);
 
+void
+radv_print_spirv(struct radv_shader_module *module, FILE *fp);
+
 #endif
index aae3488318390d51b1719fccaf943d3af474a712..cbba04a5d6f331bd1b4f490da85844e6814142a8 100644 (file)
@@ -409,6 +409,7 @@ static const struct debug_control radv_debug_options[] = {
        {"unsafemath", RADV_DEBUG_UNSAFE_MATH},
        {"allbos", RADV_DEBUG_ALL_BOS},
        {"noibs", RADV_DEBUG_NO_IBS},
+       {"spirv", RADV_DEBUG_DUMP_SPIRV},
        {NULL, 0}
 };
 
index ef5c646317d3968d7c3af0592b67508ec2a5c8f0..f2d1b491b705dd48c037d788566a2925dccbc60f 100644 (file)
@@ -207,6 +207,9 @@ radv_shader_compile_to_nir(struct radv_device *device,
                uint32_t *spirv = (uint32_t *) module->data;
                assert(module->size % 4 == 0);
 
+               if (device->debug_flags & RADV_DEBUG_DUMP_SPIRV)
+                       radv_print_spirv(module, stderr);
+
                uint32_t num_spec_entries = 0;
                struct nir_spirv_specialization *spec_entries = NULL;
                if (spec_info && spec_info->mapEntryCount > 0) {