diff --git a/src/asahi/lib/cmdbuf.xml b/src/asahi/lib/cmdbuf.xml
index 7753e5bdecc..211a5e96e18 100644
--- a/src/asahi/lib/cmdbuf.xml
+++ b/src/asahi/lib/cmdbuf.xml
@@ -779,27 +779,57 @@
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -811,7 +841,6 @@
-
diff --git a/src/asahi/lib/decode.c b/src/asahi/lib/decode.c
index 94e69b74ee3..f101dafb0b4 100644
--- a/src/asahi/lib/decode.c
+++ b/src/asahi/lib/decode.c
@@ -511,12 +511,38 @@ agxdecode_cdm(const uint8_t *map, uint64_t *link, bool verbose,
enum agx_cdm_block_type block_type = (map[3] >> 5);
switch (block_type) {
- case AGX_CDM_BLOCK_TYPE_COMPUTE_KERNEL: {
- agx_unpack(agxdecode_dump_stream, map, LAUNCH, cmd);
- agxdecode_stateful(cmd.pipeline, "Pipeline", agxdecode_usc, verbose,
- &cmd.sampler_state_register_count);
- DUMP_UNPACKED(LAUNCH, cmd, "Launch\n");
- return AGX_LAUNCH_LENGTH;
+ case AGX_CDM_BLOCK_TYPE_HEADER: {
+ size_t length = AGX_CDM_HEADER_LENGTH;
+
+#define CDM_PRINT(STRUCT_NAME, human) \
+ DUMP_CL(CDM_##STRUCT_NAME, map, human); \
+ map += AGX_CDM_##STRUCT_NAME##_LENGTH; \
+ length += AGX_CDM_##STRUCT_NAME##_LENGTH;
+
+ agx_unpack(agxdecode_dump_stream, map, CDM_HEADER, hdr);
+ agxdecode_stateful(hdr.pipeline, "Pipeline", agxdecode_usc, verbose,
+ &hdr.sampler_state_register_count);
+ DUMP_UNPACKED(CDM_HEADER, hdr, "Compute\n");
+ map += AGX_CDM_HEADER_LENGTH;
+
+ switch (hdr.mode) {
+ case AGX_CDM_MODE_DIRECT:
+ CDM_PRINT(GLOBAL_SIZE, "Global size");
+ CDM_PRINT(LOCAL_SIZE, "Local size");
+ break;
+ case AGX_CDM_MODE_INDIRECT_GLOBAL:
+ CDM_PRINT(INDIRECT, "Indirect buffer");
+ CDM_PRINT(LOCAL_SIZE, "Local size");
+ break;
+ case AGX_CDM_MODE_INDIRECT_LOCAL:
+ CDM_PRINT(INDIRECT, "Indirect buffer");
+ break;
+ default:
+ fprintf(agxdecode_dump_stream, "Unknown CDM mode: %u\n", hdr.mode);
+ break;
+ }
+
+ return length;
}
case AGX_CDM_BLOCK_TYPE_STREAM_LINK: {
@@ -531,6 +557,11 @@ agxdecode_cdm(const uint8_t *map, uint64_t *link, bool verbose,
return STATE_DONE;
}
+ case AGX_CDM_BLOCK_TYPE_LAUNCH: {
+ DUMP_CL(CDM_LAUNCH, map, "Launch");
+ return AGX_CDM_LAUNCH_LENGTH;
+ }
+
default:
fprintf(agxdecode_dump_stream, "Unknown CDM block type: %u\n",
block_type);