vc4: Move job-submit skip cases to vc4_job_submit().
[mesa.git] / src / gallium / drivers / ddebug / dd_screen.c
index db535e9837b0f7598b33b3dfe298eb0a4a842eb4..a0c0dd09092ee12f11959a9c152e2a19d411b35d 100644 (file)
@@ -237,13 +237,15 @@ dd_screen_resource_destroy(struct pipe_screen *_screen,
 
 static boolean
 dd_screen_resource_get_handle(struct pipe_screen *_screen,
+                              struct pipe_context *_pipe,
                               struct pipe_resource *resource,
                               struct winsys_handle *handle,
                               unsigned usage)
 {
    struct pipe_screen *screen = dd_screen(_screen)->screen;
+   struct pipe_context *pipe = _pipe ? dd_context(_pipe)->pipe : NULL;
 
-   return screen->resource_get_handle(screen, resource, handle, usage);
+   return screen->resource_get_handle(screen, pipe, resource, handle, usage);
 }
 
 
@@ -263,12 +265,14 @@ dd_screen_fence_reference(struct pipe_screen *_screen,
 
 static boolean
 dd_screen_fence_finish(struct pipe_screen *_screen,
+                       struct pipe_context *_ctx,
                        struct pipe_fence_handle *fence,
                        uint64_t timeout)
 {
    struct pipe_screen *screen = dd_screen(_screen)->screen;
+   struct pipe_context *ctx = _ctx ? dd_context(_ctx)->pipe : NULL;
 
-   return screen->fence_finish(screen, fence, timeout);
+   return screen->fence_finish(screen, ctx, fence, timeout);
 }
 
 
@@ -290,18 +294,17 @@ struct pipe_screen *
 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");
+   const char *option;
+   bool no_flush;
    unsigned timeout = 0;
    unsigned apitrace_dump_call = 0;
+   enum dd_mode mode;
 
-   if (dump_apitrace)
-      no_flush = true;
+   option = debug_get_option("GALLIUM_DDEBUG", NULL);
+   if (!option)
+      return screen;
 
-   if (help) {
+   if (!strcmp(option, "help")) {
       puts("Gallium driver debugger");
       puts("");
       puts("Usage:");
@@ -315,6 +318,11 @@ 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=\"pipelined [timeout in ms] [verbose]\"");
+      puts("    Detect a device hang after every draw call based on the given fence");
+      puts("    timeout without flushes 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("");
@@ -328,13 +336,27 @@ ddebug_screen_create(struct pipe_screen *screen)
       exit(0);
    }
 
-   if (!option)
-      return screen;
-   if (!dump_always && !dump_apitrace && sscanf(option, "%u", &timeout) != 1)
-      return screen;
+   no_flush = strstr(option, "noflush") != NULL;
 
-   if (dump_apitrace && sscanf(option+8, "%u", &apitrace_dump_call) != 1)
-      return screen;
+   if (!strncmp(option, "always", 6)) {
+      mode = DD_DUMP_ALL_CALLS;
+   } else if (!strncmp(option, "apitrace", 8)) {
+      mode = DD_DUMP_APITRACE_CALL;
+      no_flush = true;
+
+      if (sscanf(option+8, "%u", &apitrace_dump_call) != 1)
+         return screen;
+   } else if (!strncmp(option, "pipelined", 8)) {
+      mode = DD_DETECT_HANGS_PIPELINED;
+
+      if (sscanf(option+10, "%u", &timeout) != 1)
+         return screen;
+   } else {
+      mode = DD_DETECT_HANGS;
+
+      if (sscanf(option, "%u", &timeout) != 1)
+         return screen;
+   }
 
    dscreen = CALLOC_STRUCT(dd_screen);
    if (!dscreen)
@@ -374,8 +396,7 @@ ddebug_screen_create(struct pipe_screen *screen)
 
    dscreen->screen = screen;
    dscreen->timeout_ms = timeout;
-   dscreen->mode = dump_always ? DD_DUMP_ALL_CALLS :
-                   dump_apitrace ? DD_DUMP_APITRACE_CALL : DD_DETECT_HANGS;
+   dscreen->mode = mode;
    dscreen->no_flush = no_flush;
    dscreen->verbose = strstr(option, "verbose") != NULL;
    dscreen->apitrace_dump_call = apitrace_dump_call;
@@ -385,8 +406,9 @@ ddebug_screen_create(struct pipe_screen *screen)
       fprintf(stderr, "Gallium debugger active. Logging all calls.\n");
       break;
    case DD_DETECT_HANGS:
+   case DD_DETECT_HANGS_PIPELINED:
       fprintf(stderr, "Gallium debugger active. "
-              "The hang detection timout is %i ms.\n", timeout);
+              "The hang detection timeout is %i ms.\n", timeout);
       break;
    case DD_DUMP_APITRACE_CALL:
       fprintf(stderr, "Gallium debugger active. Going to dump an apitrace call.\n");