Module: Mesa Branch: main Commit: d8a5b76307fda99e49c0d929c211a1f82e7bbc9f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d8a5b76307fda99e49c0d929c211a1f82e7bbc9f
Author: Tatsuyuki Ishi <ishitatsuy...@gmail.com> Date: Fri Nov 3 19:11:44 2023 +0900 aco: Replace aco_vs_input_state.divisors with bitfields. Instead of concrete divisor value, we only pass down the information whether the divisor is zero or nontrivial (>1). Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26023> --- src/amd/compiler/aco_instruction_selection.cpp | 14 ++++++-------- src/amd/compiler/aco_shader_info.h | 2 +- src/amd/vulkan/radv_aco_shader_info.h | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index b55d60afab9..36bcf872479 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -12799,12 +12799,11 @@ select_vs_prolog(Program* program, const struct aco_vs_prolog_info* pinfo, ac_sh } } - bool needs_instance_index = false; - bool needs_start_instance = false; - u_foreach_bit (i, pinfo->state.instance_rate_inputs & attrib_mask) { - needs_instance_index |= pinfo->state.divisors[i] == 1; - needs_start_instance |= pinfo->state.divisors[i] == 0; - } + bool needs_instance_index = + pinfo->state.instance_rate_inputs & attrib_mask & + ~(pinfo->state.zero_divisors | pinfo->state.nontrivial_divisors); /* divisor is 1 */ + bool needs_start_instance = + pinfo->state.instance_rate_inputs & attrib_mask & pinfo->state.zero_divisors; bool needs_vertex_index = ~pinfo->state.instance_rate_inputs & attrib_mask; if (needs_vertex_index) bld.vadd32(Definition(vertex_index, v1), get_arg_fixed(args, args->base_vertex), @@ -12824,8 +12823,7 @@ select_vs_prolog(Program* program, const struct aco_vs_prolog_info* pinfo, ac_sh /* calculate index */ Operand fetch_index = Operand(vertex_index, v1); if (pinfo->state.instance_rate_inputs & (1u << loc)) { - uint32_t divisor = pinfo->state.divisors[loc]; - if (divisor) { + if (!(pinfo->state.zero_divisors & (1u << loc))) { fetch_index = instance_id; if (pinfo->state.nontrivial_divisors & (1u << loc)) { unsigned index = diff --git a/src/amd/compiler/aco_shader_info.h b/src/amd/compiler/aco_shader_info.h index 2664fdae3f8..5fdb96fa833 100644 --- a/src/amd/compiler/aco_shader_info.h +++ b/src/amd/compiler/aco_shader_info.h @@ -44,6 +44,7 @@ extern "C" { struct aco_vs_input_state { uint32_t instance_rate_inputs; uint32_t nontrivial_divisors; + uint32_t zero_divisors; uint32_t post_shuffle; /* Having two separate fields instead of a single uint64_t makes it easier to remove attributes * using bitwise arithmetic. @@ -51,7 +52,6 @@ struct aco_vs_input_state { uint32_t alpha_adjust_lo; uint32_t alpha_adjust_hi; - uint32_t divisors[ACO_MAX_VERTEX_ATTRIBS]; uint8_t formats[ACO_MAX_VERTEX_ATTRIBS]; }; diff --git a/src/amd/vulkan/radv_aco_shader_info.h b/src/amd/vulkan/radv_aco_shader_info.h index ec235a7279b..b8887582525 100644 --- a/src/amd/vulkan/radv_aco_shader_info.h +++ b/src/amd/vulkan/radv_aco_shader_info.h @@ -80,10 +80,10 @@ radv_aco_convert_vs_prolog_key(struct aco_vs_prolog_info *aco_info, const struct { ASSIGN_VS_STATE_FIELD(instance_rate_inputs); ASSIGN_VS_STATE_FIELD(nontrivial_divisors); + ASSIGN_VS_STATE_FIELD(zero_divisors); ASSIGN_VS_STATE_FIELD(post_shuffle); ASSIGN_VS_STATE_FIELD(alpha_adjust_lo); ASSIGN_VS_STATE_FIELD(alpha_adjust_hi); - ASSIGN_VS_STATE_FIELD_CP(divisors); ASSIGN_VS_STATE_FIELD_CP(formats); ASSIGN_FIELD(num_attributes); ASSIGN_FIELD(misaligned_mask);