radeonsi: use ip_type in debug code instead of hardcoding GFX

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28725>
This commit is contained in:
Marek Olšák 2024-03-16 15:40:27 -04:00 committed by Marge Bot
parent e7000c02e4
commit 882ee264a6
3 changed files with 26 additions and 16 deletions

View File

@ -21,6 +21,11 @@ static void si_dump_bo_list(struct si_context *sctx, const struct radeon_saved_c
DEBUG_GET_ONCE_OPTION(replace_shaders, "RADEON_REPLACE_SHADERS", NULL)
static enum amd_ip_type si_get_context_ip_type(struct si_context *sctx)
{
return sctx->has_graphics ? AMD_IP_GFX : AMD_IP_COMPUTE;
}
/**
* Store a linearized copy of all chunks of \p cs together with the buffer
* list in \p saved.
@ -322,6 +327,7 @@ static void si_dump_debug_registers(struct si_context *sctx, FILE *f)
struct si_log_chunk_cs {
struct si_context *ctx;
struct si_saved_cs *cs;
enum amd_ip_type ip_type;
bool dump_bo_list;
unsigned gfx_begin, gfx_end;
};
@ -334,14 +340,16 @@ static void si_log_chunk_type_cs_destroy(void *data)
}
static void si_parse_current_ib(FILE *f, struct radeon_cmdbuf *cs, unsigned begin, unsigned end,
int *last_trace_id, unsigned trace_id_count, const char *name,
enum amd_gfx_level gfx_level, enum radeon_family family)
int *last_trace_id, unsigned trace_id_count,
enum amd_ip_type ip_type, enum amd_gfx_level gfx_level,
enum radeon_family family)
{
unsigned orig_end = end;
const char *ip_name = ac_get_ip_type_string(NULL, ip_type);
assert(begin <= end);
fprintf(f, "------------------ %s begin (dw = %u) ------------------\n", name, begin);
fprintf(f, "------------------ %s begin (dw = %u) ------------------\n", ip_name, begin);
for (unsigned prev_idx = 0; prev_idx < cs->num_prev; ++prev_idx) {
struct radeon_cmdbuf_chunk *chunk = &cs->prev[prev_idx];
@ -355,7 +363,7 @@ static void si_parse_current_ib(FILE *f, struct radeon_cmdbuf *cs, unsigned begi
.trace_id_count = trace_id_count,
.gfx_level = gfx_level,
.family = family,
.ip_type = AMD_IP_GFX,
.ip_type = ip_type,
};
ac_parse_ib_chunk(&ib_parser);
@ -365,7 +373,7 @@ static void si_parse_current_ib(FILE *f, struct radeon_cmdbuf *cs, unsigned begi
return;
if (begin < chunk->cdw)
fprintf(f, "\n---------- Next %s Chunk ----------\n\n", name);
fprintf(f, "\n---------- %s next chunk ----------\n\n", ip_name);
begin -= MIN2(begin, chunk->cdw);
end -= chunk->cdw;
@ -381,18 +389,19 @@ static void si_parse_current_ib(FILE *f, struct radeon_cmdbuf *cs, unsigned begi
.trace_id_count = trace_id_count,
.gfx_level = gfx_level,
.family = family,
.ip_type = AMD_IP_GFX,
.ip_type = ip_type,
};
ac_parse_ib_chunk(&ib_parser);
fprintf(f, "------------------- %s end (dw = %u) -------------------\n\n", name, orig_end);
fprintf(f, "------------------- %s end (dw = %u) -------------------\n\n", ip_name, orig_end);
}
void si_print_current_ib(struct si_context *sctx, FILE *f)
{
si_parse_current_ib(f, &sctx->gfx_cs, 0, sctx->gfx_cs.prev_dw + sctx->gfx_cs.current.cdw,
NULL, 0, "GFX", sctx->gfx_level, sctx->family);
NULL, 0, si_get_context_ip_type(sctx), sctx->gfx_level,
sctx->family);
}
static void si_log_chunk_type_cs_print(void *data, FILE *f)
@ -421,13 +430,13 @@ static void si_log_chunk_type_cs_print(void *data, FILE *f)
.trace_id_count = map ? 1 : 0,
.gfx_level = ctx->gfx_level,
.family = ctx->family,
.ip_type = AMD_IP_GFX,
.ip_type = chunk->ip_type,
};
ac_parse_ib(&ib_parser, "IB");
} else {
si_parse_current_ib(f, &ctx->gfx_cs, chunk->gfx_begin, chunk->gfx_end, &last_trace_id,
map ? 1 : 0, "IB", ctx->gfx_level, ctx->family);
map ? 1 : 0, chunk->ip_type, ctx->gfx_level, ctx->family);
}
}
@ -458,6 +467,7 @@ static void si_log_cs(struct si_context *ctx, struct u_log_context *log, bool du
chunk->ctx = ctx;
si_saved_cs_reference(&chunk->cs, scs);
chunk->ip_type = si_get_context_ip_type(ctx);
chunk->dump_bo_list = dump_bo_list;
chunk->gfx_begin = scs->gfx_last_dw;
@ -1059,7 +1069,7 @@ void si_log_compute_state(struct si_context *sctx, struct u_log_context *log)
si_dump_compute_descriptors(sctx, log);
}
void si_check_vm_faults(struct si_context *sctx, struct radeon_saved_cs *saved, enum amd_ip_type ring)
void si_check_vm_faults(struct si_context *sctx, struct radeon_saved_cs *saved)
{
struct pipe_screen *screen = sctx->b.screen;
FILE *f;
@ -1084,8 +1094,9 @@ void si_check_vm_faults(struct si_context *sctx, struct radeon_saved_cs *saved,
if (sctx->apitrace_call_number)
fprintf(f, "Last apitrace call: %u\n\n", sctx->apitrace_call_number);
switch (ring) {
case AMD_IP_GFX: {
switch (si_get_context_ip_type(sctx)) {
case AMD_IP_GFX:
case AMD_IP_COMPUTE: {
struct u_log_context log;
u_log_context_init(&log);

View File

@ -211,7 +211,7 @@ void si_flush_gfx_cs(struct si_context *ctx, unsigned flags, struct pipe_fence_h
*/
ctx->ws->fence_wait(ctx->ws, ctx->last_gfx_fence, 800 * 1000 * 1000);
si_check_vm_faults(ctx, &ctx->current_saved_cs->gfx, AMD_IP_GFX);
si_check_vm_faults(ctx, &ctx->current_saved_cs->gfx);
}
if (unlikely(ctx->sqtt && (flags & PIPE_FLUSH_END_OF_FRAME))) {

View File

@ -1583,8 +1583,7 @@ void si_log_hw_flush(struct si_context *sctx);
void si_log_draw_state(struct si_context *sctx, struct u_log_context *log);
void si_log_compute_state(struct si_context *sctx, struct u_log_context *log);
void si_init_debug_functions(struct si_context *sctx);
void si_check_vm_faults(struct si_context *sctx, struct radeon_saved_cs *saved,
enum amd_ip_type ring);
void si_check_vm_faults(struct si_context *sctx, struct radeon_saved_cs *saved);
bool si_replace_shader(unsigned num, struct si_shader_binary *binary);
void si_print_current_ib(struct si_context *sctx, FILE *f);