intel/rt: Update BVH instance leaf load for Xe3+

Signed-off-by: Sagar Ghuge <sagar.ghuge@intel.com>
Reviewed-by: Kevin Chuang <kaiwenjon23@gmail.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33047>
This commit is contained in:
Sagar Ghuge 2024-12-29 21:41:25 -08:00 committed by Marge Bot
parent 5cd0f4ba2f
commit 36433e932b
3 changed files with 31 additions and 16 deletions

View file

@ -403,21 +403,24 @@ lower_ray_query_intrinsic(nir_builder *b,
case nir_ray_query_value_intersection_instance_custom_index: { case nir_ray_query_value_intersection_instance_custom_index: {
struct brw_nir_rt_bvh_instance_leaf_defs leaf; 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; sysval = leaf.instance_id;
break; break;
} }
case nir_ray_query_value_intersection_instance_id: { case nir_ray_query_value_intersection_instance_id: {
struct brw_nir_rt_bvh_instance_leaf_defs leaf; 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; sysval = leaf.instance_index;
break; break;
} }
case nir_ray_query_value_intersection_instance_sbt_index: { case nir_ray_query_value_intersection_instance_sbt_index: {
struct brw_nir_rt_bvh_instance_leaf_defs leaf; 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; sysval = leaf.contribution_to_hit_group_index;
break; break;
} }
@ -453,14 +456,16 @@ lower_ray_query_intrinsic(nir_builder *b,
case nir_ray_query_value_intersection_object_to_world: { case nir_ray_query_value_intersection_object_to_world: {
struct brw_nir_rt_bvh_instance_leaf_defs leaf; 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)]; sysval = leaf.object_to_world[nir_intrinsic_column(intrin)];
break; break;
} }
case nir_ray_query_value_intersection_world_to_object: { case nir_ray_query_value_intersection_world_to_object: {
struct brw_nir_rt_bvh_instance_leaf_defs leaf; 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)]; sysval = leaf.world_to_object[nir_intrinsic_column(intrin)];
break; break;
} }

View file

@ -190,7 +190,8 @@ lower_rt_intrinsics_impl(nir_function_impl *impl,
case nir_intrinsic_load_ray_object_origin: case nir_intrinsic_load_ray_object_origin:
if (stage == MESA_SHADER_CLOSEST_HIT) { if (stage == MESA_SHADER_CLOSEST_HIT) {
struct brw_nir_rt_bvh_instance_leaf_defs leaf; 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( sysval = nir_build_vec3_mat_mult_col_major(
b, world_ray_in.orig, leaf.world_to_object, true); 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: case nir_intrinsic_load_ray_object_direction:
if (stage == MESA_SHADER_CLOSEST_HIT) { if (stage == MESA_SHADER_CLOSEST_HIT) {
struct brw_nir_rt_bvh_instance_leaf_defs leaf; 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( sysval = nir_build_vec3_mat_mult_col_major(
b, world_ray_in.dir, leaf.world_to_object, false); 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: { case nir_intrinsic_load_instance_id: {
struct brw_nir_rt_bvh_instance_leaf_defs leaf; 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; sysval = leaf.instance_index;
break; break;
} }
case nir_intrinsic_load_ray_object_to_world: { case nir_intrinsic_load_ray_object_to_world: {
struct brw_nir_rt_bvh_instance_leaf_defs leaf; 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)]; sysval = leaf.object_to_world[nir_intrinsic_column(intrin)];
break; break;
} }
case nir_intrinsic_load_ray_world_to_object: { case nir_intrinsic_load_ray_world_to_object: {
struct brw_nir_rt_bvh_instance_leaf_defs leaf; 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)]; sysval = leaf.world_to_object[nir_intrinsic_column(intrin)];
break; break;
} }
@ -286,7 +288,7 @@ lower_rt_intrinsics_impl(nir_function_impl *impl,
case nir_intrinsic_load_ray_instance_custom_index: { case nir_intrinsic_load_ray_instance_custom_index: {
struct brw_nir_rt_bvh_instance_leaf_defs leaf; 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; sysval = leaf.instance_id;
break; break;
} }

View file

@ -1068,14 +1068,22 @@ struct brw_nir_rt_bvh_instance_leaf_defs {
static inline void static inline void
brw_nir_rt_load_bvh_instance_leaf(nir_builder *b, brw_nir_rt_load_bvh_instance_leaf(nir_builder *b,
struct brw_nir_rt_bvh_instance_leaf_defs *defs, 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); nir_def *leaf_desc = brw_nir_rt_load(b, leaf_addr, 4, 2, 32);
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 = defs->shader_index =
nir_iand_imm(b, nir_channel(b, leaf_desc, 0), (1 << 24) - 1); nir_iand_imm(b, nir_channel(b, leaf_desc, 0), (1 << 24) - 1);
defs->contribution_to_hit_group_index = defs->contribution_to_hit_group_index =
nir_iand_imm(b, nir_channel(b, leaf_desc, 1), (1 << 24) - 1); nir_iand_imm(b, nir_channel(b, leaf_desc, 1), (1 << 24) - 1);
}
defs->world_to_object[0] = defs->world_to_object[0] =
brw_nir_rt_load(b, nir_iadd_imm(b, leaf_addr, 16), 4, 3, 32); brw_nir_rt_load(b, nir_iadd_imm(b, leaf_addr, 16), 4, 3, 32);