intel/fs: Lower uniform pull constant load message to LSC dataport
Reviewed-by: Sagar Ghuge <sagar.ghuge@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11600>
This commit is contained in:

committed by
Marge Bot

parent
6362059b6b
commit
f5876dfdb9
@@ -3856,14 +3856,64 @@ fs_visitor::lower_uniform_pull_constant_loads()
|
|||||||
if (inst->opcode != FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD)
|
if (inst->opcode != FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (devinfo->ver >= 7) {
|
const fs_reg& surface = inst->src[0];
|
||||||
|
const fs_reg& offset_B = inst->src[1];
|
||||||
|
assert(offset_B.file == IMM);
|
||||||
|
|
||||||
|
if (devinfo->has_lsc) {
|
||||||
|
const fs_builder ubld =
|
||||||
|
fs_builder(this, block, inst).group(8, 0).exec_all();
|
||||||
|
|
||||||
|
const fs_reg payload = ubld.vgrf(BRW_REGISTER_TYPE_UD);
|
||||||
|
ubld.MOV(payload, offset_B);
|
||||||
|
|
||||||
|
inst->sfid = GFX12_SFID_UGM;
|
||||||
|
inst->desc = lsc_msg_desc(devinfo, LSC_OP_LOAD,
|
||||||
|
1 /* simd_size */,
|
||||||
|
LSC_ADDR_SURFTYPE_BTI,
|
||||||
|
LSC_ADDR_SIZE_A32,
|
||||||
|
1 /* num_coordinates */,
|
||||||
|
LSC_DATA_SIZE_D32,
|
||||||
|
inst->size_written / 4,
|
||||||
|
true /* transpose */,
|
||||||
|
LSC_CACHE_LOAD_L1STATE_L3MOCS,
|
||||||
|
true /* has_dest */);
|
||||||
|
|
||||||
|
fs_reg ex_desc;
|
||||||
|
if (surface.file == IMM) {
|
||||||
|
ex_desc = brw_imm_ud(lsc_bti_ex_desc(devinfo, surface.ud));
|
||||||
|
} else {
|
||||||
|
/* We only need the first component for the payload so we can use
|
||||||
|
* one of the other components for the extended descriptor
|
||||||
|
*/
|
||||||
|
ex_desc = component(payload, 1);
|
||||||
|
ubld.group(1, 0).SHL(ex_desc, surface, brw_imm_ud(24));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update the original instruction. */
|
||||||
|
inst->opcode = SHADER_OPCODE_SEND;
|
||||||
|
inst->mlen = lsc_msg_desc_src0_len(devinfo, inst->desc);
|
||||||
|
inst->ex_mlen = 0;
|
||||||
|
inst->header_size = 0;
|
||||||
|
inst->send_has_side_effects = false;
|
||||||
|
inst->send_is_volatile = true;
|
||||||
|
inst->exec_size = 1;
|
||||||
|
|
||||||
|
/* Finally, the payload */
|
||||||
|
inst->resize_sources(3);
|
||||||
|
inst->src[0] = brw_imm_ud(0); /* desc */
|
||||||
|
inst->src[1] = ex_desc;
|
||||||
|
inst->src[2] = payload;
|
||||||
|
|
||||||
|
invalidate_analysis(DEPENDENCY_INSTRUCTIONS | DEPENDENCY_VARIABLES);
|
||||||
|
} else if (devinfo->ver >= 7) {
|
||||||
const fs_builder ubld = fs_builder(this, block, inst).exec_all();
|
const fs_builder ubld = fs_builder(this, block, inst).exec_all();
|
||||||
const fs_reg payload = ubld.group(8, 0).vgrf(BRW_REGISTER_TYPE_UD);
|
const fs_reg payload = ubld.group(8, 0).vgrf(BRW_REGISTER_TYPE_UD);
|
||||||
|
|
||||||
ubld.group(8, 0).MOV(payload,
|
ubld.group(8, 0).MOV(payload,
|
||||||
retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD));
|
retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UD));
|
||||||
ubld.group(1, 0).MOV(component(payload, 2),
|
ubld.group(1, 0).MOV(component(payload, 2),
|
||||||
brw_imm_ud(inst->src[1].ud / 16));
|
brw_imm_ud(offset_B.ud / 16));
|
||||||
|
|
||||||
inst->opcode = FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD_GFX7;
|
inst->opcode = FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD_GFX7;
|
||||||
inst->src[1] = payload;
|
inst->src[1] = payload;
|
||||||
|
Reference in New Issue
Block a user