On Fri, Feb 27, 2015 at 05:34:44PM +0200, Francisco Jerez wrote: > --- > src/mesa/drivers/dri/i965/brw_eu.h | 19 ++++++-- > src/mesa/drivers/dri/i965/brw_eu_emit.c | 58 > ++++++++++++++++++------ > src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 55 +++++----------------- > src/mesa/drivers/dri/i965/brw_vec4_generator.cpp | 37 ++++----------- > 4 files changed, 77 insertions(+), 92 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_eu.h > b/src/mesa/drivers/dri/i965/brw_eu.h > index 1b954c8..9b1e0e2 100644 > --- a/src/mesa/drivers/dri/i965/brw_eu.h > +++ b/src/mesa/drivers/dri/i965/brw_eu.h > @@ -205,11 +205,6 @@ void brw_set_sampler_message(struct brw_compile *p, > unsigned simd_mode, > unsigned return_format); > > -void brw_set_indirect_send_descriptor(struct brw_compile *p, > - brw_inst *insn, > - unsigned sfid, > - struct brw_reg descriptor); > - > void brw_set_dp_read_message(struct brw_compile *p, > brw_inst *insn, > unsigned binding_table_index, > @@ -243,6 +238,20 @@ void brw_urb_WRITE(struct brw_compile *p, > unsigned offset, > unsigned swizzle); > > +/** > + * Send message to shared unit \p sfid with a possibly indirect descriptor \p > + * desc. If the descriptor is not an immediate it will be transparently > + * loaded to an address register using an OR instruction that will be > returned > + * to the caller so additional descriptor bits can be specified with the > usual > + * brw_set_*_message() helper functions. > + */ > +struct brw_inst * > +brw_send_indirect_message(struct brw_compile *p, > + unsigned sfid, > + struct brw_reg dst, > + struct brw_reg payload, > + struct brw_reg desc); > + > void brw_ff_sync(struct brw_compile *p, > struct brw_reg dest, > unsigned msg_reg_nr, > diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c > b/src/mesa/drivers/dri/i965/brw_eu_emit.c > index e69840a..cd2ce92 100644 > --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c > +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c > @@ -751,21 +751,6 @@ brw_set_sampler_message(struct brw_compile *p, > } > } > > -void brw_set_indirect_send_descriptor(struct brw_compile *p, > - brw_inst *insn, > - unsigned sfid, > - struct brw_reg descriptor) > -{ > - /* Only a0.0 may be used as SEND's descriptor operand. */ > - assert(descriptor.file == BRW_ARCHITECTURE_REGISTER_FILE); > - assert(descriptor.type == BRW_REGISTER_TYPE_UD); > - assert(descriptor.nr == BRW_ARF_ADDRESS); > - assert(descriptor.subnr == 0); > - > - brw_set_message_descriptor(p, insn, sfid, 0, 0, false, false); > - brw_set_src1(p, insn, descriptor); > -} > - > static void > gen7_set_dp_scratch_message(struct brw_compile *p, > brw_inst *inst, > @@ -2490,6 +2475,49 @@ void brw_urb_WRITE(struct brw_compile *p, > swizzle); > } > > +struct brw_inst * > +brw_send_indirect_message(struct brw_compile *p, > + unsigned sfid, > + struct brw_reg dst, > + struct brw_reg payload, > + struct brw_reg desc) > +{ > + const struct brw_context *brw = p->brw; > + struct brw_inst *send, *setup; > + > + assert(desc.type == BRW_REGISTER_TYPE_UD); > + > + if (desc.file == BRW_IMMEDIATE_VALUE) { > + setup = send = next_insn(p, BRW_OPCODE_SEND); > + brw_set_src1(p, send, desc); > + > + } else { > + struct brw_reg addr = retype(brw_address_reg(0), BRW_REGISTER_TYPE_UD); > + > + brw_push_insn_state(p); > + brw_set_default_access_mode(p, BRW_ALIGN_1); > + brw_set_default_mask_control(p, BRW_MASK_DISABLE); > + brw_set_default_predicate_control(p, BRW_PREDICATE_NONE); > + > + /* Load the indirect descriptor to an address register using OR so the > + * caller can specify additional descriptor bits with the usual > + * brw_set_*_message() helper functions. > + */ > + setup = brw_OR(p, addr, desc, brw_imm_ud(0)); > + > + brw_pop_insn_state(p); > + > + send = next_insn(p, BRW_OPCODE_SEND); > + brw_set_src1(p, send, addr); > + } > + > + brw_set_dest(p, send, retype(dst, BRW_REGISTER_TYPE_UD)); > + brw_set_src0(p, send, retype(payload, BRW_REGISTER_TYPE_UD)); > + brw_inst_set_sfid(brw, send, sfid); > + > + return setup; > +} > + > static int > brw_find_next_block_end(struct brw_compile *p, int start_offset) > { > diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp > b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp > index 2ebbfe6..a54a274 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp > @@ -754,9 +754,10 @@ fs_generator::generate_tex(fs_inst *inst, struct brw_reg > dst, struct brw_reg src > brw_AND(p, addr, addr, brw_imm_ud(0x0ff)); > brw_OR(p, addr, addr, temp); > > - /* a0.0 |= <descriptor> */ > - brw_inst *insn_or = brw_next_insn(p, BRW_OPCODE_OR); > - brw_set_sampler_message(p, insn_or, > + /* dst = send(offset, a0.0 | <descriptor>) */ > + brw_inst *insn = brw_send_indirect_message( > + p, BRW_SFID_SAMPLER, dst, src, addr); > + brw_set_sampler_message(p, insn, > 0 /* surface */, > 0 /* sampler */, > msg_type, > @@ -765,17 +766,6 @@ fs_generator::generate_tex(fs_inst *inst, struct brw_reg > dst, struct brw_reg src > inst->header_present /* header */, > simd_mode, > return_format); > - brw_inst_set_exec_size(p->brw, insn_or, BRW_EXECUTE_1); > - brw_inst_set_src1_reg_type(p->brw, insn_or, BRW_REGISTER_TYPE_UD); > - brw_set_src0(p, insn_or, addr); > - brw_set_dest(p, insn_or, addr); > - > - > - /* dst = send(offset, a0.0) */ > - brw_inst *insn_send = brw_next_insn(p, BRW_OPCODE_SEND); > - brw_set_dest(p, insn_send, dst); > - brw_set_src0(p, insn_send, src); > - brw_set_indirect_send_descriptor(p, insn_send, BRW_SFID_SAMPLER, addr); > > brw_pop_insn_state(p); > > @@ -1049,9 +1039,10 @@ > fs_generator::generate_uniform_pull_constant_load_gen7(fs_inst *inst, > brw_set_src0(p, insn_and, vec1(retype(index, BRW_REGISTER_TYPE_UD))); > brw_set_src1(p, insn_and, brw_imm_ud(0x0ff)); > > - /* a0.0 |= <descriptor> */ > - brw_inst *insn_or = brw_next_insn(p, BRW_OPCODE_OR); > - brw_set_dp_read_message(p, insn_or, > + /* dst = send(payload, a0.0 | <descriptor>) */ > + brw_inst *insn = brw_send_indirect_message( > + p, GEN6_SFID_DATAPORT_CONSTANT_CACHE, vec16(dst), payload, addr); > + brw_set_dp_read_message(p, insn, > 0, /* surface */ > BRW_DATAPORT_OWORD_BLOCK_4_OWORDS, > GEN7_DATAPORT_DC_OWORD_BLOCK_READ, > @@ -1059,17 +1050,6 @@ > fs_generator::generate_uniform_pull_constant_load_gen7(fs_inst *inst, > 1, /* mlen */ > true, /* header */ > 2); /* rlen */ > - brw_inst_set_exec_size(p->brw, insn_or, BRW_EXECUTE_1); > - brw_inst_set_src1_reg_type(p->brw, insn_or, BRW_REGISTER_TYPE_UD); > - brw_set_src0(p, insn_or, addr); > - brw_set_dest(p, insn_or, addr); > - > - /* dst = send(payload, a0.0) */ > - brw_inst *insn_send = brw_next_insn(p, BRW_OPCODE_SEND); > - brw_set_dest(p, insn_send, vec16(dst)); > - brw_set_src0(p, insn_send, payload); > - brw_set_indirect_send_descriptor(p, insn_send, > - GEN6_SFID_DATAPORT_CONSTANT_CACHE, > addr); > > brw_pop_insn_state(p); > > @@ -1206,10 +1186,10 @@ > fs_generator::generate_varying_pull_constant_load_gen7(fs_inst *inst, > brw_set_src0(p, insn_and, vec1(retype(index, BRW_REGISTER_TYPE_UD))); > brw_set_src1(p, insn_and, brw_imm_ud(0x0ff)); > > - > - /* a0.0 |= <descriptor> */ > - brw_inst *insn_or = brw_next_insn(p, BRW_OPCODE_OR); > - brw_set_sampler_message(p, insn_or, > + /* dst = send(offset, a0.0 | <descriptor>) */ > + brw_inst *insn = brw_send_indirect_message( > + p, BRW_SFID_SAMPLER, dst, offset, addr); > + brw_set_sampler_message(p, insn, > 0 /* surface */, > 0 /* sampler */, > GEN5_SAMPLER_MESSAGE_SAMPLE_LD, > @@ -1218,17 +1198,6 @@ > fs_generator::generate_varying_pull_constant_load_gen7(fs_inst *inst, > false /* header */, > simd_mode, > 0); > - brw_inst_set_exec_size(p->brw, insn_or, BRW_EXECUTE_1); > - brw_inst_set_src1_reg_type(p->brw, insn_or, BRW_REGISTER_TYPE_UD); > - brw_set_src0(p, insn_or, addr); > - brw_set_dest(p, insn_or, addr); > - > - > - /* dst = send(offset, a0.0) */ > - brw_inst *insn_send = brw_next_insn(p, BRW_OPCODE_SEND); > - brw_set_dest(p, insn_send, retype(dst, BRW_REGISTER_TYPE_UW));
I'm just reading this through again and noticed that the destination type changes here to BRW_REGISTER_TYPE_UD (set in brw_send_indirect_message()). _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev