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:

committed by
Marge Bot

parent
9ddd296cd3
commit
dd9bf86725
@@ -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();
|
||||||
|
@@ -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:
|
||||||
|
Reference in New Issue
Block a user