From 36433e932b67034fa2283ec730a19f1c05ceada7 Mon Sep 17 00:00:00 2001 From: Sagar Ghuge Date: Sun, 29 Dec 2024 21:41:25 -0800 Subject: [PATCH] intel/rt: Update BVH instance leaf load for Xe3+ Signed-off-by: Sagar Ghuge Reviewed-by: Kevin Chuang Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/compiler/brw_nir_lower_ray_queries.c | 15 ++++++++++----- .../compiler/brw_nir_lower_rt_intrinsics.c | 14 ++++++++------ src/intel/compiler/brw_nir_rt_builder.h | 18 +++++++++++++----- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/intel/compiler/brw_nir_lower_ray_queries.c b/src/intel/compiler/brw_nir_lower_ray_queries.c index 8afab6a9a15..a45100d59b9 100644 --- a/src/intel/compiler/brw_nir_lower_ray_queries.c +++ b/src/intel/compiler/brw_nir_lower_ray_queries.c @@ -403,21 +403,24 @@ lower_ray_query_intrinsic(nir_builder *b, case nir_ray_query_value_intersection_instance_custom_index: { struct brw_nir_rt_bvh_instance_leaf_defs leaf; - brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr); + brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr, + state->devinfo); sysval = leaf.instance_id; break; } case nir_ray_query_value_intersection_instance_id: { struct brw_nir_rt_bvh_instance_leaf_defs leaf; - brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr); + brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr, + state->devinfo); sysval = leaf.instance_index; break; } case nir_ray_query_value_intersection_instance_sbt_index: { struct brw_nir_rt_bvh_instance_leaf_defs leaf; - brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr); + brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr, + state->devinfo); sysval = leaf.contribution_to_hit_group_index; break; } @@ -453,14 +456,16 @@ lower_ray_query_intrinsic(nir_builder *b, case nir_ray_query_value_intersection_object_to_world: { struct brw_nir_rt_bvh_instance_leaf_defs leaf; - brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr); + brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr, + state->devinfo); sysval = leaf.object_to_world[nir_intrinsic_column(intrin)]; break; } case nir_ray_query_value_intersection_world_to_object: { struct brw_nir_rt_bvh_instance_leaf_defs leaf; - brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr); + brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr, + state->devinfo); sysval = leaf.world_to_object[nir_intrinsic_column(intrin)]; break; } diff --git a/src/intel/compiler/brw_nir_lower_rt_intrinsics.c b/src/intel/compiler/brw_nir_lower_rt_intrinsics.c index 30838c1d477..b6c25867dc4 100644 --- a/src/intel/compiler/brw_nir_lower_rt_intrinsics.c +++ b/src/intel/compiler/brw_nir_lower_rt_intrinsics.c @@ -190,7 +190,8 @@ lower_rt_intrinsics_impl(nir_function_impl *impl, case nir_intrinsic_load_ray_object_origin: if (stage == MESA_SHADER_CLOSEST_HIT) { struct brw_nir_rt_bvh_instance_leaf_defs leaf; - brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr); + brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr, + devinfo); sysval = nir_build_vec3_mat_mult_col_major( b, world_ray_in.orig, leaf.world_to_object, true); @@ -202,7 +203,8 @@ lower_rt_intrinsics_impl(nir_function_impl *impl, case nir_intrinsic_load_ray_object_direction: if (stage == MESA_SHADER_CLOSEST_HIT) { struct brw_nir_rt_bvh_instance_leaf_defs leaf; - brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr); + brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr, + devinfo); sysval = nir_build_vec3_mat_mult_col_major( b, world_ray_in.dir, leaf.world_to_object, false); @@ -231,21 +233,21 @@ lower_rt_intrinsics_impl(nir_function_impl *impl, case nir_intrinsic_load_instance_id: { struct brw_nir_rt_bvh_instance_leaf_defs leaf; - brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr); + brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr, devinfo); sysval = leaf.instance_index; break; } case nir_intrinsic_load_ray_object_to_world: { struct brw_nir_rt_bvh_instance_leaf_defs leaf; - brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr); + brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr, devinfo); sysval = leaf.object_to_world[nir_intrinsic_column(intrin)]; break; } case nir_intrinsic_load_ray_world_to_object: { struct brw_nir_rt_bvh_instance_leaf_defs leaf; - brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr); + brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr, devinfo); sysval = leaf.world_to_object[nir_intrinsic_column(intrin)]; break; } @@ -286,7 +288,7 @@ lower_rt_intrinsics_impl(nir_function_impl *impl, case nir_intrinsic_load_ray_instance_custom_index: { struct brw_nir_rt_bvh_instance_leaf_defs leaf; - brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr); + brw_nir_rt_load_bvh_instance_leaf(b, &leaf, hit_in.inst_leaf_ptr, devinfo); sysval = leaf.instance_id; break; } diff --git a/src/intel/compiler/brw_nir_rt_builder.h b/src/intel/compiler/brw_nir_rt_builder.h index caec83a815b..1ff103ec757 100644 --- a/src/intel/compiler/brw_nir_rt_builder.h +++ b/src/intel/compiler/brw_nir_rt_builder.h @@ -1068,14 +1068,22 @@ struct brw_nir_rt_bvh_instance_leaf_defs { static inline void brw_nir_rt_load_bvh_instance_leaf(nir_builder *b, struct brw_nir_rt_bvh_instance_leaf_defs *defs, - nir_def *leaf_addr) + nir_def *leaf_addr, + const struct intel_device_info *devinfo) { nir_def *leaf_desc = brw_nir_rt_load(b, leaf_addr, 4, 2, 32); - defs->shader_index = - nir_iand_imm(b, nir_channel(b, leaf_desc, 0), (1 << 24) - 1); - defs->contribution_to_hit_group_index = - nir_iand_imm(b, nir_channel(b, leaf_desc, 1), (1 << 24) - 1); + if (devinfo->ver >= 30) { + /* Not used for Xe3+, just putting 0 for consistency */ + defs->shader_index = nir_imm_int(b, 0); + defs->contribution_to_hit_group_index = + nir_iand_imm(b, nir_channel(b, leaf_desc, 0), (1 << 24) - 1); + } else { + defs->shader_index = + nir_iand_imm(b, nir_channel(b, leaf_desc, 0), (1 << 24) - 1); + defs->contribution_to_hit_group_index = + nir_iand_imm(b, nir_channel(b, leaf_desc, 1), (1 << 24) - 1); + } defs->world_to_object[0] = brw_nir_rt_load(b, nir_iadd_imm(b, leaf_addr, 16), 4, 3, 32);