intel/compiler: Use SHADER_OPCODE_SEND for PI messages
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21094>
This commit is contained in:

committed by
Marge Bot

parent
9c62e0c77d
commit
714a291673
@@ -1671,9 +1671,13 @@ brw_pixel_interp_desc(UNUSED const struct intel_device_info *devinfo,
|
|||||||
unsigned msg_type,
|
unsigned msg_type,
|
||||||
bool noperspective,
|
bool noperspective,
|
||||||
bool coarse_pixel_rate,
|
bool coarse_pixel_rate,
|
||||||
unsigned simd_mode,
|
unsigned exec_size,
|
||||||
unsigned slot_group)
|
unsigned group)
|
||||||
{
|
{
|
||||||
|
assert(exec_size == 8 || exec_size == 16);
|
||||||
|
const bool simd_mode = exec_size == 16;
|
||||||
|
const bool slot_group = group >= 16;
|
||||||
|
|
||||||
assert(devinfo->ver >= 10 || !coarse_pixel_rate);
|
assert(devinfo->ver >= 10 || !coarse_pixel_rate);
|
||||||
return (SET_BITS(slot_group, 11, 11) |
|
return (SET_BITS(slot_group, 11, 11) |
|
||||||
SET_BITS(msg_type, 13, 12) |
|
SET_BITS(msg_type, 13, 12) |
|
||||||
|
@@ -3345,38 +3345,6 @@ brw_memory_fence(struct brw_codegen *p,
|
|||||||
brw_set_memory_fence_message(p, insn, sfid, commit_enable, bti);
|
brw_set_memory_fence_message(p, insn, sfid, commit_enable, bti);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
brw_pixel_interpolator_query(struct brw_codegen *p,
|
|
||||||
struct brw_reg dest,
|
|
||||||
struct brw_reg mrf,
|
|
||||||
bool noperspective,
|
|
||||||
bool coarse_pixel_rate,
|
|
||||||
unsigned mode,
|
|
||||||
struct brw_reg data,
|
|
||||||
unsigned msg_length,
|
|
||||||
unsigned response_length)
|
|
||||||
{
|
|
||||||
const struct intel_device_info *devinfo = p->devinfo;
|
|
||||||
const uint16_t exec_size = brw_get_default_exec_size(p);
|
|
||||||
const unsigned slot_group = brw_get_default_group(p) / 16;
|
|
||||||
const unsigned simd_mode = (exec_size == BRW_EXECUTE_16);
|
|
||||||
const unsigned desc =
|
|
||||||
brw_message_desc(devinfo, msg_length, response_length, false) |
|
|
||||||
brw_pixel_interp_desc(devinfo, mode, noperspective, coarse_pixel_rate,
|
|
||||||
simd_mode, slot_group);
|
|
||||||
|
|
||||||
/* brw_send_indirect_message will automatically use a direct send message
|
|
||||||
* if data is actually immediate.
|
|
||||||
*/
|
|
||||||
brw_send_indirect_message(p,
|
|
||||||
GFX7_SFID_PIXEL_INTERPOLATOR,
|
|
||||||
dest,
|
|
||||||
mrf,
|
|
||||||
vec1(data),
|
|
||||||
desc,
|
|
||||||
false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
brw_find_live_channel(struct brw_codegen *p, struct brw_reg dst, bool last)
|
brw_find_live_channel(struct brw_codegen *p, struct brw_reg dst, bool last)
|
||||||
{
|
{
|
||||||
|
@@ -625,12 +625,6 @@ private:
|
|||||||
struct brw_reg dst,
|
struct brw_reg dst,
|
||||||
struct brw_reg index);
|
struct brw_reg index);
|
||||||
|
|
||||||
void generate_pixel_interpolator_query(fs_inst *inst,
|
|
||||||
struct brw_reg dst,
|
|
||||||
struct brw_reg src,
|
|
||||||
struct brw_reg msg_data,
|
|
||||||
unsigned msg_type);
|
|
||||||
|
|
||||||
void generate_set_sample_id(fs_inst *inst,
|
void generate_set_sample_id(fs_inst *inst,
|
||||||
struct brw_reg dst,
|
struct brw_reg dst,
|
||||||
struct brw_reg src0,
|
struct brw_reg src0,
|
||||||
|
@@ -1611,31 +1611,6 @@ fs_generator::generate_varying_pull_constant_load_gfx4(fs_inst *inst,
|
|||||||
msg_type, simd_mode, return_format));
|
msg_type, simd_mode, return_format));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
fs_generator::generate_pixel_interpolator_query(fs_inst *inst,
|
|
||||||
struct brw_reg dst,
|
|
||||||
struct brw_reg src,
|
|
||||||
struct brw_reg msg_data,
|
|
||||||
unsigned msg_type)
|
|
||||||
{
|
|
||||||
const bool has_payload = inst->src[0].file != BAD_FILE;
|
|
||||||
assert(msg_data.type == BRW_REGISTER_TYPE_UD);
|
|
||||||
assert(inst->size_written % REG_SIZE == 0);
|
|
||||||
|
|
||||||
struct brw_wm_prog_data *prog_data = brw_wm_prog_data(this->prog_data);
|
|
||||||
|
|
||||||
brw_pixel_interpolator_query(p,
|
|
||||||
retype(dst, BRW_REGISTER_TYPE_UW),
|
|
||||||
/* If we don't have a payload, what we send doesn't matter */
|
|
||||||
has_payload ? src : brw_vec8_grf(0, 0),
|
|
||||||
inst->pi_noperspective,
|
|
||||||
prog_data->per_coarse_pixel_dispatch,
|
|
||||||
msg_type,
|
|
||||||
msg_data,
|
|
||||||
has_payload ? 2 * inst->exec_size / 8 : 1,
|
|
||||||
inst->size_written / REG_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sets vstride=1, width=4, hstride=0 of register src1 during
|
/* Sets vstride=1, width=4, hstride=0 of register src1 during
|
||||||
* the ADD instruction.
|
* the ADD instruction.
|
||||||
*/
|
*/
|
||||||
@@ -2389,24 +2364,6 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FS_OPCODE_INTERPOLATE_AT_SAMPLE:
|
|
||||||
generate_pixel_interpolator_query(inst, dst, src[0], src[1],
|
|
||||||
GFX7_PIXEL_INTERPOLATOR_LOC_SAMPLE);
|
|
||||||
send_count++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET:
|
|
||||||
generate_pixel_interpolator_query(inst, dst, src[0], src[1],
|
|
||||||
GFX7_PIXEL_INTERPOLATOR_LOC_SHARED_OFFSET);
|
|
||||||
send_count++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET:
|
|
||||||
generate_pixel_interpolator_query(inst, dst, src[0], src[1],
|
|
||||||
GFX7_PIXEL_INTERPOLATOR_LOC_PER_SLOT_OFFSET);
|
|
||||||
send_count++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CS_OPCODE_CS_TERMINATE:
|
case CS_OPCODE_CS_TERMINATE:
|
||||||
generate_cs_terminate(inst, src[0]);
|
generate_cs_terminate(inst, src[0]);
|
||||||
send_count++;
|
send_count++;
|
||||||
|
@@ -1107,6 +1107,13 @@ namespace {
|
|||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case GFX7_SFID_PIXEL_INTERPOLATOR:
|
||||||
|
if (devinfo->ver >= 7)
|
||||||
|
return calculate_desc(info, EU_UNIT_PI, 2, 0, 0, 14 /* XXX */, 0,
|
||||||
|
0, 90 /* XXX */, 0, 0, 0, 0);
|
||||||
|
else
|
||||||
|
abort();
|
||||||
|
|
||||||
case GFX12_SFID_UGM:
|
case GFX12_SFID_UGM:
|
||||||
case GFX12_SFID_TGM:
|
case GFX12_SFID_TGM:
|
||||||
case GFX12_SFID_SLM:
|
case GFX12_SFID_SLM:
|
||||||
|
@@ -2446,6 +2446,61 @@ lower_math_logical_send(const fs_builder &bld, fs_inst *inst)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
lower_interpolator_logical_send(const fs_builder &bld, fs_inst *inst,
|
||||||
|
const struct brw_wm_prog_data *wm_prog_data)
|
||||||
|
{
|
||||||
|
const intel_device_info *devinfo = bld.shader->devinfo;
|
||||||
|
|
||||||
|
/* We have to send something */
|
||||||
|
fs_reg payload = brw_vec8_grf(0, 0);
|
||||||
|
unsigned mlen = 1;
|
||||||
|
|
||||||
|
const fs_reg desc = inst->src[1];
|
||||||
|
|
||||||
|
unsigned mode;
|
||||||
|
switch (inst->opcode) {
|
||||||
|
case FS_OPCODE_INTERPOLATE_AT_SAMPLE:
|
||||||
|
assert(inst->src[0].file == BAD_FILE);
|
||||||
|
mode = GFX7_PIXEL_INTERPOLATOR_LOC_SAMPLE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET:
|
||||||
|
assert(inst->src[0].file == BAD_FILE);
|
||||||
|
mode = GFX7_PIXEL_INTERPOLATOR_LOC_SHARED_OFFSET;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET:
|
||||||
|
payload = inst->src[0];
|
||||||
|
mlen = 2 * inst->exec_size / 8;
|
||||||
|
mode = GFX7_PIXEL_INTERPOLATOR_LOC_PER_SLOT_OFFSET;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
unreachable("Invalid interpolator instruction");
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t desc_imm =
|
||||||
|
brw_pixel_interp_desc(devinfo, mode, inst->pi_noperspective,
|
||||||
|
wm_prog_data->per_coarse_pixel_dispatch,
|
||||||
|
inst->exec_size, inst->group);
|
||||||
|
|
||||||
|
assert(bld.shader->devinfo->ver >= 7);
|
||||||
|
inst->opcode = SHADER_OPCODE_SEND;
|
||||||
|
inst->sfid = GFX7_SFID_PIXEL_INTERPOLATOR;
|
||||||
|
inst->desc = desc_imm;
|
||||||
|
inst->ex_desc = 0;
|
||||||
|
inst->mlen = mlen;
|
||||||
|
inst->ex_mlen = 0;
|
||||||
|
inst->send_has_side_effects = false;
|
||||||
|
inst->send_is_volatile = false;
|
||||||
|
|
||||||
|
inst->resize_sources(3);
|
||||||
|
inst->src[0] = desc;
|
||||||
|
inst->src[1] = brw_imm_ud(0); /* ex_desc */
|
||||||
|
inst->src[2] = payload;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
lower_btd_logical_send(const fs_builder &bld, fs_inst *inst)
|
lower_btd_logical_send(const fs_builder &bld, fs_inst *inst)
|
||||||
{
|
{
|
||||||
@@ -2749,6 +2804,13 @@ fs_visitor::lower_logical_sends()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case FS_OPCODE_INTERPOLATE_AT_SAMPLE:
|
||||||
|
case FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET:
|
||||||
|
case FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET:
|
||||||
|
lower_interpolator_logical_send(ibld, inst,
|
||||||
|
brw_wm_prog_data(prog_data));
|
||||||
|
break;
|
||||||
|
|
||||||
case SHADER_OPCODE_BTD_SPAWN_LOGICAL:
|
case SHADER_OPCODE_BTD_SPAWN_LOGICAL:
|
||||||
case SHADER_OPCODE_BTD_RETIRE_LOGICAL:
|
case SHADER_OPCODE_BTD_RETIRE_LOGICAL:
|
||||||
lower_btd_logical_send(ibld, inst);
|
lower_btd_logical_send(ibld, inst);
|
||||||
|
@@ -532,6 +532,10 @@ schedule_node::set_latency_gfx7(bool is_haswell)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GFX7_SFID_PIXEL_INTERPOLATOR:
|
||||||
|
latency = 50; /* TODO */
|
||||||
|
break;
|
||||||
|
|
||||||
case GFX12_SFID_UGM:
|
case GFX12_SFID_UGM:
|
||||||
case GFX12_SFID_TGM:
|
case GFX12_SFID_TGM:
|
||||||
case GFX12_SFID_SLM:
|
case GFX12_SFID_SLM:
|
||||||
|
Reference in New Issue
Block a user