From f0ae58df12a1ab5643887893fd59e3a67aacf6b8 Mon Sep 17 00:00:00 2001 From: Sagar Ghuge Date: Thu, 2 Apr 2026 17:34:08 -0700 Subject: [PATCH] intel/compiler: Handle TerminateOnFirstHit in ray query execution Once commited and have AABB or triangle intersection found, terminate the traversal if TerminateOnFirstHit ray flag is present. Signed-off-by: Sagar Ghuge Reviewed-by: Ivan Briano Part-of: --- .../compiler/brw/brw_nir_lower_ray_queries.c | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/intel/compiler/brw/brw_nir_lower_ray_queries.c b/src/intel/compiler/brw/brw_nir_lower_ray_queries.c index 7be86c31e1e..129576fa241 100644 --- a/src/intel/compiler/brw/brw_nir_lower_ray_queries.c +++ b/src/intel/compiler/brw/brw_nir_lower_ray_queries.c @@ -211,6 +211,24 @@ spill_query(nir_builder *b, } +static void +handle_terminate_on_first_hit(nir_builder *b, nir_def *stack_addr, + struct lowering_state *state) +{ + struct brw_nir_rt_mem_ray_defs world_ray_in = {}; + brw_nir_rt_load_mem_ray_from_addr(b, &world_ray_in, stack_addr, + BRW_RT_BVH_LEVEL_WORLD, + state->devinfo); + nir_def *terminate = + nir_test_mask(b, nir_u2u32(b, world_ray_in.ray_flags), + BRW_RT_RAY_FLAG_TERMINATE_ON_FIRST_HIT); + nir_push_if(b, terminate); + { + brw_nir_rt_query_mark_done(b, stack_addr); + } + nir_pop_if(b, NULL); +} + static void lower_ray_query_intrinsic(nir_builder *b, nir_intrinsic_instr *intrin, @@ -337,6 +355,7 @@ lower_ray_query_intrinsic(nir_builder *b, NULL, NULL, nir_imm_int(b, GEN_RT_TRACE_RAY_COMMIT), nir_imm_int(b, BRW_RT_BVH_LEVEL_OBJECT)); + handle_terminate_on_first_hit(b, stack_addr, state); break; } @@ -346,6 +365,7 @@ lower_ray_query_intrinsic(nir_builder *b, NULL, NULL, nir_imm_int(b, GEN_RT_TRACE_RAY_COMMIT), nir_imm_int(b, BRW_RT_BVH_LEVEL_OBJECT)); + handle_terminate_on_first_hit(b, stack_addr, state); break; }