From 5cdcc22736244162af55397fa7d4a248684c5683 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Fri, 2 Dec 2022 13:05:34 +0200 Subject: [PATCH] intel/nir/rt: wire position fetch intrinsic Signed-off-by: Lionel Landwerlin Reviewed-by: Caio Oliveira Part-of: --- src/intel/compiler/brw_nir_lower_ray_queries.c | 7 +++++++ src/intel/compiler/brw_nir_lower_rt_intrinsics.c | 7 +++++++ src/intel/compiler/brw_nir_rt_builder.h | 15 +++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/src/intel/compiler/brw_nir_lower_ray_queries.c b/src/intel/compiler/brw_nir_lower_ray_queries.c index 30d30de0645..931de1d012a 100644 --- a/src/intel/compiler/brw_nir_lower_ray_queries.c +++ b/src/intel/compiler/brw_nir_lower_ray_queries.c @@ -471,6 +471,13 @@ lower_ray_query_intrinsic(nir_builder *b, sysval = world_ray_in.orig; break; + case nir_ray_query_value_intersection_triangle_vertex_positions: { + struct brw_nir_rt_bvh_primitive_leaf_positions_defs pos; + brw_nir_rt_load_bvh_primitive_leaf_positions(b, &pos, hit_in.prim_leaf_ptr); + sysval = pos.positions[nir_intrinsic_column(intrin)]; + break; + } + default: unreachable("Invalid ray query"); } diff --git a/src/intel/compiler/brw_nir_lower_rt_intrinsics.c b/src/intel/compiler/brw_nir_lower_rt_intrinsics.c index 02fc16df19f..9235033df7a 100644 --- a/src/intel/compiler/brw_nir_lower_rt_intrinsics.c +++ b/src/intel/compiler/brw_nir_lower_rt_intrinsics.c @@ -314,6 +314,13 @@ lower_rt_intrinsics_impl(nir_function_impl *impl, sysval = build_leaf_is_procedural(b, &hit_in); break; + case nir_intrinsic_load_ray_triangle_vertex_positions: { + struct brw_nir_rt_bvh_primitive_leaf_positions_defs pos; + brw_nir_rt_load_bvh_primitive_leaf_positions(b, &pos, hit_in.prim_leaf_ptr); + sysval = pos.positions[nir_intrinsic_column(intrin)]; + break; + } + case nir_intrinsic_load_leaf_opaque_intel: { if (stage == MESA_SHADER_INTERSECTION) { /* In intersection shaders, the opaque bit is passed to us in diff --git a/src/intel/compiler/brw_nir_rt_builder.h b/src/intel/compiler/brw_nir_rt_builder.h index 0658496d783..fa685b859e9 100644 --- a/src/intel/compiler/brw_nir_rt_builder.h +++ b/src/intel/compiler/brw_nir_rt_builder.h @@ -904,6 +904,21 @@ brw_nir_rt_load_bvh_primitive_leaf(nir_builder *b, nir_imm_int(b, 31), nir_imm_int(b, 30)); } +struct brw_nir_rt_bvh_primitive_leaf_positions_defs { + nir_ssa_def *positions[3]; +}; + +static inline void +brw_nir_rt_load_bvh_primitive_leaf_positions(nir_builder *b, + struct brw_nir_rt_bvh_primitive_leaf_positions_defs *defs, + nir_ssa_def *leaf_addr) +{ + for (unsigned i = 0; i < ARRAY_SIZE(defs->positions); i++) { + defs->positions[i] = + brw_nir_rt_load(b, nir_iadd_imm(b, leaf_addr, 16 + i * 4 * 3), 4, 3, 32); + } +} + static inline nir_ssa_def * brw_nir_rt_load_primitive_id_from_hit(nir_builder *b, nir_ssa_def *is_procedural,