This series resolves https://bugs.freedesktop.org/show_bug.cgi?id=101985, currently blocking 17.2 release.
Tested-by: Mark Janes <mark.a.ja...@intel.com> Samuel Iglesias Gonsálvez <sigles...@igalia.com> writes: > v2: > - Use nibctrl and the number of written/read owords to detect > each case of a 1-OWord Block Read/Write (Curro) > > Signed-off-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com> > --- > src/intel/compiler/brw_eu.h | 14 +++++----- > src/intel/compiler/brw_eu_emit.c | 46 > +++++++++++++++++++++++++-------- > src/intel/compiler/brw_fs_generator.cpp | 4 +-- > 3 files changed, 44 insertions(+), 20 deletions(-) > > diff --git a/src/intel/compiler/brw_eu.h b/src/intel/compiler/brw_eu.h > index a3a9c63239..de8470b4b5 100644 > --- a/src/intel/compiler/brw_eu.h > +++ b/src/intel/compiler/brw_eu.h > @@ -342,15 +342,15 @@ void brw_oword_block_read(struct brw_codegen *p, > unsigned brw_scratch_surface_idx(const struct brw_codegen *p); > > void brw_oword_block_read_scratch(struct brw_codegen *p, > - struct brw_reg dest, > - struct brw_reg mrf, > - int num_regs, > - unsigned offset); > + struct brw_reg dest, > + struct brw_reg mrf, > + int num_owords, > + unsigned offset); > > void brw_oword_block_write_scratch(struct brw_codegen *p, > - struct brw_reg mrf, > - int num_regs, > - unsigned offset); > + struct brw_reg mrf, > + int num_owords, > + unsigned offset); > > void gen7_block_read_scratch(struct brw_codegen *p, > struct brw_reg dest, > diff --git a/src/intel/compiler/brw_eu_emit.c > b/src/intel/compiler/brw_eu_emit.c > index 0b0d67a5c5..956ef263a2 100644 > --- a/src/intel/compiler/brw_eu_emit.c > +++ b/src/intel/compiler/brw_eu_emit.c > @@ -2133,9 +2133,9 @@ brw_scratch_surface_idx(const struct brw_codegen *p) > * register spilling. > */ > void brw_oword_block_write_scratch(struct brw_codegen *p, > - struct brw_reg mrf, > - int num_regs, > - unsigned offset) > + struct brw_reg mrf, > + int num_owords, > + unsigned offset) > { > const struct gen_device_info *devinfo = p->devinfo; > const unsigned target_cache = > @@ -2149,7 +2149,7 @@ void brw_oword_block_write_scratch(struct brw_codegen > *p, > > mrf = retype(mrf, BRW_REGISTER_TYPE_UD); > > - const unsigned mlen = 1 + num_regs; > + const unsigned mlen = 1 + MAX2(1, num_owords / 2); > > /* Set up the message header. This is g0, with g0.2 filled with > * the offset. We don't want to leave our offset around in g0 or > @@ -2180,6 +2180,18 @@ void brw_oword_block_write_scratch(struct brw_codegen > *p, > int send_commit_msg; > struct brw_reg src_header = retype(brw_vec8_grf(0, 0), > BRW_REGISTER_TYPE_UW); > + int msg_control = BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_owords * 4); > + > + /* By default for 1-oword, msg_control = > BRW_DATAPORT_OWORD_BLOCK_1_OWORDLOW, > + * fix it when we are writing the high part. > + */ > + if (num_owords == 1 && brw_inst_nib_control(devinfo, insn) != 0) { > + msg_control = BRW_DATAPORT_OWORD_BLOCK_1_OWORDHIGH; > + /* The messages only work with group == 0, we use the group to know > which > + * message emit (1-OWORD LOW or 1-OWORD HIGH), so reset it to zero. > + */ > + brw_inst_set_group(devinfo, insn, 0); > + } > > brw_inst_set_compression(devinfo, insn, false); > > @@ -2223,7 +2235,7 @@ void brw_oword_block_write_scratch(struct brw_codegen > *p, > brw_set_dp_write_message(p, > insn, > brw_scratch_surface_idx(p), > - BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_regs * 8), > + msg_control, > msg_type, > target_cache, > mlen, > @@ -2245,10 +2257,10 @@ void brw_oword_block_write_scratch(struct brw_codegen > *p, > */ > void > brw_oword_block_read_scratch(struct brw_codegen *p, > - struct brw_reg dest, > - struct brw_reg mrf, > - int num_regs, > - unsigned offset) > + struct brw_reg dest, > + struct brw_reg mrf, > + int num_owords, > + unsigned offset) > { > const struct gen_device_info *devinfo = p->devinfo; > > @@ -2269,7 +2281,7 @@ brw_oword_block_read_scratch(struct brw_codegen *p, > } > dest = retype(dest, BRW_REGISTER_TYPE_UW); > > - const unsigned rlen = num_regs; > + const unsigned rlen = MAX2(1, num_owords / 2); > const unsigned target_cache = > (devinfo->gen >= 7 ? GEN7_SFID_DATAPORT_DATA_CACHE : > devinfo->gen >= 6 ? GEN6_SFID_DATAPORT_RENDER_CACHE : > @@ -2291,6 +2303,18 @@ brw_oword_block_read_scratch(struct brw_codegen *p, > > { > brw_inst *insn = next_insn(p, BRW_OPCODE_SEND); > + int msg_control = BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_owords * 4); > + > + /* By default for 1-oword, msg_control = > BRW_DATAPORT_OWORD_BLOCK_1_OWORDLOW, > + * fix it when we are reading the high part. > + */ > + if (num_owords == 1 && brw_inst_nib_control(devinfo, insn) != 0) { > + msg_control = BRW_DATAPORT_OWORD_BLOCK_1_OWORDHIGH; > + /* The messages only work with group == 0, we use the group to know > which > + * message emit (1-OWORD LOW or 1-OWORD HIGH), so reset it to zero. > + */ > + brw_inst_set_group(devinfo, insn, 0); > + } > > assert(brw_inst_pred_control(devinfo, insn) == 0); > brw_inst_set_compression(devinfo, insn, false); > @@ -2306,7 +2330,7 @@ brw_oword_block_read_scratch(struct brw_codegen *p, > brw_set_dp_read_message(p, > insn, > brw_scratch_surface_idx(p), > - BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_regs * 8), > + msg_control, > BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, /* > msg_type */ > target_cache, > 1, /* msg_length */ > diff --git a/src/intel/compiler/brw_fs_generator.cpp > b/src/intel/compiler/brw_fs_generator.cpp > index 2ade486705..2dd28048eb 100644 > --- a/src/intel/compiler/brw_fs_generator.cpp > +++ b/src/intel/compiler/brw_fs_generator.cpp > @@ -1178,7 +1178,7 @@ fs_generator::generate_scratch_write(fs_inst *inst, > struct brw_reg src) > retype(offset(src, block_size * i), BRW_REGISTER_TYPE_UD)); > > brw_oword_block_write_scratch(p, brw_message_reg(inst->base_mrf), > - block_size, > + block_size * 2, > inst->offset + block_size * REG_SIZE * > i); > } > > @@ -1192,7 +1192,7 @@ fs_generator::generate_scratch_read(fs_inst *inst, > struct brw_reg dst) > assert(inst->mlen != 0); > > brw_oword_block_read_scratch(p, dst, brw_message_reg(inst->base_mrf), > - inst->exec_size / 8, inst->offset); > + inst->exec_size / 4, inst->offset); > } > > void > -- > 2.11.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev