From dd9bf86725bac3123902d6a85643e6ca567eff56 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marcin=20=C5=9Alusarz?= Date: Mon, 30 Jan 2023 17:09:26 +0100 Subject: [PATCH] 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 Part-of: --- src/intel/compiler/brw_fs.h | 3 ++- src/intel/compiler/brw_mesh.cpp | 11 ++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/intel/compiler/brw_fs.h b/src/intel/compiler/brw_fs.h index 454b587..9bf4c3a 100644 --- a/src/intel/compiler/brw_fs.h +++ b/src/intel/compiler/brw_fs.h @@ -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(); diff --git a/src/intel/compiler/brw_mesh.cpp b/src/intel/compiler/brw_mesh.cpp index f5740b0..a854c94 100644 --- a/src/intel/compiler/brw_mesh.cpp +++ b/src/intel/compiler/brw_mesh.cpp @@ -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: -- 2.7.4