summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Seurer <konstantin.seurer@gmail.com>2024-02-16 18:00:06 +0100
committerMarge Bot <emma+marge@anholt.net>2024-03-19 16:08:13 +0000
commit2e4d36510488cd4b6d2a0d6356e9ef0b6819b606 (patch)
treeda1ef01cb92cd1200fcae7b4c529b10b24c9430d
parent8f3cc3cb29d970aaac5f7871783a60a9a48c167e (diff)
ac: Annotate context rolls
Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27549>
-rw-r--r--src/amd/common/ac_debug.h3
-rw-r--r--src/amd/common/ac_gather_context_rolls.c18
-rw-r--r--src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c4
-rw-r--r--src/gallium/drivers/radeonsi/si_debug.c2
4 files changed, 20 insertions, 7 deletions
diff --git a/src/amd/common/ac_debug.h b/src/amd/common/ac_debug.h
index 3dd215095da..2f0039f1fde 100644
--- a/src/amd/common/ac_debug.h
+++ b/src/amd/common/ac_debug.h
@@ -63,8 +63,9 @@ void ac_print_gpuvm_fault_status(FILE *output, enum amd_gfx_level gfx_level,
uint32_t status);
/* ac_gather_context_rolls.c */
+struct hash_table;
void ac_gather_context_rolls(FILE *f, uint32_t **ibs, uint32_t *ib_dw_sizes, unsigned num_ibs,
- const struct radeon_info *info);
+ struct hash_table *annotations, const struct radeon_info *info);
/* ac_parse_ib.c */
void ac_dump_reg(FILE *file, enum amd_gfx_level gfx_level, enum radeon_family family,
diff --git a/src/amd/common/ac_gather_context_rolls.c b/src/amd/common/ac_gather_context_rolls.c
index 7bb8575b3f0..5da636b297c 100644
--- a/src/amd/common/ac_gather_context_rolls.c
+++ b/src/amd/common/ac_gather_context_rolls.c
@@ -22,6 +22,7 @@
#include "sid_tables.h"
#include "util/bitset.h"
+#include "util/hash_table.h"
#include "util/u_dynarray.h"
#include "util/u_memory.h"
@@ -34,6 +35,7 @@ struct ac_context_reg_deltas {
struct ac_context_reg_state {
uint32_t regs[1024];
struct ac_context_reg_deltas deltas;
+ const char *annotation;
};
struct ac_context_roll_ctx {
@@ -93,9 +95,16 @@ static unsigned get_reg_index(unsigned reg)
return (reg - SI_CONTEXT_REG_OFFSET) / 4;
}
-static void ac_ib_gather_context_rolls(struct ac_context_roll_ctx *ctx, uint32_t *ib, int num_dw)
+static void ac_ib_gather_context_rolls(struct ac_context_roll_ctx *ctx, uint32_t *ib, int num_dw,
+ struct hash_table *annotations)
{
for (unsigned cur_dw = 0; cur_dw < num_dw;) {
+ if (annotations) {
+ struct hash_entry *marker = _mesa_hash_table_search(annotations, ib + cur_dw);
+ if (marker)
+ ctx->cur->annotation = marker->data;
+ }
+
uint32_t header = ib[cur_dw++];
unsigned type = PKT_TYPE_G(header);
@@ -292,7 +301,7 @@ static void ac_ib_gather_context_rolls(struct ac_context_roll_ctx *ctx, uint32_t
}
void ac_gather_context_rolls(FILE *f, uint32_t **ibs, uint32_t *ib_dw_sizes, unsigned num_ibs,
- const struct radeon_info *info)
+ struct hash_table *annotations, const struct radeon_info *info)
{
struct ac_context_roll_ctx ctx;
@@ -304,7 +313,7 @@ void ac_gather_context_rolls(FILE *f, uint32_t **ibs, uint32_t *ib_dw_sizes, uns
/* Parse the IBs. */
for (unsigned i = 0; i < num_ibs; i++)
- ac_ib_gather_context_rolls(&ctx, ibs[i], ib_dw_sizes[i]);
+ ac_ib_gather_context_rolls(&ctx, ibs[i], ib_dw_sizes[i], annotations);
/* Roll the last context to add it to the list. */
ac_roll_context(&ctx);
@@ -315,6 +324,9 @@ void ac_gather_context_rolls(FILE *f, uint32_t **ibs, uint32_t *ib_dw_sizes, uns
util_dynarray_foreach(&ctx.rolls, struct ac_context_reg_state *, iter) {
struct ac_context_reg_state *state = *iter;
+ if (state->annotation)
+ fprintf(f, "%s: ", state->annotation);
+
unsigned i;
BITSET_FOREACH_SET(i, state->deltas.changed, 1024) {
unsigned reg_offset = SI_CONTEXT_REG_OFFSET + i * 4;
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
index 6bc8b13bdab..93a447ee7fe 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c
@@ -1411,7 +1411,7 @@ radv_amdgpu_winsys_cs_dump(struct radeon_cmdbuf *_cs, FILE *file, const int *tra
ws->info.gfx_level, ws->info.family, cs->hw_ip, radv_amdgpu_winsys_get_cpu_addr, cs);
} else {
uint32_t *ib_dw = addr_info.cpu_addr;
- ac_gather_context_rolls(file, &ib_dw, &cs->ib_buffers[0].cdw, 1, &ws->info);
+ ac_gather_context_rolls(file, &ib_dw, &cs->ib_buffers[0].cdw, 1, NULL, &ws->info);
}
} else {
uint32_t **ibs = type == RADV_CS_DUMP_TYPE_CTX_ROLLS ? malloc(cs->num_ib_buffers * sizeof(uint32_t *)) : NULL;
@@ -1443,7 +1443,7 @@ radv_amdgpu_winsys_cs_dump(struct radeon_cmdbuf *_cs, FILE *file, const int *tra
}
if (type == RADV_CS_DUMP_TYPE_CTX_ROLLS) {
- ac_gather_context_rolls(file, ibs, ib_dw_sizes, cs->num_ib_buffers, &ws->info);
+ ac_gather_context_rolls(file, ibs, ib_dw_sizes, cs->num_ib_buffers, NULL, &ws->info);
free(ibs);
free(ib_dw_sizes);
diff --git a/src/gallium/drivers/radeonsi/si_debug.c b/src/gallium/drivers/radeonsi/si_debug.c
index a6a8c8902a2..367549bdee2 100644
--- a/src/gallium/drivers/radeonsi/si_debug.c
+++ b/src/gallium/drivers/radeonsi/si_debug.c
@@ -1095,7 +1095,7 @@ void si_gather_context_rolls(struct si_context *sctx)
ib_dw_sizes[cs->num_prev] = cs->current.cdw;
FILE *f = fopen(sctx->screen->context_roll_log_filename, "a");
- ac_gather_context_rolls(f, ibs, ib_dw_sizes, cs->num_prev + 1, &sctx->screen->info);
+ ac_gather_context_rolls(f, ibs, ib_dw_sizes, cs->num_prev + 1, NULL, &sctx->screen->info);
fclose(f);
}