Patches 1-4:

Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>

On 01.07.2016 01:21, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com>

---
  src/gallium/drivers/ddebug/dd_draw.c   |  8 ++++++++
  src/gallium/drivers/ddebug/dd_pipe.h   |  4 +++-
  src/gallium/drivers/ddebug/dd_screen.c | 20 ++++++++++++++++++--
  3 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/ddebug/dd_draw.c 
b/src/gallium/drivers/ddebug/dd_draw.c
index f0f6fb6..f8047cc 100644
--- a/src/gallium/drivers/ddebug/dd_draw.c
+++ b/src/gallium/drivers/ddebug/dd_draw.c
@@ -617,6 +617,7 @@ dd_context_flush(struct pipe_context *_pipe,
                                 "GPU hang detected in pipe->flush()");
        break;
     case DD_DUMP_ALL_CALLS:
+   case DD_DUMP_APITRACE_CALL:
        pipe->flush(pipe, fence, flags);
        break;
     default:
@@ -659,6 +660,13 @@ dd_after_draw(struct dd_context *dctx, struct dd_call 
*call)
              pipe->flush(pipe, NULL, 0);
           dd_dump_call(dctx, call, 0);
           break;
+      case DD_DUMP_APITRACE_CALL:
+         if (dscreen->apitrace_dump_call == dctx->apitrace_call_number) {
+            dd_dump_call(dctx, call, 0);
+            /* No need to continue. */
+            exit(0);
+         }
+         break;
        default:
           assert(0);
        }
diff --git a/src/gallium/drivers/ddebug/dd_pipe.h 
b/src/gallium/drivers/ddebug/dd_pipe.h
index f94303d..69d5c4e 100644
--- a/src/gallium/drivers/ddebug/dd_pipe.h
+++ b/src/gallium/drivers/ddebug/dd_pipe.h
@@ -35,7 +35,8 @@

  enum dd_mode {
     DD_DETECT_HANGS,
-   DD_DUMP_ALL_CALLS
+   DD_DUMP_ALL_CALLS,
+   DD_DUMP_APITRACE_CALL,
  };

  struct dd_screen
@@ -47,6 +48,7 @@ struct dd_screen
     bool no_flush;
     bool verbose;
     unsigned skip_count;
+   unsigned apitrace_dump_call;
  };

  struct dd_query
diff --git a/src/gallium/drivers/ddebug/dd_screen.c 
b/src/gallium/drivers/ddebug/dd_screen.c
index 5a883bd..db535e9 100644
--- a/src/gallium/drivers/ddebug/dd_screen.c
+++ b/src/gallium/drivers/ddebug/dd_screen.c
@@ -292,9 +292,14 @@ ddebug_screen_create(struct pipe_screen *screen)
     struct dd_screen *dscreen;
     const char *option = debug_get_option("GALLIUM_DDEBUG", NULL);
     bool dump_always = option && !strncmp(option, "always", 6);
+   bool dump_apitrace = option && !strncmp(option, "apitrace", 8);
     bool no_flush = option && strstr(option, "noflush");
     bool help = option && !strcmp(option, "help");
     unsigned timeout = 0;
+   unsigned apitrace_dump_call = 0;
+
+   if (dump_apitrace)
+      no_flush = true;

     if (help) {
        puts("Gallium driver debugger");
@@ -310,6 +315,9 @@ ddebug_screen_create(struct pipe_screen *screen)
        puts("    fence timeout and dump context and driver information into");
        puts("    $HOME/"DD_DIR"/ when a hang is detected.");
        puts("");
+      puts("  GALLIUM_DDEBUG=\"apitrace [call#] [verbose]\"");
+      puts("    Dump apitrace draw call information into $HOME/"DD_DIR"/. Implies 
'noflush'.");
+      puts("");
        puts("  If 'noflush' is specified, do not flush on every draw call. In 
hang");
        puts("  detection mode, this only detect hangs in pipe->flush.");
        puts("  If 'verbose' is specified, additional information is written to 
stderr.");
@@ -322,7 +330,10 @@ ddebug_screen_create(struct pipe_screen *screen)

     if (!option)
        return screen;
-   if (!dump_always && sscanf(option, "%u", &timeout) != 1)
+   if (!dump_always && !dump_apitrace && sscanf(option, "%u", &timeout) != 1)
+      return screen;
+
+   if (dump_apitrace && sscanf(option+8, "%u", &apitrace_dump_call) != 1)
        return screen;

     dscreen = CALLOC_STRUCT(dd_screen);
@@ -363,9 +374,11 @@ ddebug_screen_create(struct pipe_screen *screen)

     dscreen->screen = screen;
     dscreen->timeout_ms = timeout;
-   dscreen->mode = dump_always ? DD_DUMP_ALL_CALLS : DD_DETECT_HANGS;
+   dscreen->mode = dump_always ? DD_DUMP_ALL_CALLS :
+                   dump_apitrace ? DD_DUMP_APITRACE_CALL : DD_DETECT_HANGS;
     dscreen->no_flush = no_flush;
     dscreen->verbose = strstr(option, "verbose") != NULL;
+   dscreen->apitrace_dump_call = apitrace_dump_call;

     switch (dscreen->mode) {
     case DD_DUMP_ALL_CALLS:
@@ -375,6 +388,9 @@ ddebug_screen_create(struct pipe_screen *screen)
        fprintf(stderr, "Gallium debugger active. "
                "The hang detection timout is %i ms.\n", timeout);
        break;
+   case DD_DUMP_APITRACE_CALL:
+      fprintf(stderr, "Gallium debugger active. Going to dump an apitrace 
call.\n");
+      break;
     default:
        assert(0);
     }

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to