Signed-off-by: Jordan Justen <jordan.l.jus...@intel.com> --- src/mesa/drivers/dri/i965/brw_context.h | 2 + src/mesa/drivers/dri/i965/brw_disasm.c | 65 +++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+)
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index b1e32bab034..4bb67f84adf 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1408,6 +1408,8 @@ int brw_disassemble_inst_str(char **str, const struct gen_device_info *devinfo, struct brw_inst *inst, bool is_compacted); int brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo, struct brw_inst *inst, bool is_compacted); +int brw_disassemble_prog(char **out, const struct gen_device_info *devinfo, + void *assembly, int start); /* brw_vs.c */ gl_clip_plane *brw_select_clip_planes(struct gl_context *ctx); diff --git a/src/mesa/drivers/dri/i965/brw_disasm.c b/src/mesa/drivers/dri/i965/brw_disasm.c index 108fc9699da..817cd060aab 100644 --- a/src/mesa/drivers/dri/i965/brw_disasm.c +++ b/src/mesa/drivers/dri/i965/brw_disasm.c @@ -1701,3 +1701,68 @@ brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo, return err; } } + +static bool +is_send(uint32_t opcode) +{ + return (opcode == BRW_OPCODE_SEND || + opcode == BRW_OPCODE_SENDC || + opcode == BRW_OPCODE_SENDS || + opcode == BRW_OPCODE_SENDSC ); +} + +int +brw_disassemble_prog(char **out, const struct gen_device_info *devinfo, + void *assembly, int start) +{ + OUTPUT o; + bool dump_hex = false; + int offset = start; + char *inst_disasm; + int err = 0; + + memset(&o, 0, sizeof(o)); + + /* This loop exits when send-with-EOT or when opcode is 0 */ + while (true) { + brw_inst *insn = assembly + offset; + brw_inst uncompacted; + bool compacted = brw_inst_cmpt_control(devinfo, insn); + if (0) + err |= format(&o, "0x%08x: ", offset); + + if (compacted) { + brw_compact_inst *compacted = (void *)insn; + if (dump_hex) { + err |= format(&o, "0x%08x 0x%08x ", + ((uint32_t *)insn)[1], + ((uint32_t *)insn)[0]); + } + + brw_uncompact_instruction(devinfo, &uncompacted, compacted); + insn = &uncompacted; + offset += 8; + } else { + if (dump_hex) { + err |= format(&o, "0x%08x 0x%08x 0x%08x 0x%08x ", + ((uint32_t *)insn)[3], + ((uint32_t *)insn)[2], + ((uint32_t *)insn)[1], + ((uint32_t *)insn)[0]); + } + offset += 16; + } + + brw_disassemble_inst_str(&inst_disasm, devinfo, insn, compacted); + err |= string(&o, inst_disasm); + + /* Simplistic, but efficient way to terminate disasm */ + uint32_t opcode = brw_inst_opcode(devinfo, insn); + if (opcode == 0 || (is_send(opcode) && brw_inst_eot(devinfo, insn))) { + break; + } + } + + *out = o.buf; + return err; +} -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev