diff --git a/src/intel/compiler/brw_eu.h b/src/intel/compiler/brw_eu.h index 042bc68430b..0040bb6377f 100644 --- a/src/intel/compiler/brw_eu.h +++ b/src/intel/compiler/brw_eu.h @@ -1430,7 +1430,8 @@ brw_send_indirect_message(struct brw_codegen *p, struct brw_reg dst, struct brw_reg payload, struct brw_reg desc, - bool eot); + bool eot, + bool gather); void brw_send_indirect_split_message(struct brw_codegen *p, @@ -1442,7 +1443,8 @@ brw_send_indirect_split_message(struct brw_codegen *p, struct brw_reg ex_desc, unsigned ex_mlen, bool ex_bso, - bool eot); + bool eot, + bool gather); void gfx6_math(struct brw_codegen *p, struct brw_reg dest, @@ -1552,12 +1554,12 @@ brw_num_sources_from_inst(const struct brw_isa_info *isa, void brw_set_src1(struct brw_codegen *p, brw_eu_inst *insn, struct brw_reg reg); void brw_set_desc_ex(struct brw_codegen *p, brw_eu_inst *insn, - unsigned desc, unsigned ex_desc); + unsigned desc, unsigned ex_desc, bool gather); static inline void -brw_set_desc(struct brw_codegen *p, brw_eu_inst *insn, unsigned desc) +brw_set_desc(struct brw_codegen *p, brw_eu_inst *insn, unsigned desc, bool gather) { - brw_set_desc_ex(p, insn, desc, 0); + brw_set_desc_ex(p, insn, desc, 0, gather); } void brw_set_uip_jip(struct brw_codegen *p, int start_offset); diff --git a/src/intel/compiler/brw_eu_emit.c b/src/intel/compiler/brw_eu_emit.c index da1a10e4f3f..0d2c354cfcc 100644 --- a/src/intel/compiler/brw_eu_emit.c +++ b/src/intel/compiler/brw_eu_emit.c @@ -353,9 +353,10 @@ brw_set_src1(struct brw_codegen *p, brw_eu_inst *inst, struct brw_reg reg) */ void brw_set_desc_ex(struct brw_codegen *p, brw_eu_inst *inst, - unsigned desc, unsigned ex_desc) + unsigned desc, unsigned ex_desc, bool gather) { const struct intel_device_info *devinfo = p->devinfo; + assert(!gather || devinfo->ver >= 30); assert(brw_eu_inst_opcode(p->isa, inst) == BRW_OPCODE_SEND || brw_eu_inst_opcode(p->isa, inst) == BRW_OPCODE_SENDC); if (devinfo->ver < 12) @@ -363,7 +364,7 @@ brw_set_desc_ex(struct brw_codegen *p, brw_eu_inst *inst, IMM, BRW_TYPE_UD); brw_eu_inst_set_send_desc(devinfo, inst, desc); if (devinfo->ver >= 9) - brw_eu_inst_set_send_ex_desc(devinfo, inst, ex_desc, false); + brw_eu_inst_set_send_ex_desc(devinfo, inst, ex_desc, gather); } static void @@ -1438,7 +1439,8 @@ brw_send_indirect_message(struct brw_codegen *p, struct brw_reg dst, struct brw_reg payload, struct brw_reg desc, - bool eot) + bool eot, + bool gather) { const struct intel_device_info *devinfo = p->devinfo; struct brw_eu_inst *send; @@ -1450,7 +1452,7 @@ brw_send_indirect_message(struct brw_codegen *p, if (desc.file == IMM) { send = next_insn(p, BRW_OPCODE_SEND); brw_set_src0(p, send, retype(payload, BRW_TYPE_UD)); - brw_set_desc(p, send, desc.ud); + brw_set_desc(p, send, desc.ud, gather); } else { assert(desc.file == ADDRESS); assert(desc.subnr == 0); @@ -1477,7 +1479,8 @@ brw_send_indirect_split_message(struct brw_codegen *p, struct brw_reg ex_desc, unsigned ex_mlen, bool ex_bso, - bool eot) + bool eot, + bool gather) { const struct intel_device_info *devinfo = p->devinfo; struct brw_eu_inst *send; @@ -1502,7 +1505,7 @@ brw_send_indirect_split_message(struct brw_codegen *p, if (ex_desc.file == IMM) { brw_eu_inst_set_send_sel_reg32_ex_desc(devinfo, send, 0); - brw_eu_inst_set_sends_ex_desc(devinfo, send, ex_desc.ud, false); + brw_eu_inst_set_sends_ex_desc(devinfo, send, ex_desc.ud, gather); } else { assert(ex_desc.file == ADDRESS); assert((ex_desc.subnr & 0x3) == 0); @@ -1695,7 +1698,7 @@ brw_set_memory_fence_message(struct brw_codegen *p, const struct intel_device_info *devinfo = p->devinfo; brw_set_desc(p, insn, brw_message_desc( - devinfo, 1, (commit_enable ? 1 : 0), true)); + devinfo, 1, (commit_enable ? 1 : 0), true), false); brw_eu_inst_set_sfid(devinfo, insn, sfid); @@ -1735,7 +1738,8 @@ gfx12_set_memory_fence_message(struct brw_codegen *p, */ if (sfid == BRW_SFID_URB && p->devinfo->ver < 20) { brw_set_desc(p, insn, brw_urb_fence_desc(p->devinfo) | - brw_message_desc(p->devinfo, mlen, rlen, true)); + brw_message_desc(p->devinfo, mlen, rlen, true), + false); } else { enum lsc_fence_scope scope = lsc_fence_msg_desc_scope(p->devinfo, desc); enum lsc_flush_type flush_type = lsc_fence_msg_desc_flush_type(p->devinfo, desc); @@ -1764,7 +1768,8 @@ gfx12_set_memory_fence_message(struct brw_codegen *p, brw_set_desc(p, insn, lsc_fence_msg_desc(p->devinfo, scope, flush_type, false) | - brw_message_desc(p->devinfo, mlen, rlen, false)); + brw_message_desc(p->devinfo, mlen, rlen, false), + false); } } @@ -1942,7 +1947,7 @@ brw_barrier(struct brw_codegen *p, struct brw_reg src) brw_set_src0(p, inst, src); brw_set_src1(p, inst, brw_null_reg()); brw_set_desc(p, inst, brw_message_desc(devinfo, - 1 * reg_unit(devinfo), 0, false)); + 1 * reg_unit(devinfo), 0, false), false); brw_eu_inst_set_sfid(devinfo, inst, BRW_SFID_MESSAGE_GATEWAY); brw_eu_inst_set_gateway_subfuncid(devinfo, inst, diff --git a/src/intel/compiler/brw_generator.cpp b/src/intel/compiler/brw_generator.cpp index de7bdee5d95..c6b5bd6197e 100644 --- a/src/intel/compiler/brw_generator.cpp +++ b/src/intel/compiler/brw_generator.cpp @@ -168,8 +168,10 @@ brw_generator::generate_send(fs_inst *inst, struct brw_reg payload, struct brw_reg payload2) { + const bool gather = false; + if (ex_desc.file == IMM && ex_desc.ud == 0) { - brw_send_indirect_message(p, inst->sfid, dst, payload, desc, inst->eot); + brw_send_indirect_message(p, inst->sfid, dst, payload, desc, inst->eot, gather); if (inst->check_tdr) brw_eu_inst_set_opcode(p->isa, brw_last_inst, BRW_OPCODE_SENDC); } else { @@ -178,7 +180,7 @@ brw_generator::generate_send(fs_inst *inst, */ brw_send_indirect_split_message(p, inst->sfid, dst, payload, payload2, desc, ex_desc, inst->ex_mlen, - inst->send_ex_bso, inst->eot); + inst->send_ex_bso, inst->eot, gather); if (inst->check_tdr) brw_eu_inst_set_opcode(p->isa, brw_last_inst, devinfo->ver >= 12 ? BRW_OPCODE_SENDC : BRW_OPCODE_SENDSC);