Module: Mesa Branch: main Commit: 1bc865ca8af1282a1a734686ef6ee469976e723c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1bc865ca8af1282a1a734686ef6ee469976e723c
Author: Faith Ekstrand <[email protected]> Date: Fri Nov 17 17:26:11 2023 -0600 nak: Implement quad ops Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26264> --- src/nouveau/compiler/nak_from_nir.rs | 39 ++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/nouveau/compiler/nak_from_nir.rs b/src/nouveau/compiler/nak_from_nir.rs index 9e877fae5de..436ed5c156c 100644 --- a/src/nouveau/compiler/nak_from_nir.rs +++ b/src/nouveau/compiler/nak_from_nir.rs @@ -1848,7 +1848,8 @@ impl<'a> ShaderFromNir<'a> { }); } } - nir_intrinsic_read_invocation + nir_intrinsic_quad_broadcast + | nir_intrinsic_read_invocation | nir_intrinsic_shuffle | nir_intrinsic_shuffle_down | nir_intrinsic_shuffle_up @@ -1868,19 +1869,41 @@ impl<'a> ShaderFromNir<'a> { in_bounds: Dst::None, src: data, lane: idx, - c: if intrin.intrinsic == nir_intrinsic_shuffle_up { - 0.into() - } else { - 0x1f.into() + c: match intrin.intrinsic { + nir_intrinsic_quad_broadcast => 0x1c_03.into(), + nir_intrinsic_shuffle_up => 0.into(), + _ => 0x1f.into(), }, op: match intrin.intrinsic { - nir_intrinsic_read_invocation - | nir_intrinsic_shuffle => ShflOp::Idx, nir_intrinsic_shuffle_down => ShflOp::Down, nir_intrinsic_shuffle_up => ShflOp::Up, nir_intrinsic_shuffle_xor => ShflOp::Bfly, - op => panic!("Unknown shuffle intrinsic {}", op), + _ => ShflOp::Idx, + }, + }); + self.set_dst(&intrin.def, dst); + } + nir_intrinsic_quad_swap_horizontal + | nir_intrinsic_quad_swap_vertical + | nir_intrinsic_quad_swap_diagonal => { + assert!(srcs[0].bit_size() == 32); + assert!(srcs[0].num_components() == 1); + let data = self.get_src(&srcs[0]); + + assert!(intrin.def.bit_size() == 32); + let dst = b.alloc_ssa(RegFile::GPR, 1); + b.push_op(OpShfl { + dst: dst.into(), + in_bounds: Dst::None, + src: data, + lane: match intrin.intrinsic { + nir_intrinsic_quad_swap_horizontal => 1_u32.into(), + nir_intrinsic_quad_swap_vertical => 2_u32.into(), + nir_intrinsic_quad_swap_diagonal => 3_u32.into(), + op => panic!("Unknown quad intrinsic {}", op), }, + c: 0x1c_03.into(), + op: ShflOp::Bfly, }); self.set_dst(&intrin.def, dst); }
