Module: Mesa Branch: main Commit: c8140e4c0eff5f5926fed5135a7c93a8628156ff URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c8140e4c0eff5f5926fed5135a7c93a8628156ff
Author: Samuel Pitoiset <samuel.pitoi...@gmail.com> Date: Fri Oct 27 10:15:33 2023 +0200 radv: emit individual SET_SH_REG for inlined push constants with DGC This should allow to preprocess if everything is inlined. Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25935> --- src/amd/vulkan/radv_device_generated_commands.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/amd/vulkan/radv_device_generated_commands.c b/src/amd/vulkan/radv_device_generated_commands.c index 7405dcd74a5..17af95bfad0 100644 --- a/src/amd/vulkan/radv_device_generated_commands.c +++ b/src/amd/vulkan/radv_device_generated_commands.c @@ -118,7 +118,7 @@ radv_get_sequence_size(const struct radv_indirect_command_layout *layout, struct } if (locs->shader_data[AC_UD_INLINE_PUSH_CONSTANTS].sgpr_idx >= 0) /* One PKT3_SET_SH_REG writing all inline push constants. */ - *cmd_size += (2 + locs->shader_data[AC_UD_INLINE_PUSH_CONSTANTS].num_sgprs) * 4; + *cmd_size += (3 * locs->shader_data[AC_UD_INLINE_PUSH_CONSTANTS].num_sgprs) * 4; } if (need_copy) *upload_size += align(pipeline->push_constant_size + 16 * pipeline->dynamic_offset_count, 16); @@ -795,12 +795,10 @@ dgc_emit_push_constant(nir_builder *b, struct dgc_cmdbuf *cs, nir_def *stream_bu nir_push_if(b, nir_ine_imm(b, inline_sgpr, 0)); { - nir_def *inline_len = nir_bit_count(b, inline_mask); nir_store_var(b, idx, nir_imm_int(b, 0), 0x1); - nir_def *pkt[2] = {nir_pkt3(b, PKT3_SET_SH_REG, inline_len), inline_sgpr}; - - dgc_emit(b, cs, nir_vec(b, pkt, 2)); + nir_variable *pc_idx = nir_variable_create(b->shader, nir_var_shader_temp, glsl_uint_type(), "pc_idx"); + nir_store_var(b, pc_idx, nir_imm_int(b, 0), 0x1); nir_push_loop(b); { @@ -841,9 +839,13 @@ dgc_emit_push_constant(nir_builder *b, struct dgc_cmdbuf *cs, nir_def *stream_bu } nir_pop_if(b, NULL); - dgc_emit(b, cs, nir_load_var(b, data)); + nir_def *pkt[3] = {nir_pkt3(b, PKT3_SET_SH_REG, nir_imm_int(b, 1)), + nir_iadd(b, inline_sgpr, nir_load_var(b, pc_idx)), nir_load_var(b, data)}; + + dgc_emit(b, cs, nir_vec(b, pkt, 3)); nir_store_var(b, idx, nir_iadd_imm(b, cur_idx, 1), 0x1); + nir_store_var(b, pc_idx, nir_iadd_imm(b, nir_load_var(b, pc_idx), 1), 0x1); } nir_pop_loop(b, NULL); }