radv/rt: Use traversal vars for object origin/direction in ahit/isec
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

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; nir_def *ret = NULL;
switch (intr->intrinsic) { 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: case nir_intrinsic_load_ray_world_origin:
ret = nir_load_var(b, params->anyhit_vars->origin); ret = nir_load_var(b, params->anyhit_vars->origin);
break; 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)); nir_channel(b, otw_matrix[2], c));
break; 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: { case nir_intrinsic_ignore_ray_intersection: {
nir_store_var(b, params->anyhit_vars->ahit_accept, nir_imm_false(b), 0x1); nir_store_var(b, params->anyhit_vars->ahit_accept, nir_imm_false(b), 0x1);