[Mesa-dev] [PATCH 2/2] radv: disassemble SPIR-V binaries with RADV_DEBUG=spirv

Samuel Pitoiset samuel.pitoiset at gmail.com
Wed Aug 30 13:12:21 UTC 2017


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 at gmail.com>
---
 src/amd/vulkan/radv_debug.c    | 30 ++++++++++++++++++++++++++++++
 src/amd/vulkan/radv_debug.h    |  3 +++
 src/amd/vulkan/radv_device.c   |  1 +
 src/amd/vulkan/radv_pipeline.c |  3 +++
 4 files changed, 37 insertions(+)

diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c
index 8105d1f47e..e6bbf21aba 100644
--- a/src/amd/vulkan/radv_debug.c
+++ b/src/amd/vulkan/radv_debug.c
@@ -60,3 +60,33 @@ void 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);
+}
diff --git a/src/amd/vulkan/radv_debug.h b/src/amd/vulkan/radv_debug.h
index c9d5fcc73f..d2fbe695fc 100644
--- a/src/amd/vulkan/radv_debug.h
+++ b/src/amd/vulkan/radv_debug.h
@@ -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 {
@@ -48,4 +49,6 @@ bool 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
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index aae3488318..cbba04a5d6 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -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}
 };
 
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index ef5c646317..f2d1b491b7 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -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) {
-- 
2.14.1



More information about the mesa-dev mailing list