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);
void emit_task_mesh_load(const brw::fs_builder &bld,
nir_intrinsic_instr *instr,
const fs_reg &urb_handle);
const fs_reg &urb_handle,
bool mask);
void emit_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
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);
nir_src *offset_nir_src = nir_get_io_offset_src(instr);
@@ -1460,7 +1460,8 @@ fs_visitor::emit_task_mesh_load(const fs_builder &bld, nir_intrinsic_instr *inst
fs_builder ubld8 = bld.group(8, 0).exec_all();
fs_reg h = ubld8.vgrf(BRW_REGISTER_TYPE_UD, 1);
ubld8.MOV(h, urb_handle);
ubld8.AND(h, h, brw_imm_ud(0xFFFF));
if (mask)
ubld8.AND(h, h, brw_imm_ud(0xFFFF));
/* TODO(mesh): for per_vertex and per_primitive, if we could keep around
* the non-array-index offset, we could use to decide if we can perform
@@ -1488,7 +1489,7 @@ fs_visitor::nir_emit_task_intrinsic(const fs_builder &bld,
case nir_intrinsic_load_output:
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;
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_primitive_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;
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;
default: