ddebug: dump driver state into a separate file
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Tue, 26 Feb 2019 15:34:34 +0000 (16:34 +0100)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 25 Apr 2019 10:35:21 +0000 (12:35 +0200)
Due to asynchronous execution, it's not clear which of the draws the state
may refer to.

This also works around an issue encountered with radeonsi where dumping
the driver state itself caused a hang.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/auxiliary/driver_ddebug/dd_draw.c

index bda1891c49bfd24203a4cb09f03d6f367a78ca5b..98e7a6bb99f7c2d55e090e70904403fc848e53af 100644 (file)
@@ -988,11 +988,6 @@ dd_report_hang(struct dd_context *dctx)
          dd_write_header(f, dscreen->screen, record->draw_state.base.apitrace_call_number);
          dd_write_record(f, record);
 
-         if (!encountered_hang) {
-            dd_dump_driver_state(dctx, f, PIPE_DUMP_DEVICE_STATUS_REGISTERS);
-            dd_dump_dmesg(f);
-         }
-
          fclose(f);
       }
 
@@ -1004,6 +999,18 @@ dd_report_hang(struct dd_context *dctx)
    if (num_later)
       fprintf(stderr, "... and %u additional draws.\n", num_later);
 
+   char name[512];
+   dd_get_debug_filename_and_mkdir(name, sizeof(name), false);
+   FILE *f = fopen(name, "w");
+   if (!f) {
+      fprintf(stderr, "fopen failed\n");
+   } else {
+      dd_write_header(f, dscreen->screen, 0);
+      dd_dump_driver_state(dctx, f, PIPE_DUMP_DEVICE_STATUS_REGISTERS);
+      dd_dump_dmesg(f);
+      fclose(f);
+   }
+
    fprintf(stderr, "\nDone.\n");
    dd_kill_process();
 }