diff --git a/src/freedreno/computerator/a4xx.cc b/src/freedreno/computerator/a4xx.cc index 279791a1597..953ef1bb363 100644 --- a/src/freedreno/computerator/a4xx.cc +++ b/src/freedreno/computerator/a4xx.cc @@ -56,9 +56,9 @@ a4xx_assemble(struct backend *b, FILE *in) } static void -a4xx_disassemble(struct kernel *kernel, FILE *out) +a4xx_disassemble(struct kernel *kernel, struct ir3_disasm_options *options) { - ir3_asm_disassemble(to_ir3_kernel(kernel), out); + ir3_asm_disassemble(to_ir3_kernel(kernel), options); } static void diff --git a/src/freedreno/computerator/a6xx.cc b/src/freedreno/computerator/a6xx.cc index 9e1fbf2e7b8..dc1cf66d881 100644 --- a/src/freedreno/computerator/a6xx.cc +++ b/src/freedreno/computerator/a6xx.cc @@ -104,9 +104,9 @@ a6xx_assemble(struct backend *b, FILE *in) } static void -a6xx_disassemble(struct kernel *kernel, FILE *out) +a6xx_disassemble(struct kernel *kernel, struct ir3_disasm_options *options) { - ir3_asm_disassemble(to_ir3_kernel(kernel), out); + ir3_asm_disassemble(to_ir3_kernel(kernel), options); } template diff --git a/src/freedreno/computerator/ir3_asm.cc b/src/freedreno/computerator/ir3_asm.cc index 695a3c0a620..ddc3693d298 100644 --- a/src/freedreno/computerator/ir3_asm.cc +++ b/src/freedreno/computerator/ir3_asm.cc @@ -64,7 +64,7 @@ ir3_asm_assemble(struct ir3_compiler *c, FILE *in) } void -ir3_asm_disassemble(struct ir3_kernel *k, FILE *out) +ir3_asm_disassemble(struct ir3_kernel *k, struct ir3_disasm_options *options) { - ir3_shader_disasm(k->v, (uint32_t *)k->bin, out); + ir3_shader_disasm_options(k->v, (uint32_t *)k->bin, options); } diff --git a/src/freedreno/computerator/ir3_asm.h b/src/freedreno/computerator/ir3_asm.h index 8216e83b167..1325266d673 100644 --- a/src/freedreno/computerator/ir3_asm.h +++ b/src/freedreno/computerator/ir3_asm.h @@ -21,6 +21,7 @@ struct ir3_kernel { define_cast(kernel, ir3_kernel); struct ir3_kernel *ir3_asm_assemble(struct ir3_compiler *c, FILE *in); -void ir3_asm_disassemble(struct ir3_kernel *k, FILE *out); +void ir3_asm_disassemble(struct ir3_kernel *k, + struct ir3_disasm_options *options); #endif /* __IR3_ASM_H__ */ diff --git a/src/freedreno/computerator/main.cc b/src/freedreno/computerator/main.cc index 5ed79275c06..f1df517fd64 100644 --- a/src/freedreno/computerator/main.cc +++ b/src/freedreno/computerator/main.cc @@ -30,6 +30,7 @@ #include "util/u_math.h" #include "perfcntrs/freedreno_perfcntr.h" +#include "ir3/ir3_shader.h" #include "main.h" @@ -279,8 +280,12 @@ main(int argc, char **argv) } } - if (disasm) - backend->disassemble(kernel, stdout); + if (disasm) { + struct ir3_disasm_options options = { + .out = stdout, + }; + backend->disassemble(kernel, &options); + } if (grid[0] == 0) return 0; diff --git a/src/freedreno/computerator/main.h b/src/freedreno/computerator/main.h index f4af92d773d..99d7bf31dbd 100644 --- a/src/freedreno/computerator/main.h +++ b/src/freedreno/computerator/main.h @@ -50,7 +50,7 @@ struct perfcntr { /* per-generation entry-points: */ struct backend { struct kernel *(*assemble)(struct backend *b, FILE *in); - void (*disassemble)(struct kernel *kernel, FILE *out); + void (*disassemble)(struct kernel *kernel, struct ir3_disasm_options *); void (*emit_grid)(struct kernel *kernel, uint32_t grid[3], struct fd_submit *submit); diff --git a/src/freedreno/ir3/ir3_shader.c b/src/freedreno/ir3/ir3_shader.c index 9ac3b70b57e..0e1d3a9d347 100644 --- a/src/freedreno/ir3/ir3_shader.c +++ b/src/freedreno/ir3/ir3_shader.c @@ -1091,8 +1091,10 @@ print_raw(FILE *out, const BITSET_WORD *data, size_t size) { } void -ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin, FILE *out) +ir3_shader_disasm_options(struct ir3_shader_variant *so, uint32_t *bin, + struct ir3_disasm_options *options) { + FILE *out = options->out; struct ir3 *ir = so->ir; struct ir3_register *reg; const char *type = ir3_shader_stage(so); @@ -1243,6 +1245,16 @@ ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin, FILE *out) fprintf(out, "\n"); } +void +ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin, FILE *out) +{ + struct ir3_disasm_options options = { + .out = out, + }; + + ir3_shader_disasm_options(so, bin, &options); +} + uint64_t ir3_shader_outputs(const struct ir3_shader *so) { diff --git a/src/freedreno/ir3/ir3_shader.h b/src/freedreno/ir3/ir3_shader.h index 3afc016ebf4..d23f1605d5d 100644 --- a/src/freedreno/ir3/ir3_shader.h +++ b/src/freedreno/ir3/ir3_shader.h @@ -572,6 +572,10 @@ struct ir3_disasm_info { char *disasm; }; +struct ir3_disasm_options { + FILE *out; +}; + /* Represents half register in regid */ #define HALF_REG_ID 0x100 @@ -1185,6 +1189,8 @@ struct ir3_shader * ir3_shader_passthrough_tcs(struct ir3_shader *vs, unsigned patch_vertices); void ir3_shader_destroy(struct ir3_shader *shader); void ir3_shader_disasm(struct ir3_shader_variant *so, uint32_t *bin, FILE *out); +void ir3_shader_disasm_options(struct ir3_shader_variant *so, uint32_t *bin, + struct ir3_disasm_options *options); uint64_t ir3_shader_outputs(const struct ir3_shader *so); int ir3_glsl_type_size(const struct glsl_type *type, bool bindless);