From 8815845271fbc80343c2188627fb2b0c61405302 Mon Sep 17 00:00:00 2001 From: Natalie Vock Date: Thu, 17 Apr 2025 19:46:50 +0200 Subject: [PATCH] radv/rt/gfx12: Always overwrite origin/dir They're unchanged if we don't test against instance nodes. This makes image_bvh8_intersect_ray kill its direction/origin operands, improving RA. Part-of: --- src/amd/vulkan/nir/radv_nir_rt_common.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/amd/vulkan/nir/radv_nir_rt_common.c b/src/amd/vulkan/nir/radv_nir_rt_common.c index c8555f53d8b..c8dbdf3b923 100644 --- a/src/amd/vulkan/nir/radv_nir_rt_common.c +++ b/src/amd/vulkan/nir/radv_nir_rt_common.c @@ -1041,6 +1041,8 @@ radv_build_ray_traversal_gfx12(struct radv_device *device, nir_builder *b, const nir_bvh8_intersect_ray_amd(b, 32, desc, nir_unpack_64_2x32(b, nir_load_deref(b, args->vars.bvh_base)), nir_ishr_imm(b, args->cull_mask, 24), nir_load_deref(b, args->vars.tmax), nir_load_deref(b, args->vars.origin), nir_load_deref(b, args->vars.dir), bvh_node); + nir_store_deref(b, args->vars.origin, nir_channels(b, result, 0x7 << 10), 0x7); + nir_store_deref(b, args->vars.dir, nir_channels(b, result, 0x7 << 13), 0x7); nir_push_if(b, nir_test_mask(b, bvh_node, BITFIELD64_BIT(ffs(radv_bvh_node_box16) - 1))); { @@ -1054,6 +1056,8 @@ radv_build_ray_traversal_gfx12(struct radv_device *device, nir_builder *b, const nir_def *next_node = nir_iand_imm(b, nir_channel(b, result, 7), 0xff); nir_push_if(b, nir_ieq_imm(b, next_node, 0xff)); + nir_store_deref(b, args->vars.origin, args->origin, 7); + nir_store_deref(b, args->vars.dir, args->dir, 7); nir_jump(b, nir_jump_continue); nir_pop_if(b, NULL); @@ -1063,9 +1067,6 @@ radv_build_ray_traversal_gfx12(struct radv_device *device, nir_builder *b, const nir_store_deref(b, args->vars.sbt_offset_and_flags, nir_channel(b, result, 6), 1); - nir_store_deref(b, args->vars.origin, nir_channels(b, result, 0x7 << 10), 0x7); - nir_store_deref(b, args->vars.dir, nir_channels(b, result, 0x7 << 13), 0x7); - nir_store_deref(b, args->vars.top_stack, nir_load_deref(b, args->vars.stack), 1); nir_store_deref(b, args->vars.bvh_base, nir_pack_64_2x32(b, nir_channels(b, result, 0x3 << 2)), 1);