intel/compiler/mesh: use slice id of task urb handles in mesh shaders

When mesh shader is spawned on a different slice than the originating
task shader, then input task urb handle can come from a different
slice, so masking this information off will load data from the current
slice, instead of the one where real data are.

Reviewed-by: Caio Oliveira <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21007>
This commit is contained in:
Marcin Ślusarz
2023-01-30 17:09:26 +01:00
committed by Marge Bot
parent 9ddd296cd3
commit dd9bf86725
2 changed files with 8 additions and 6 deletions

View File

@@ -412,7 +412,8 @@ public:
const fs_reg &urb_handle); const fs_reg &urb_handle);
void emit_task_mesh_load(const brw::fs_builder &bld, void emit_task_mesh_load(const brw::fs_builder &bld,
nir_intrinsic_instr *instr, nir_intrinsic_instr *instr,
const fs_reg &urb_handle); const fs_reg &urb_handle,
bool mask);
void emit_barrier(); void emit_barrier();
void emit_tcs_barrier(); void emit_tcs_barrier();

View File

@@ -1452,7 +1452,7 @@ fs_visitor::emit_task_mesh_store(const fs_builder &bld, nir_intrinsic_instr *ins
void void
fs_visitor::emit_task_mesh_load(const fs_builder &bld, nir_intrinsic_instr *instr, fs_visitor::emit_task_mesh_load(const fs_builder &bld, nir_intrinsic_instr *instr,
const fs_reg &urb_handle) const fs_reg &urb_handle, bool mask)
{ {
fs_reg dest = get_nir_dest(instr->dest); fs_reg dest = get_nir_dest(instr->dest);
nir_src *offset_nir_src = nir_get_io_offset_src(instr); nir_src *offset_nir_src = nir_get_io_offset_src(instr);
@@ -1460,6 +1460,7 @@ fs_visitor::emit_task_mesh_load(const fs_builder &bld, nir_intrinsic_instr *inst
fs_builder ubld8 = bld.group(8, 0).exec_all(); fs_builder ubld8 = bld.group(8, 0).exec_all();
fs_reg h = ubld8.vgrf(BRW_REGISTER_TYPE_UD, 1); fs_reg h = ubld8.vgrf(BRW_REGISTER_TYPE_UD, 1);
ubld8.MOV(h, urb_handle); ubld8.MOV(h, urb_handle);
if (mask)
ubld8.AND(h, h, brw_imm_ud(0xFFFF)); ubld8.AND(h, h, brw_imm_ud(0xFFFF));
/* TODO(mesh): for per_vertex and per_primitive, if we could keep around /* TODO(mesh): for per_vertex and per_primitive, if we could keep around
@@ -1488,7 +1489,7 @@ fs_visitor::nir_emit_task_intrinsic(const fs_builder &bld,
case nir_intrinsic_load_output: case nir_intrinsic_load_output:
case nir_intrinsic_load_task_payload: case nir_intrinsic_load_task_payload:
emit_task_mesh_load(bld, instr, payload.urb_output); emit_task_mesh_load(bld, instr, payload.urb_output, true);
break; break;
default: default:
@@ -1514,11 +1515,11 @@ fs_visitor::nir_emit_mesh_intrinsic(const fs_builder &bld,
case nir_intrinsic_load_per_vertex_output: case nir_intrinsic_load_per_vertex_output:
case nir_intrinsic_load_per_primitive_output: case nir_intrinsic_load_per_primitive_output:
case nir_intrinsic_load_output: case nir_intrinsic_load_output:
emit_task_mesh_load(bld, instr, payload.urb_output); emit_task_mesh_load(bld, instr, payload.urb_output, true);
break; break;
case nir_intrinsic_load_task_payload: case nir_intrinsic_load_task_payload:
emit_task_mesh_load(bld, instr, payload.task_urb_input); emit_task_mesh_load(bld, instr, payload.task_urb_input, false);
break; break;
default: default: