From 2bac890bf5896a7ddc27a901b8014e28bc77d84c Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Thu, 7 Jun 2018 10:50:20 -0700 Subject: [PATCH] intel/eu: Use descriptor constructors for dataport read messages. v2: Use SET_BITS macro instead of left shift (Ken). Reviewed-by: Kenneth Graunke --- src/intel/compiler/brw_eu.h | 38 +++++++++++---- src/intel/compiler/brw_eu_emit.c | 77 ++++++++++--------------------- src/intel/compiler/brw_fs_generator.cpp | 32 ++++++------- src/intel/compiler/brw_vec4_generator.cpp | 33 +++++++------ 4 files changed, 85 insertions(+), 95 deletions(-) diff --git a/src/intel/compiler/brw_eu.h b/src/intel/compiler/brw_eu.h index 0828476..edb024f 100644 --- a/src/intel/compiler/brw_eu.h +++ b/src/intel/compiler/brw_eu.h @@ -245,16 +245,6 @@ ROUND(RNDE) /* Helpers for SEND instruction: */ -void brw_set_dp_read_message(struct brw_codegen *p, - brw_inst *insn, - unsigned binding_table_index, - unsigned msg_control, - unsigned msg_type, - unsigned target_cache, - unsigned msg_length, - bool header_present, - unsigned response_length); - void brw_set_dp_write_message(struct brw_codegen *p, brw_inst *insn, unsigned binding_table_index, @@ -315,6 +305,34 @@ brw_sampler_desc(const struct gen_device_info *devinfo, SET_BITS(msg_type, 15, 14)); } +/** + * Construct a message descriptor immediate with the specified dataport read + * function controls. + */ +static inline uint32_t +brw_dp_read_desc(const struct gen_device_info *devinfo, + unsigned binding_table_index, + unsigned msg_control, + unsigned msg_type, + unsigned target_cache) +{ + const unsigned desc = SET_BITS(binding_table_index, 7, 0); + if (devinfo->gen >= 7) + return (desc | SET_BITS(msg_control, 13, 8) | + SET_BITS(msg_type, 17, 14)); + else if (devinfo->gen >= 6) + return (desc | SET_BITS(msg_control, 12, 8) | + SET_BITS(msg_type, 16, 13)); + else if (devinfo->gen >= 5 || devinfo->is_g4x) + return (desc | SET_BITS(msg_control, 10, 8) | + SET_BITS(msg_type, 13, 11) | + SET_BITS(target_cache, 15, 14)); + else + return (desc | SET_BITS(msg_control, 11, 8) | + SET_BITS(msg_type, 13, 12) | + SET_BITS(target_cache, 15, 14)); +} + void brw_urb_WRITE(struct brw_codegen *p, struct brw_reg dest, unsigned msg_reg_nr, diff --git a/src/intel/compiler/brw_eu_emit.c b/src/intel/compiler/brw_eu_emit.c index 6d9e7e0..ce5e29f 100644 --- a/src/intel/compiler/brw_eu_emit.c +++ b/src/intel/compiler/brw_eu_emit.c @@ -524,34 +524,6 @@ brw_set_dp_write_message(struct brw_codegen *p, brw_inst_set_null_rt(devinfo, insn, false); } -void -brw_set_dp_read_message(struct brw_codegen *p, - brw_inst *insn, - unsigned binding_table_index, - unsigned msg_control, - unsigned msg_type, - unsigned target_cache, - unsigned msg_length, - bool header_present, - unsigned response_length) -{ - const struct gen_device_info *devinfo = p->devinfo; - const unsigned sfid = (devinfo->gen >= 6 ? target_cache : - BRW_SFID_DATAPORT_READ); - - brw_set_desc(p, insn, brw_message_desc( - devinfo, msg_length, response_length, header_present)); - - const unsigned opcode = brw_inst_opcode(devinfo, insn); - if (opcode == BRW_OPCODE_SEND || opcode == BRW_OPCODE_SENDC) - brw_inst_set_sfid(devinfo, insn, sfid); - brw_inst_set_binding_table_index(devinfo, insn, binding_table_index); - brw_inst_set_dp_read_msg_type(devinfo, insn, msg_type); - brw_inst_set_dp_read_msg_control(devinfo, insn, msg_control); - if (devinfo->gen < 6) - brw_inst_set_dp_read_target_cache(devinfo, insn, target_cache); -} - static void gen7_set_dp_scratch_message(struct brw_codegen *p, brw_inst *inst, @@ -2104,7 +2076,7 @@ brw_oword_block_read_scratch(struct brw_codegen *p, const unsigned target_cache = (devinfo->gen >= 7 ? GEN7_SFID_DATAPORT_DATA_CACHE : devinfo->gen >= 6 ? GEN6_SFID_DATAPORT_RENDER_CACHE : - BRW_DATAPORT_READ_TARGET_RENDER_CACHE); + BRW_SFID_DATAPORT_READ); { brw_push_insn_state(p); @@ -2124,6 +2096,7 @@ brw_oword_block_read_scratch(struct brw_codegen *p, { brw_inst *insn = next_insn(p, BRW_OPCODE_SEND); + brw_inst_set_sfid(devinfo, insn, target_cache); assert(brw_inst_pred_control(devinfo, insn) == 0); brw_inst_set_compression(devinfo, insn, false); @@ -2135,15 +2108,12 @@ brw_oword_block_read_scratch(struct brw_codegen *p, brw_inst_set_base_mrf(devinfo, insn, mrf.nr); } - brw_set_dp_read_message(p, - insn, - brw_scratch_surface_idx(p), - BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_regs * 8), - BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, /* msg_type */ - target_cache, - 1, /* msg_length */ - true, /* header_present */ - rlen); + brw_set_desc(p, insn, + brw_message_desc(devinfo, 1, rlen, true) | + brw_dp_read_desc(devinfo, brw_scratch_surface_idx(p), + BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_regs * 8), + BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, + BRW_DATAPORT_READ_TARGET_RENDER_CACHE)); } } @@ -2195,7 +2165,7 @@ void brw_oword_block_read(struct brw_codegen *p, const struct gen_device_info *devinfo = p->devinfo; const unsigned target_cache = (devinfo->gen >= 6 ? GEN6_SFID_DATAPORT_CONSTANT_CACHE : - BRW_DATAPORT_READ_TARGET_DATA_CACHE); + BRW_SFID_DATAPORT_READ); const unsigned exec_size = 1 << brw_get_default_exec_size(p); /* On newer hardware, offset is in units of owords. */ @@ -2224,6 +2194,8 @@ void brw_oword_block_read(struct brw_codegen *p, brw_inst *insn = next_insn(p, BRW_OPCODE_SEND); + brw_inst_set_sfid(devinfo, insn, target_cache); + /* cast dest to a uword[8] vector */ dest = retype(vec8(dest), BRW_REGISTER_TYPE_UW); @@ -2235,13 +2207,12 @@ void brw_oword_block_read(struct brw_codegen *p, brw_inst_set_base_mrf(devinfo, insn, mrf.nr); } - brw_set_dp_read_message(p, insn, bind_table_index, - BRW_DATAPORT_OWORD_BLOCK_DWORDS(exec_size), - BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, - target_cache, - 1, /* msg_length */ - true, /* header_present */ - DIV_ROUND_UP(exec_size, 8)); /* response_length */ + brw_set_desc(p, insn, + brw_message_desc(devinfo, 1, DIV_ROUND_UP(exec_size, 8), true) | + brw_dp_read_desc(devinfo, bind_table_index, + BRW_DATAPORT_OWORD_BLOCK_DWORDS(exec_size), + BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, + BRW_DATAPORT_READ_TARGET_DATA_CACHE)); brw_pop_insn_state(p); } @@ -2324,14 +2295,16 @@ gen9_fb_READ(struct brw_codegen *p, brw_get_default_exec_size(p) == BRW_EXECUTE_16 ? 0 : 1; brw_inst *insn = next_insn(p, BRW_OPCODE_SENDC); + brw_inst_set_sfid(devinfo, insn, GEN6_SFID_DATAPORT_RENDER_CACHE); brw_set_dest(p, insn, dst); brw_set_src0(p, insn, payload); - brw_set_dp_read_message(p, insn, binding_table_index, - per_sample << 5 | msg_subtype, - GEN9_DATAPORT_RC_RENDER_TARGET_READ, - GEN6_SFID_DATAPORT_RENDER_CACHE, - msg_length, true /* header_present */, - response_length); + brw_set_desc( + p, insn, + brw_message_desc(devinfo, msg_length, response_length, true) | + brw_dp_read_desc(devinfo, binding_table_index, + per_sample << 5 | msg_subtype, + GEN9_DATAPORT_RC_RENDER_TARGET_READ, + BRW_DATAPORT_READ_TARGET_RENDER_CACHE)); brw_inst_set_rt_slot_group(devinfo, insn, brw_get_default_group(p) / 16); return insn; diff --git a/src/intel/compiler/brw_fs_generator.cpp b/src/intel/compiler/brw_fs_generator.cpp index 49cc030..d09d7bf 100644 --- a/src/intel/compiler/brw_fs_generator.cpp +++ b/src/intel/compiler/brw_fs_generator.cpp @@ -1421,15 +1421,16 @@ fs_generator::generate_uniform_pull_constant_load_gen7(fs_inst *inst, brw_inst *send = brw_next_insn(p, BRW_OPCODE_SEND); brw_pop_insn_state(p); + brw_inst_set_sfid(devinfo, send, GEN6_SFID_DATAPORT_CONSTANT_CACHE); brw_set_dest(p, send, retype(dst, BRW_REGISTER_TYPE_UD)); brw_set_src0(p, send, retype(payload, BRW_REGISTER_TYPE_UD)); - brw_set_dp_read_message(p, send, surf_index, - BRW_DATAPORT_OWORD_BLOCK_DWORDS(inst->exec_size), - GEN7_DATAPORT_DC_OWORD_BLOCK_READ, - GEN6_SFID_DATAPORT_CONSTANT_CACHE, - 1, /* mlen */ - true, /* header */ - DIV_ROUND_UP(inst->size_written, REG_SIZE)); + brw_set_desc(p, send, + brw_message_desc(devinfo, 1, DIV_ROUND_UP(inst->size_written, + REG_SIZE), true) | + brw_dp_read_desc(devinfo, surf_index, + BRW_DATAPORT_OWORD_BLOCK_DWORDS(inst->exec_size), + GEN7_DATAPORT_DC_OWORD_BLOCK_READ, + BRW_DATAPORT_READ_TARGET_DATA_CACHE)); } else { struct brw_reg addr = vec1(retype(brw_address_reg(0), BRW_REGISTER_TYPE_UD)); @@ -1445,17 +1446,16 @@ fs_generator::generate_uniform_pull_constant_load_gen7(fs_inst *inst, brw_set_src1(p, insn_and, brw_imm_ud(0x0ff)); /* dst = send(payload, a0.0 | ) */ - brw_inst *insn = brw_send_indirect_message( + brw_send_indirect_message( p, GEN6_SFID_DATAPORT_CONSTANT_CACHE, retype(dst, BRW_REGISTER_TYPE_UD), - retype(payload, BRW_REGISTER_TYPE_UD), addr, 0); - brw_set_dp_read_message(p, insn, 0 /* surface */, - BRW_DATAPORT_OWORD_BLOCK_DWORDS(inst->exec_size), - GEN7_DATAPORT_DC_OWORD_BLOCK_READ, - GEN6_SFID_DATAPORT_CONSTANT_CACHE, - 1, /* mlen */ - true, /* header */ - DIV_ROUND_UP(inst->size_written, REG_SIZE)); + retype(payload, BRW_REGISTER_TYPE_UD), addr, + brw_message_desc(devinfo, 1, + DIV_ROUND_UP(inst->size_written, REG_SIZE), true) | + brw_dp_read_desc(devinfo, 0 /* surface */, + BRW_DATAPORT_OWORD_BLOCK_DWORDS(inst->exec_size), + GEN7_DATAPORT_DC_OWORD_BLOCK_READ, + BRW_DATAPORT_READ_TARGET_DATA_CACHE)); brw_pop_insn_state(p); } diff --git a/src/intel/compiler/brw_vec4_generator.cpp b/src/intel/compiler/brw_vec4_generator.cpp index dabbbdd..013b9d4 100644 --- a/src/intel/compiler/brw_vec4_generator.cpp +++ b/src/intel/compiler/brw_vec4_generator.cpp @@ -1155,23 +1155,23 @@ generate_scratch_read(struct brw_codegen *p, const unsigned target_cache = devinfo->gen >= 7 ? GEN7_SFID_DATAPORT_DATA_CACHE : devinfo->gen >= 6 ? GEN6_SFID_DATAPORT_RENDER_CACHE : - BRW_DATAPORT_READ_TARGET_RENDER_CACHE; + BRW_SFID_DATAPORT_READ; /* Each of the 8 channel enables is considered for whether each * dword is written. */ brw_inst *send = brw_next_insn(p, BRW_OPCODE_SEND); + brw_inst_set_sfid(devinfo, send, target_cache); brw_set_dest(p, send, dst); brw_set_src0(p, send, header); if (devinfo->gen < 6) brw_inst_set_cond_modifier(devinfo, send, inst->base_mrf); - brw_set_dp_read_message(p, send, - brw_scratch_surface_idx(p), - BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD, - msg_type, target_cache, - 2, /* mlen */ - true, /* header_present */ - 1 /* rlen */); + brw_set_desc(p, send, + brw_message_desc(devinfo, 2, 1, true) | + brw_dp_read_desc(devinfo, + brw_scratch_surface_idx(p), + BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD, + msg_type, BRW_DATAPORT_READ_TARGET_RENDER_CACHE)); } static void @@ -1265,7 +1265,7 @@ generate_pull_constant_load(struct brw_codegen *p, const struct gen_device_info *devinfo = p->devinfo; const unsigned target_cache = (devinfo->gen >= 6 ? GEN6_SFID_DATAPORT_SAMPLER_CACHE : - BRW_DATAPORT_READ_TARGET_DATA_CACHE); + BRW_SFID_DATAPORT_READ); assert(index.file == BRW_IMMEDIATE_VALUE && index.type == BRW_REGISTER_TYPE_UD); uint32_t surf_index = index.ud; @@ -1303,18 +1303,17 @@ generate_pull_constant_load(struct brw_codegen *p, * dword is written. */ brw_inst *send = brw_next_insn(p, BRW_OPCODE_SEND); + brw_inst_set_sfid(devinfo, send, target_cache); brw_set_dest(p, send, dst); brw_set_src0(p, send, header); if (devinfo->gen < 6) brw_inst_set_cond_modifier(p->devinfo, send, inst->base_mrf); - brw_set_dp_read_message(p, send, - surf_index, - BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD, - msg_type, - target_cache, - 2, /* mlen */ - true, /* header_present */ - 1 /* rlen */); + brw_set_desc(p, send, + brw_message_desc(devinfo, 2, 1, true) | + brw_dp_read_desc(devinfo, surf_index, + BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD, + msg_type, + BRW_DATAPORT_READ_TARGET_DATA_CACHE)); } static void -- 2.7.4