radv: dump SPIRV when a GPU hang is detected
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
@@ -497,6 +497,11 @@ radv_dump_shader(struct radv_pipeline *pipeline,
|
|||||||
|
|
||||||
fprintf(f, "%s:\n\n", radv_get_shader_name(shader, stage));
|
fprintf(f, "%s:\n\n", radv_get_shader_name(shader, stage));
|
||||||
|
|
||||||
|
if (shader->spirv) {
|
||||||
|
fprintf(f, "SPIRV:\n");
|
||||||
|
radv_print_spirv(shader->spirv, shader->spirv_size, f);
|
||||||
|
}
|
||||||
|
|
||||||
if (shader->nir) {
|
if (shader->nir) {
|
||||||
fprintf(f, "NIR:\n");
|
fprintf(f, "NIR:\n");
|
||||||
nir_print_shader(shader->nir, f);
|
nir_print_shader(shader->nir, f);
|
||||||
@@ -700,7 +705,7 @@ radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_winsys_cs *cs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
radv_print_spirv(struct radv_shader_module *module, FILE *fp)
|
radv_print_spirv(uint32_t *data, uint32_t size, FILE *fp)
|
||||||
{
|
{
|
||||||
char path[] = "/tmp/fileXXXXXX";
|
char path[] = "/tmp/fileXXXXXX";
|
||||||
char line[2048], command[128];
|
char line[2048], command[128];
|
||||||
@@ -712,7 +717,7 @@ radv_print_spirv(struct radv_shader_module *module, FILE *fp)
|
|||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (write(fd, module->data, module->size) == -1)
|
if (write(fd, data, size) == -1)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
sprintf(command, "spirv-dis %s", path);
|
sprintf(command, "spirv-dis %s", path);
|
||||||
|
@@ -55,6 +55,6 @@ void
|
|||||||
radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_winsys_cs *cs);
|
radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_winsys_cs *cs);
|
||||||
|
|
||||||
void
|
void
|
||||||
radv_print_spirv(struct radv_shader_module *module, FILE *fp);
|
radv_print_spirv(uint32_t *data, uint32_t size, FILE *fp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -175,7 +175,7 @@ radv_shader_compile_to_nir(struct radv_device *device,
|
|||||||
assert(module->size % 4 == 0);
|
assert(module->size % 4 == 0);
|
||||||
|
|
||||||
if (device->debug_flags & RADV_DEBUG_DUMP_SPIRV)
|
if (device->debug_flags & RADV_DEBUG_DUMP_SPIRV)
|
||||||
radv_print_spirv(module, stderr);
|
radv_print_spirv(spirv, module->size, stderr);
|
||||||
|
|
||||||
uint32_t num_spec_entries = 0;
|
uint32_t num_spec_entries = 0;
|
||||||
struct nir_spirv_specialization *spec_entries = NULL;
|
struct nir_spirv_specialization *spec_entries = NULL;
|
||||||
@@ -433,6 +433,8 @@ shader_variant_create(struct radv_device *device,
|
|||||||
variant->disasm_string = binary.disasm_string;
|
variant->disasm_string = binary.disasm_string;
|
||||||
if (!gs_copy_shader && !module->nir) {
|
if (!gs_copy_shader && !module->nir) {
|
||||||
variant->nir = shader;
|
variant->nir = shader;
|
||||||
|
variant->spirv = (uint32_t *)module->data;
|
||||||
|
variant->spirv_size = module->size;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
free(binary.disasm_string);
|
free(binary.disasm_string);
|
||||||
|
@@ -51,6 +51,8 @@ struct radv_shader_variant {
|
|||||||
unsigned rsrc2;
|
unsigned rsrc2;
|
||||||
|
|
||||||
/* debug only */
|
/* debug only */
|
||||||
|
uint32_t *spirv;
|
||||||
|
uint32_t spirv_size;
|
||||||
struct nir_shader *nir;
|
struct nir_shader *nir;
|
||||||
char *disasm_string;
|
char *disasm_string;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user