diff options
author | Marek Olšák <[email protected]> | 2016-07-19 21:41:03 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2016-07-26 23:06:46 +0200 |
commit | 6bf81de339289b0d005553414ce568b136a0ca5f (patch) | |
tree | 81b305d0fa4434db18b4caf3789475fa5727d103 | |
parent | 9ace2c13550609dfe78164f104500d438821f383 (diff) |
gallium: rework flags for pipe_context::dump_debug_state
The pipelined hang detection mode will not want to dump everything.
(and it's also time consuming) It will only dump shaders after a draw call
and then dump the status registers separately if a hang is detected.
Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r-- | src/gallium/drivers/ddebug/dd_draw.c | 12 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_debug.c | 32 | ||||
-rw-r--r-- | src/gallium/include/pipe/p_context.h | 2 | ||||
-rw-r--r-- | src/gallium/include/pipe/p_defines.h | 5 |
4 files changed, 34 insertions, 17 deletions
diff --git a/src/gallium/drivers/ddebug/dd_draw.c b/src/gallium/drivers/ddebug/dd_draw.c index f8047ccc852..c3fd9685b17 100644 --- a/src/gallium/drivers/ddebug/dd_draw.c +++ b/src/gallium/drivers/ddebug/dd_draw.c @@ -595,7 +595,11 @@ dd_flush_and_handle_hang(struct dd_context *dctx, if (f) { fprintf(f, "dd: %s.\n", cause); - dd_dump_driver_state(dctx, f, PIPE_DEBUG_DEVICE_IS_HUNG); + dd_dump_driver_state(dctx, f, + PIPE_DUMP_DEVICE_STATUS_REGISTERS | + PIPE_DUMP_CURRENT_STATES | + PIPE_DUMP_CURRENT_SHADERS | + PIPE_DUMP_LAST_COMMAND_BUFFER); dd_close_file_stream(f); } @@ -649,7 +653,11 @@ dd_after_draw(struct dd_context *dctx, struct dd_call *call) case DD_DETECT_HANGS: if (!dscreen->no_flush && dd_flush_and_check_hang(dctx, NULL, 0)) { - dd_dump_call(dctx, call, PIPE_DEBUG_DEVICE_IS_HUNG); + dd_dump_call(dctx, call, + PIPE_DUMP_DEVICE_STATUS_REGISTERS | + PIPE_DUMP_CURRENT_STATES | + PIPE_DUMP_CURRENT_SHADERS | + PIPE_DUMP_LAST_COMMAND_BUFFER); /* Terminate the process to prevent future hangs. */ dd_kill_process(); diff --git a/src/gallium/drivers/radeonsi/si_debug.c b/src/gallium/drivers/radeonsi/si_debug.c index 73e0bfeb344..35d961d34f5 100644 --- a/src/gallium/drivers/radeonsi/si_debug.c +++ b/src/gallium/drivers/radeonsi/si_debug.c @@ -665,24 +665,30 @@ static void si_dump_debug_state(struct pipe_context *ctx, FILE *f, { struct si_context *sctx = (struct si_context*)ctx; - if (flags & PIPE_DEBUG_DEVICE_IS_HUNG) + if (flags & PIPE_DUMP_DEVICE_STATUS_REGISTERS) si_dump_debug_registers(sctx, f); - si_dump_framebuffer(sctx, f); - si_dump_shader(sctx->screen, &sctx->vs_shader, f); - si_dump_shader(sctx->screen, &sctx->tcs_shader, f); - si_dump_shader(sctx->screen, &sctx->tes_shader, f); - si_dump_shader(sctx->screen, &sctx->gs_shader, f); - si_dump_shader(sctx->screen, &sctx->ps_shader, f); + if (flags & PIPE_DUMP_CURRENT_STATES) + si_dump_framebuffer(sctx, f); - si_dump_bo_list(sctx, &sctx->last_gfx, f); - si_dump_last_ib(sctx, f); + if (flags & PIPE_DUMP_CURRENT_SHADERS) { + si_dump_shader(sctx->screen, &sctx->vs_shader, f); + si_dump_shader(sctx->screen, &sctx->tcs_shader, f); + si_dump_shader(sctx->screen, &sctx->tes_shader, f); + si_dump_shader(sctx->screen, &sctx->gs_shader, f); + si_dump_shader(sctx->screen, &sctx->ps_shader, f); + } + + if (flags & PIPE_DUMP_LAST_COMMAND_BUFFER) { + si_dump_bo_list(sctx, &sctx->last_gfx, f); + si_dump_last_ib(sctx, f); - fprintf(f, "Done.\n"); + fprintf(f, "Done.\n"); - /* dump only once */ - radeon_clear_saved_cs(&sctx->last_gfx); - r600_resource_reference(&sctx->last_trace_buf, NULL); + /* dump only once */ + radeon_clear_saved_cs(&sctx->last_gfx); + r600_resource_reference(&sctx->last_trace_buf, NULL); + } } static void si_dump_dma(struct si_context *sctx, diff --git a/src/gallium/include/pipe/p_context.h b/src/gallium/include/pipe/p_context.h index fe567b67197..f1de189b676 100644 --- a/src/gallium/include/pipe/p_context.h +++ b/src/gallium/include/pipe/p_context.h @@ -690,7 +690,7 @@ struct pipe_context { * * \param ctx pipe context * \param stream where the output should be written to - * \param flags a mask of PIPE_DEBUG_* flags + * \param flags a mask of PIPE_DUMP_* flags */ void (*dump_debug_state)(struct pipe_context *ctx, FILE *stream, unsigned flags); diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 8655814dd0c..69bd89ece61 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -355,7 +355,10 @@ enum pipe_flush_flags /** * Flags for pipe_context::dump_debug_state. */ -#define PIPE_DEBUG_DEVICE_IS_HUNG (1 << 0) +#define PIPE_DUMP_DEVICE_STATUS_REGISTERS (1 << 0) +#define PIPE_DUMP_CURRENT_STATES (1 << 1) +#define PIPE_DUMP_CURRENT_SHADERS (1 << 2) +#define PIPE_DUMP_LAST_COMMAND_BUFFER (1 << 3) /** * Create a compute-only context. Use in pipe_screen::context_create. |