Example #1
0
static void
dd_flush_and_handle_hang(struct dd_context *dctx,
                         struct pipe_fence_handle **fence, unsigned flags,
                         const char *cause)
{
   if (dd_flush_and_check_hang(dctx, fence, flags)) {
      FILE *f = dd_get_file_stream(dctx);

      if (f) {
         fprintf(f, "dd: %s.\n", cause);
         dd_dump_driver_state(dctx, f, PIPE_DEBUG_DEVICE_IS_HUNG);
         dd_close_file_stream(f);
      }

      /* Terminate the process to prevent future hangs. */
      dd_kill_process();
   }
}
static void
dd_context_destroy(struct pipe_context *_pipe)
{
   struct dd_context *dctx = dd_context(_pipe);
   struct pipe_context *pipe = dctx->pipe;

   if (dctx->thread) {
      mtx_lock(&dctx->mutex);
      dctx->kill_thread = 1;
      mtx_unlock(&dctx->mutex);
      thrd_join(dctx->thread, NULL);
      mtx_destroy(&dctx->mutex);
      assert(!dctx->records);
   }

   if (dctx->fence) {
      pipe->transfer_unmap(pipe, dctx->fence_transfer);
      pipe_resource_reference(&dctx->fence, NULL);
   }

   if (pipe->set_log_context) {
      pipe->set_log_context(pipe, NULL);

      if (dd_screen(dctx->base.screen)->mode == DD_DUMP_ALL_CALLS) {
         FILE *f = dd_get_file_stream(dd_screen(dctx->base.screen), 0);
         if (f) {
            fprintf(f, "Remainder of driver log:\n\n");
         }

         u_log_new_page_print(&dctx->log, f);
         fclose(f);
      }
   }
   u_log_context_destroy(&dctx->log);

   pipe->destroy(pipe);
   FREE(dctx);
}
Example #3
0
static void
dd_dump_call(struct dd_context *dctx, struct dd_call *call, unsigned flags)
{
   FILE *f = dd_get_file_stream(dctx);

   if (!f)
      return;

   switch (call->type) {
   case CALL_DRAW_VBO:
      dd_dump_draw_vbo(dctx, &call->info.draw_vbo, f);
      break;
   case CALL_RESOURCE_COPY_REGION:
      dd_dump_resource_copy_region(dctx, &call->info.resource_copy_region, f);
      break;
   case CALL_BLIT:
      dd_dump_blit(dctx, &call->info.blit, f);
      break;
   case CALL_FLUSH_RESOURCE:
      dd_dump_flush_resource(dctx, call->info.flush_resource, f);
      break;
   case CALL_CLEAR:
      dd_dump_clear(dctx, &call->info.clear, f);
      break;
   case CALL_CLEAR_BUFFER:
      dd_dump_clear_buffer(dctx, &call->info.clear_buffer, f);
      break;
   case CALL_CLEAR_RENDER_TARGET:
      dd_dump_clear_render_target(dctx, f);
      break;
   case CALL_CLEAR_DEPTH_STENCIL:
      dd_dump_clear_depth_stencil(dctx, f);
   }

   dd_dump_driver_state(dctx, f, flags);
   dd_close_file_stream(f);
}