radv/rt: Use traversal vars for object origin/direction in ahit/isec

We already did the work of transforming the ray data, no need to do it
multiple times.

Should theoretically be a lot better. However, none of the fossils
appear to use object-space ray data in anyhit/intersection shaders. :(

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38809>
This commit is contained in:
Natalie Vock
2025-12-04 09:54:41 +01:00
committed by Marge Bot
parent a488203e85
commit f692ac76ca

View File

@@ -225,6 +225,13 @@ lower_ahit_isec_intrinsics(nir_builder *b, nir_intrinsic_instr *intr, void *_par
nir_def *ret = NULL;
switch (intr->intrinsic) {
/* When any-hit shaders are invoked, the traversal ray origin/direction is in object space */
case nir_intrinsic_load_ray_object_origin:
ret = nir_load_var(b, params->trav_vars->origin);
break;
case nir_intrinsic_load_ray_object_direction:
ret = nir_load_var(b, params->trav_vars->dir);
break;
case nir_intrinsic_load_ray_world_origin:
ret = nir_load_var(b, params->anyhit_vars->origin);
break;
@@ -287,18 +294,6 @@ lower_ahit_isec_intrinsics(nir_builder *b, nir_intrinsic_instr *intr, void *_par
nir_channel(b, otw_matrix[2], c));
break;
}
case nir_intrinsic_load_ray_object_origin: {
nir_def *wto_matrix[3];
radv_load_wto_matrix(params->device, b, nir_load_var(b, params->trav_vars->instance_addr), wto_matrix);
ret = nir_build_vec3_mat_mult(b, nir_load_var(b, params->anyhit_vars->origin), wto_matrix, true);
break;
}
case nir_intrinsic_load_ray_object_direction: {
nir_def *wto_matrix[3];
radv_load_wto_matrix(params->device, b, nir_load_var(b, params->trav_vars->instance_addr), wto_matrix);
ret = nir_build_vec3_mat_mult(b, nir_load_var(b, params->anyhit_vars->dir), wto_matrix, false);
break;
}
case nir_intrinsic_ignore_ray_intersection: {
nir_store_var(b, params->anyhit_vars->ahit_accept, nir_imm_false(b), 0x1);