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); }
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); }