From deb537de3c856911893405bc7e03ac69b68fe4b5 Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Sat, 18 Mar 2023 12:57:04 +0100 Subject: [PATCH] radv/rt: Handle load_constant instructions when inlining shaders Fixes the following tests: dEQP-VK.ray_query.builtin.rayqueryterminate.ahit.aabbs,Fail dEQP-VK.ray_query.builtin.rayqueryterminate.ahit.triangles,Fail dEQP-VK.ray_query.builtin.rayqueryterminate.call.aabbs,Fail dEQP-VK.ray_query.builtin.rayqueryterminate.call.triangles,Fail dEQP-VK.ray_query.builtin.rayqueryterminate.chit.aabbs,Fail dEQP-VK.ray_query.builtin.rayqueryterminate.chit.triangles,Fail dEQP-VK.ray_query.builtin.rayqueryterminate.miss.aabbs,Fail dEQP-VK.ray_query.builtin.rayqueryterminate.miss.triangles,Fail dEQP-VK.ray_query.builtin.rayqueryterminate.rgen.aabbs,Fail dEQP-VK.ray_query.builtin.rayqueryterminate.rgen.triangles,Fail dEQP-VK.ray_query.builtin.rayqueryterminate.sect.aabbs,Fail dEQP-VK.ray_query.builtin.rayqueryterminate.sect.triangles,Fail Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8647 Fixes: fda262f ("radv/rt: move Ray Tracing shader creation into separate file") Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/amd/vulkan/radv_rt_shader.c | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/amd/vulkan/radv_rt_shader.c b/src/amd/vulkan/radv_rt_shader.c index 03990216fce..8dab68db6d2 100644 --- a/src/amd/vulkan/radv_rt_shader.c +++ b/src/amd/vulkan/radv_rt_shader.c @@ -773,6 +773,48 @@ lower_hit_attribs(nir_shader *shader, nir_variable **hit_attribs, uint32_t workg } } +static void +inline_constants(nir_shader *dst, nir_shader *src) +{ + if (!src->constant_data_size) + return; + + uint32_t align_mul = 1; + if (dst->constant_data_size) { + nir_foreach_block (block, nir_shader_get_entrypoint(src)) { + nir_foreach_instr (instr, block) { + if (instr->type != nir_instr_type_intrinsic) + continue; + + nir_intrinsic_instr *intrinsic = nir_instr_as_intrinsic(instr); + if (intrinsic->intrinsic == nir_intrinsic_load_constant) + align_mul = MAX2(align_mul, nir_intrinsic_align_mul(intrinsic)); + } + } + } + + uint32_t old_constant_data_size = dst->constant_data_size; + uint32_t base_offset = align(dst->constant_data_size, align_mul); + dst->constant_data_size = base_offset + src->constant_data_size; + dst->constant_data = + rerzalloc_size(dst, dst->constant_data, old_constant_data_size, dst->constant_data_size); + memcpy((char *)dst->constant_data + base_offset, src->constant_data, src->constant_data_size); + + if (!base_offset) + return; + + nir_foreach_block (block, nir_shader_get_entrypoint(src)) { + nir_foreach_instr (instr, block) { + if (instr->type != nir_instr_type_intrinsic) + continue; + + nir_intrinsic_instr *intrinsic = nir_instr_as_intrinsic(instr); + if (intrinsic->intrinsic == nir_intrinsic_load_constant) + nir_intrinsic_set_base(intrinsic, base_offset + nir_intrinsic_base(intrinsic)); + } + } +} + static void insert_rt_case(nir_builder *b, nir_shader *shader, struct rt_variables *vars, nir_ssa_def *idx, uint32_t call_idx_base, uint32_t call_idx, unsigned stage_idx, @@ -800,6 +842,8 @@ insert_rt_case(nir_builder *b, nir_shader *shader, struct rt_variables *vars, ni src_vars.stack_size = MAX2(src_vars.stack_size, shader->scratch_size); + inline_constants(b->shader, shader); + nir_push_if(b, nir_ieq_imm(b, idx, call_idx)); nir_inline_function_impl(b, nir_shader_get_entrypoint(shader), NULL, var_remap); nir_pop_if(b, NULL); @@ -1005,6 +1049,9 @@ nir_lower_intersection_shader(nir_shader *intersection, nir_shader *any_hit) if (any_hit) { any_hit = nir_shader_clone(dead_ctx, any_hit); NIR_PASS(_, any_hit, nir_opt_dce); + + inline_constants(intersection, any_hit); + any_hit_impl = lower_any_hit_for_intersection(any_hit); any_hit_var_remap = _mesa_pointer_hash_table_create(dead_ctx); }