From 7b7f95b95236747233feb8de5781a72e357a8dc4 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Sat, 28 Jun 2014 20:25:57 -0700 Subject: i965/disasm: Improve render target write message disassembly. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, we decoded render target write messages as: render ( RT write, 0, 16, 12, 0) mlen 8 rlen 0 which made you remember (or look up) what the numbers meant: 1. The binding table index 2. The raw message control, undecoded: - Last Render Target Select - Slot Group Select - Message Type (SIMD8, normal SIMD16, SIMD16 replicate data, ...) 3. The dataport message type, again (already decoded as "RT write") 4. The write commit bit (0 or 1) Needless to say, having to decipher that yourself is annoying. Now, we do: render RT write SIMD16 LastRT Surface = 0 mlen 8 rlen 0 with optional "Hi" and "WriteCommit" for slot group/write commit. Thanks to the new brw_inst API, we can also stop duplicating code on a per-generation basis. Signed-off-by: Kenneth Graunke Reviewed-by: Matt Turner Reviewed-by: Kristian Høgsberg --- src/mesa/drivers/dri/i965/brw_disasm.c | 77 +++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 30 deletions(-) (limited to 'src/mesa/drivers') diff --git a/src/mesa/drivers/dri/i965/brw_disasm.c b/src/mesa/drivers/dri/i965/brw_disasm.c index fa286b397ba..00c0fc41ac5 100644 --- a/src/mesa/drivers/dri/i965/brw_disasm.c +++ b/src/mesa/drivers/dri/i965/brw_disasm.c @@ -381,6 +381,17 @@ static const char *const gen6_sfid[16] = { [HSW_SFID_CRE] = "cre", }; +static const char *const dp_write_port_msg_type[8] = { + [0b000] = "OWord block write", + [0b001] = "OWord dual block write", + [0b010] = "media block write", + [0b011] = "DWord scattered write", + [0b100] = "RT write", + [0b101] = "streamed VB write", + [0b110] = "RT UNORM write", /* G45+ */ + [0b111] = "flush render cache", +}; + static const char *const dp_rc_msg_type_gen6[16] = { [BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ] = "OWORD block read", [GEN6_DATAPORT_READ_MESSAGE_RENDER_UNORM_READ] = "RT UNORM read", @@ -401,6 +412,16 @@ static const char *const dp_rc_msg_type_gen6[16] = { [GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_UNORM_WRITE] = "RT UNORM write", }; +static const char *const m_rt_write_subtype[] = { + [0b000] = "SIMD16", + [0b001] = "SIMD16/RepData", + [0b010] = "SIMD8/DualSrcLow", + [0b011] = "SIMD8/DualSrcHigh", + [0b100] = "SIMD8", + [0b101] = "SIMD8/ImageWrite", /* Gen6+ */ + [0b111] = "SIMD16/RepData-111", /* no idea how this is different than 1 */ +}; + static const char *const dp_dc0_msg_type_gen7[16] = { [GEN7_DATAPORT_DC_OWORD_BLOCK_READ] = "DC OWORD block read", [GEN7_DATAPORT_DC_UNALIGNED_OWORD_BLOCK_READ] = @@ -1322,40 +1343,36 @@ brw_disassemble_inst(FILE *file, struct brw_context *brw, brw_inst *inst, } break; - case GEN6_SFID_DATAPORT_RENDER_CACHE: + case GEN6_SFID_DATAPORT_RENDER_CACHE: { /* aka BRW_SFID_DATAPORT_WRITE on Gen4-5 */ - if (brw->gen >= 7) { - format(file, " ("); - - err |= control(file, "DP rc message type", - dp_rc_msg_type_gen6, - brw_inst_dp_msg_type(brw, inst), &space); - - format(file, ", %d, %d, %d)", - brw_inst_binding_table_index(brw, inst), - brw_inst_dp_msg_control(brw, inst), - brw_inst_dp_msg_type(brw, inst)); - } else if (brw->gen == 6) { - format(file, " ("); - - err |= control(file, "DP rc message type", - dp_rc_msg_type_gen6, - brw_inst_dp_msg_type(brw, inst), &space); - - format(file, ", %d, %d, %d, %d)", - brw_inst_binding_table_index(brw, inst), - brw_inst_dp_msg_control(brw, inst), - brw_inst_dp_msg_type(brw, inst), - brw_inst_dp_write_commit(brw, inst)); + unsigned msg_type = brw_inst_dp_write_msg_type(brw, inst); + + err |= control(file, "DP rc message type", + brw->gen >= 6 ? dp_rc_msg_type_gen6 + : dp_write_port_msg_type, + msg_type, &space); + + bool is_rt_write = msg_type == + (brw->gen >= 6 ? GEN6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE + : BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE); + + if (is_rt_write) { + err |= control(file, "RT message type", m_rt_write_subtype, + brw_inst_rt_message_type(brw, inst), &space); + if (brw->gen >= 6 && brw_inst_rt_slot_group(brw, inst)) + string(file, " Hi"); + if (brw_inst_rt_last(brw, inst)) + string(file, " LastRT"); + if (brw->gen < 7 && brw_inst_dp_write_commit(brw, inst)) + string(file, " WriteCommit"); } else { - format(file, " (%d, %d, %d, %d)", - brw_inst_binding_table_index(brw, inst), - (brw_inst_rt_last(brw, inst) << 3) | - brw_inst_dp_write_msg_control(brw, inst), - brw_inst_dp_write_msg_type(brw, inst), - brw_inst_dp_write_commit(brw, inst)); + format(file, " MsgCtrl = 0x%x", + brw_inst_dp_write_msg_control(brw, inst)); } + + format(file, " Surface = %d", brw_inst_binding_table_index(brw, inst)); break; + } case BRW_SFID_URB: format(file, " %d", brw_inst_urb_global_offset(brw, inst)); -- cgit v1.2.3