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);
       }

Reply via email to