From f692ac76ca82fde74d181edaaa2f0e7c3b9e4e9d Mon Sep 17 00:00:00 2001 From: Natalie Vock Date: Thu, 4 Dec 2025 09:54:41 +0100 Subject: [PATCH] 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: --- .../vulkan/nir/radv_nir_rt_traversal_shader.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/amd/vulkan/nir/radv_nir_rt_traversal_shader.c b/src/amd/vulkan/nir/radv_nir_rt_traversal_shader.c index d88cb81a1dd..a0378ecc174 100644 --- a/src/amd/vulkan/nir/radv_nir_rt_traversal_shader.c +++ b/src/amd/vulkan/nir/radv_nir_rt_traversal_shader.c @@ -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);