ddebug: add driver log to record dumps
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
@@ -583,6 +583,11 @@ dd_context_destroy(struct pipe_context *_pipe)
|
|||||||
pipe->transfer_unmap(pipe, dctx->fence_transfer);
|
pipe->transfer_unmap(pipe, dctx->fence_transfer);
|
||||||
pipe_resource_reference(&dctx->fence, NULL);
|
pipe_resource_reference(&dctx->fence, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pipe->set_log_context)
|
||||||
|
pipe->set_log_context(pipe, NULL);
|
||||||
|
u_log_context_destroy(&dctx->log);
|
||||||
|
|
||||||
pipe->destroy(pipe);
|
pipe->destroy(pipe);
|
||||||
FREE(dctx);
|
FREE(dctx);
|
||||||
}
|
}
|
||||||
@@ -899,6 +904,10 @@ dd_context_create(struct dd_screen *dscreen, struct pipe_context *pipe)
|
|||||||
|
|
||||||
dd_init_draw_functions(dctx);
|
dd_init_draw_functions(dctx);
|
||||||
|
|
||||||
|
u_log_context_init(&dctx->log);
|
||||||
|
if (pipe->set_log_context)
|
||||||
|
pipe->set_log_context(pipe, &dctx->log);
|
||||||
|
|
||||||
dctx->draw_state.sample_mask = ~0;
|
dctx->draw_state.sample_mask = ~0;
|
||||||
|
|
||||||
if (dscreen->mode == DD_DETECT_HANGS_PIPELINED) {
|
if (dscreen->mode == DD_DETECT_HANGS_PIPELINED) {
|
||||||
|
@@ -561,6 +561,12 @@ dd_write_report(struct dd_context *dctx, struct dd_call *call, unsigned flags,
|
|||||||
|
|
||||||
dd_dump_call(f, &dctx->draw_state, call);
|
dd_dump_call(f, &dctx->draw_state, call);
|
||||||
dd_dump_driver_state(dctx, f, flags);
|
dd_dump_driver_state(dctx, f, flags);
|
||||||
|
|
||||||
|
fprintf(f,"\n\n**************************************************"
|
||||||
|
"***************************\n");
|
||||||
|
fprintf(f, "Context Log:\n\n");
|
||||||
|
u_log_new_page_print(&dctx->log, f);
|
||||||
|
|
||||||
if (dump_dmesg)
|
if (dump_dmesg)
|
||||||
dd_dump_dmesg(f);
|
dd_dump_dmesg(f);
|
||||||
dd_close_file_stream(f);
|
dd_close_file_stream(f);
|
||||||
@@ -936,6 +942,7 @@ dd_free_record(struct dd_draw_record **record)
|
|||||||
{
|
{
|
||||||
struct dd_draw_record *next = (*record)->next;
|
struct dd_draw_record *next = (*record)->next;
|
||||||
|
|
||||||
|
u_log_page_destroy((*record)->log_page);
|
||||||
dd_unreference_copy_of_call(&(*record)->call);
|
dd_unreference_copy_of_call(&(*record)->call);
|
||||||
dd_unreference_copy_of_draw_state(&(*record)->draw_state);
|
dd_unreference_copy_of_draw_state(&(*record)->draw_state);
|
||||||
FREE((*record)->driver_state_log);
|
FREE((*record)->driver_state_log);
|
||||||
@@ -960,6 +967,11 @@ dd_dump_record(struct dd_context *dctx, struct dd_draw_record *record,
|
|||||||
dd_dump_call(f, &record->draw_state.base, &record->call);
|
dd_dump_call(f, &record->draw_state.base, &record->call);
|
||||||
fprintf(f, "%s\n", record->driver_state_log);
|
fprintf(f, "%s\n", record->driver_state_log);
|
||||||
|
|
||||||
|
fprintf(f,"\n\n**************************************************"
|
||||||
|
"***************************\n");
|
||||||
|
fprintf(f, "Context Log:\n\n");
|
||||||
|
u_log_page_print(record->log_page, f);
|
||||||
|
|
||||||
dctx->pipe->dump_debug_state(dctx->pipe, f,
|
dctx->pipe->dump_debug_state(dctx->pipe, f,
|
||||||
PIPE_DUMP_DEVICE_STATUS_REGISTERS);
|
PIPE_DUMP_DEVICE_STATUS_REGISTERS);
|
||||||
dd_dump_dmesg(f);
|
dd_dump_dmesg(f);
|
||||||
@@ -1101,6 +1113,7 @@ dd_pipelined_process_draw(struct dd_context *dctx, struct dd_call *call)
|
|||||||
record->timestamp = os_time_get();
|
record->timestamp = os_time_get();
|
||||||
record->sequence_no = dctx->sequence_no;
|
record->sequence_no = dctx->sequence_no;
|
||||||
record->driver_state_log = log;
|
record->driver_state_log = log;
|
||||||
|
record->log_page = u_log_new_page(&dctx->log);
|
||||||
|
|
||||||
memset(&record->call, 0, sizeof(record->call));
|
memset(&record->call, 0, sizeof(record->call));
|
||||||
dd_copy_call(&record->call, call);
|
dd_copy_call(&record->call, call);
|
||||||
@@ -1170,6 +1183,8 @@ dd_after_draw(struct dd_context *dctx, struct dd_call *call)
|
|||||||
|
|
||||||
/* Terminate the process to prevent future hangs. */
|
/* Terminate the process to prevent future hangs. */
|
||||||
dd_kill_process();
|
dd_kill_process();
|
||||||
|
} else {
|
||||||
|
u_log_page_destroy(u_log_new_page(&dctx->log));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DD_DETECT_HANGS_PIPELINED:
|
case DD_DETECT_HANGS_PIPELINED:
|
||||||
@@ -1193,6 +1208,8 @@ dd_after_draw(struct dd_context *dctx, struct dd_call *call)
|
|||||||
false);
|
false);
|
||||||
/* No need to continue. */
|
/* No need to continue. */
|
||||||
exit(0);
|
exit(0);
|
||||||
|
} else {
|
||||||
|
u_log_page_destroy(u_log_new_page(&dctx->log));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@@ -33,6 +33,7 @@
|
|||||||
#include "pipe/p_screen.h"
|
#include "pipe/p_screen.h"
|
||||||
#include "dd_util.h"
|
#include "dd_util.h"
|
||||||
#include "os/os_thread.h"
|
#include "os/os_thread.h"
|
||||||
|
#include "util/u_log.h"
|
||||||
|
|
||||||
enum dd_mode {
|
enum dd_mode {
|
||||||
DD_DETECT_HANGS,
|
DD_DETECT_HANGS,
|
||||||
@@ -224,6 +225,7 @@ struct dd_draw_record {
|
|||||||
|
|
||||||
struct dd_call call;
|
struct dd_call call;
|
||||||
struct dd_draw_state_copy draw_state;
|
struct dd_draw_state_copy draw_state;
|
||||||
|
struct u_log_page *log_page;
|
||||||
char *driver_state_log;
|
char *driver_state_log;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -235,6 +237,8 @@ struct dd_context
|
|||||||
struct dd_draw_state draw_state;
|
struct dd_draw_state draw_state;
|
||||||
unsigned num_draw_calls;
|
unsigned num_draw_calls;
|
||||||
|
|
||||||
|
struct u_log_context log;
|
||||||
|
|
||||||
/* Pipelined hang detection.
|
/* Pipelined hang detection.
|
||||||
*
|
*
|
||||||
* This is without unnecessary flushes and waits. There is a memory-based
|
* This is without unnecessary flushes and waits. There is a memory-based
|
||||||
|
Reference in New Issue
Block a user