intel/brw: Plumb through generator whether SEND is gather variant

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Lionel Landwerlin <None>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32410>
This commit is contained in:
Caio Oliveira 2024-11-20 08:12:52 -08:00 committed by Marge Bot
parent 00fac79f99
commit 2fca22347c
3 changed files with 26 additions and 17 deletions

View file

@ -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);

View file

@ -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,

View file

@ -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);