summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2018-11-16 14:49:25 -0600
committerJason Ekstrand <[email protected]>2019-01-29 18:43:55 +0000
commite46fb33143c20132e8a56e20a6ea4c768886bc79 (patch)
tree416ae837bdcd01bdfb9063397063eb638bf01f0b
parent13a6fabc628505f3a940c47a179db23f5ea91652 (diff)
intel/disasm: Rework SEND decoding to use descriptors
Instead of fetching the information out of the instruction directly, fetch the descriptor and then pluck the information out of the descriptor. The current scheme works ok for SEND but with SENDS, it all falls to pieces because the descriptor is completely shuffled around. This commit doesn't actually convert everything. One notable exception is URB messages which don't even use descriptors in emit_urb_WRITE yet. Reviewed-by: Iago Toral Quiroga <[email protected]>
-rw-r--r--src/intel/compiler/brw_disasm.c86
1 files changed, 50 insertions, 36 deletions
diff --git a/src/intel/compiler/brw_disasm.c b/src/intel/compiler/brw_disasm.c
index 3778d8d996d..025575ed8ab 100644
--- a/src/intel/compiler/brw_disasm.c
+++ b/src/intel/compiler/brw_disasm.c
@@ -1601,12 +1601,16 @@ brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo,
if (opcode == BRW_OPCODE_SEND || opcode == BRW_OPCODE_SENDC) {
enum brw_message_target sfid = brw_inst_sfid(devinfo, inst);
+ bool has_imm_desc = false;
+ uint32_t imm_desc = 0;
if (brw_inst_src1_reg_file(devinfo, inst) != BRW_IMMEDIATE_VALUE) {
/* show the indirect descriptor source */
pad(file, 48);
err |= src1(file, devinfo, inst);
pad(file, 64);
} else {
+ has_imm_desc = true;
+ imm_desc = brw_inst_send_desc(devinfo, inst);
pad(file, 48);
}
@@ -1622,7 +1626,7 @@ brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo,
sfid, &space);
string(file, " MsgDesc:");
- if (brw_inst_src1_reg_file(devinfo, inst) != BRW_IMMEDIATE_VALUE) {
+ if (!has_imm_desc) {
format(file, " indirect");
} else {
switch (sfid) {
@@ -1641,21 +1645,24 @@ brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo,
case BRW_SFID_SAMPLER:
if (devinfo->gen >= 5) {
err |= control(file, "sampler message", gen5_sampler_msg_type,
- brw_inst_sampler_msg_type(devinfo, inst), &space);
+ brw_sampler_desc_msg_type(devinfo, imm_desc),
+ &space);
err |= control(file, "sampler simd mode", gen5_sampler_simd_mode,
- brw_inst_sampler_simd_mode(devinfo, inst), &space);
- format(file, " Surface = %"PRIu64" Sampler = %"PRIu64,
- brw_inst_binding_table_index(devinfo, inst),
- brw_inst_sampler(devinfo, inst));
+ brw_sampler_desc_simd_mode(devinfo, imm_desc),
+ &space);
+ format(file, " Surface = %u Sampler = %u",
+ brw_sampler_desc_binding_table_index(devinfo, imm_desc),
+ brw_sampler_desc_sampler(devinfo, imm_desc));
} else {
- format(file, " (%"PRIu64", %"PRIu64", %"PRIu64", ",
- brw_inst_binding_table_index(devinfo, inst),
- brw_inst_sampler(devinfo, inst),
- brw_inst_sampler_msg_type(devinfo, inst));
+ format(file, " (%u, %u, %u, ",
+ brw_sampler_desc_binding_table_index(devinfo, imm_desc),
+ brw_sampler_desc_sampler(devinfo, imm_desc),
+ brw_sampler_desc_msg_type(devinfo, imm_desc));
if (!devinfo->is_g4x) {
err |= control(file, "sampler target format",
sampler_target_format,
- brw_inst_sampler_return_format(devinfo, inst), NULL);
+ brw_sampler_desc_return_format(devinfo, imm_desc),
+ NULL);
}
string(file, ")");
}
@@ -1664,29 +1671,31 @@ brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo,
case GEN6_SFID_DATAPORT_CONSTANT_CACHE:
/* aka BRW_SFID_DATAPORT_READ on Gen4-5 */
if (devinfo->gen >= 6) {
- format(file, " (%"PRIu64", %"PRIu64", %"PRIu64", %"PRIu64")",
- brw_inst_binding_table_index(devinfo, inst),
- brw_inst_dp_msg_control(devinfo, inst),
- brw_inst_dp_msg_type(devinfo, inst),
- devinfo->gen >= 7 ? 0 : brw_inst_dp_write_commit(devinfo, inst));
+ format(file, " (%u, %u, %u, %u)",
+ brw_dp_desc_binding_table_index(devinfo, imm_desc),
+ brw_dp_desc_msg_control(devinfo, imm_desc),
+ brw_dp_desc_msg_type(devinfo, imm_desc),
+ devinfo->gen >= 7 ? 0u :
+ brw_dp_write_desc_write_commit(devinfo, imm_desc));
} else {
bool is_965 = devinfo->gen == 4 && !devinfo->is_g4x;
err |= control(file, "DP read message type",
is_965 ? gen4_dp_read_port_msg_type :
g45_dp_read_port_msg_type,
- brw_inst_dp_read_msg_type(devinfo, inst),
+ brw_dp_read_desc_msg_type(devinfo, imm_desc),
&space);
- format(file, " MsgCtrl = 0x%"PRIx64,
- brw_inst_dp_read_msg_control(devinfo, inst));
+ format(file, " MsgCtrl = 0x%u",
+ brw_dp_read_desc_msg_control(devinfo, imm_desc));
- format(file, " Surface = %"PRIu64, brw_inst_binding_table_index(devinfo, inst));
+ format(file, " Surface = %u",
+ brw_dp_desc_binding_table_index(devinfo, imm_desc));
}
break;
case GEN6_SFID_DATAPORT_RENDER_CACHE: {
/* aka BRW_SFID_DATAPORT_WRITE on Gen4-5 */
- unsigned msg_type = brw_inst_dp_write_msg_type(devinfo, inst);
+ unsigned msg_type = brw_dp_write_desc_msg_type(devinfo, imm_desc);
err |= control(file, "DP rc message type",
dp_rc_msg_type(devinfo), msg_type, &space);
@@ -1700,16 +1709,18 @@ brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo,
brw_inst_rt_message_type(devinfo, inst), &space);
if (devinfo->gen >= 6 && brw_inst_rt_slot_group(devinfo, inst))
string(file, " Hi");
- if (brw_inst_rt_last(devinfo, inst))
+ if (brw_dp_write_desc_last_render_target(devinfo, imm_desc))
string(file, " LastRT");
- if (devinfo->gen < 7 && brw_inst_dp_write_commit(devinfo, inst))
+ if (devinfo->gen < 7 &&
+ brw_dp_write_desc_write_commit(devinfo, imm_desc))
string(file, " WriteCommit");
} else {
- format(file, " MsgCtrl = 0x%"PRIx64,
- brw_inst_dp_write_msg_control(devinfo, inst));
+ format(file, " MsgCtrl = 0x%u",
+ brw_dp_write_desc_msg_control(devinfo, imm_desc));
}
- format(file, " Surface = %"PRIu64, brw_inst_binding_table_index(devinfo, inst));
+ format(file, " Surface = %u",
+ brw_dp_desc_binding_table_index(devinfo, imm_desc));
break;
}
@@ -1766,17 +1777,20 @@ brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo,
err |= control(file, "DP DC0 message type",
dp_dc0_msg_type_gen7,
- brw_inst_dp_msg_type(devinfo, inst), &space);
+ brw_dp_desc_msg_type(devinfo, imm_desc), &space);
- format(file, ", %"PRIu64", ", brw_inst_binding_table_index(devinfo, inst));
+ format(file, ", %u, ",
+ brw_dp_desc_binding_table_index(devinfo, imm_desc));
switch (brw_inst_dp_msg_type(devinfo, inst)) {
case GEN7_DATAPORT_DC_UNTYPED_ATOMIC_OP:
control(file, "atomic op", aop,
- brw_inst_imm_ud(devinfo, inst) >> 8 & 0xf, &space);
+ brw_dp_desc_msg_control(devinfo, imm_desc) & 0xf,
+ &space);
break;
default:
- format(file, "%"PRIu64, brw_inst_dp_msg_control(devinfo, inst));
+ format(file, "%u",
+ brw_dp_desc_msg_control(devinfo, imm_desc));
}
format(file, ")");
break;
@@ -1787,14 +1801,14 @@ brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo,
if (devinfo->gen >= 7) {
format(file, " (");
- unsigned msg_ctrl = brw_inst_dp_msg_control(devinfo, inst);
+ unsigned msg_ctrl = brw_dp_desc_msg_control(devinfo, imm_desc);
err |= control(file, "DP DC1 message type",
dp_dc1_msg_type_hsw,
- brw_inst_dp_msg_type(devinfo, inst), &space);
+ brw_dp_desc_msg_type(devinfo, imm_desc), &space);
- format(file, ", Surface = %"PRIu64", ",
- brw_inst_binding_table_index(devinfo, inst));
+ format(file, ", Surface = %u, ",
+ brw_dp_desc_binding_table_index(devinfo, imm_desc));
switch (brw_inst_dp_msg_type(devinfo, inst)) {
case HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP:
@@ -1847,8 +1861,8 @@ brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo,
if (space)
string(file, " ");
- format(file, "mlen %"PRIu64, brw_inst_mlen(devinfo, inst));
- format(file, " rlen %"PRIu64, brw_inst_rlen(devinfo, inst));
+ format(file, "mlen %u", brw_message_desc_mlen(devinfo, imm_desc));
+ format(file, " rlen %u", brw_message_desc_rlen(devinfo, imm_desc));
}
}
pad(file, 64);