From 0cf22f9af352f17bcfc87d9e3665af7035a0c17e Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Thu, 11 May 2023 19:00:51 +0200 Subject: [PATCH] nir: Make rq_load committed src an index committed has to be a constant so there is no need to have a src and depend on constant folding to remove the i2b. Reviewed-by: Bas Nieuwenhuizen Acked-by: Lionel Landwerlin Part-of: --- src/amd/vulkan/nir/radv_nir_lower_ray_queries.c | 7 +++---- src/compiler/nir/nir_intrinsics.py | 7 +++++-- src/compiler/spirv/spirv_to_nir.c | 12 +++++++----- src/intel/compiler/brw_nir_lower_ray_queries.c | 2 +- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/amd/vulkan/nir/radv_nir_lower_ray_queries.c b/src/amd/vulkan/nir/radv_nir_lower_ray_queries.c index 3e7fcaef8ef..f4e1e6ff731 100644 --- a/src/amd/vulkan/nir/radv_nir_lower_ray_queries.c +++ b/src/amd/vulkan/nir/radv_nir_lower_ray_queries.c @@ -427,9 +427,8 @@ static nir_ssa_def * lower_rq_load(nir_builder *b, nir_ssa_def *index, nir_intrinsic_instr *instr, struct ray_query_vars *vars) { - assert(nir_src_is_const(instr->src[1])); - bool closest = nir_src_as_bool(instr->src[1]); - struct ray_query_intersection_vars *intersection = closest ? &vars->closest : &vars->candidate; + bool committed = nir_intrinsic_committed(instr); + struct ray_query_intersection_vars *intersection = committed ? &vars->closest : &vars->candidate; uint32_t column = nir_intrinsic_column(instr); @@ -494,7 +493,7 @@ lower_rq_load(nir_builder *b, nir_ssa_def *index, nir_intrinsic_instr *instr, return rq_load_var(b, index, intersection->t); case nir_ray_query_value_intersection_type: { nir_ssa_def *intersection_type = rq_load_var(b, index, intersection->intersection_type); - if (!closest) + if (!committed) intersection_type = nir_iadd_imm(b, intersection_type, -1); return intersection_type; diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 6a222f80106..d0fae15eaab 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -261,6 +261,9 @@ index("struct nir_io_xfb", "io_xfb2") # Ray query values accessible from the RayQueryKHR object index("nir_ray_query_value", "ray_query_value") +# Select between committed and candidate ray queriy intersections +index("bool", "committed") + # Rounding mode for conversions index("nir_rounding_mode", "rounding_mode") @@ -559,8 +562,8 @@ intrinsic("rq_proceed", src_comp=[-1], dest_comp=1) intrinsic("rq_generate_intersection", src_comp=[-1, 1]) # src[] = { query } intrinsic("rq_confirm_intersection", src_comp=[-1]) -# src[] = { query, committed } -intrinsic("rq_load", src_comp=[-1, 1], dest_comp=0, indices=[RAY_QUERY_VALUE,COLUMN]) +# src[] = { query } +intrinsic("rq_load", src_comp=[-1], dest_comp=0, indices=[RAY_QUERY_VALUE,COMMITTED,COLUMN]) # Driver independent raytracing helpers diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 809f75c5000..b2df0b3c3c8 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -5808,7 +5808,7 @@ spirv_to_nir_type_ray_query_intrinsic(struct vtn_builder *b, static void ray_query_load_intrinsic_create(struct vtn_builder *b, SpvOp opcode, const uint32_t *w, nir_ssa_def *src0, - nir_ssa_def *src1) + bool committed) { struct ray_query_value value = spirv_to_nir_type_ray_query_intrinsic(b, opcode); @@ -5823,8 +5823,9 @@ ray_query_load_intrinsic_create(struct vtn_builder *b, SpvOp opcode, nir_build_rq_load(&b->nb, glsl_get_vector_elements(elem_type), glsl_get_bit_size(elem_type), - src0, src1, + src0, .ray_query_value = value.nir_value, + .committed = committed, .column = i); } @@ -5836,8 +5837,9 @@ ray_query_load_intrinsic_create(struct vtn_builder *b, SpvOp opcode, nir_rq_load(&b->nb, glsl_get_vector_elements(value.glsl_type), glsl_get_bit_size(value.glsl_type), - src0, src1, - .ray_query_value = value.nir_value)); + src0, + .ray_query_value = value.nir_value, + .committed = committed)); } } @@ -5892,7 +5894,7 @@ vtn_handle_ray_query_intrinsic(struct vtn_builder *b, SpvOp opcode, case SpvOpRayQueryGetIntersectionTriangleVertexPositionsKHR: ray_query_load_intrinsic_create(b, opcode, w, vtn_ssa_value(b, w[3])->def, - nir_i2b(&b->nb, vtn_ssa_value(b, w[4])->def)); + vtn_constant_uint(b, w[4])); break; case SpvOpRayQueryGetRayTMinKHR: diff --git a/src/intel/compiler/brw_nir_lower_ray_queries.c b/src/intel/compiler/brw_nir_lower_ray_queries.c index 931de1d012a..c18feeb615a 100644 --- a/src/intel/compiler/brw_nir_lower_ray_queries.c +++ b/src/intel/compiler/brw_nir_lower_ray_queries.c @@ -348,7 +348,7 @@ lower_ray_query_intrinsic(nir_builder *b, } case nir_intrinsic_rq_load: { - const bool committed = nir_src_as_bool(intrin->src[1]); + const bool committed = nir_intrinsic_committed(intrin); struct brw_nir_rt_mem_ray_defs world_ray_in = {}; struct brw_nir_rt_mem_ray_defs object_ray_in = {};