Mesa (main): radv: declare the shader user locs from the shader arguments

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Oct 8 12:08:32 UTC 2021


Module: Mesa
Branch: main
Commit: 2d4fc61bffa0730376e4e9ccc73a0df1e36f1630
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2d4fc61bffa0730376e4e9ccc73a0df1e36f1630

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Fri Oct  1 14:24:14 2021 +0200

radv: declare the shader user locs from the shader arguments

Seems more robust. Basically, the idea is to declare shader arguments
from the shader info, and then the user locs from the arguments.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13149>

---

 src/amd/vulkan/radv_shader_args.c | 66 +++++++++++++++++++--------------------
 1 file changed, 32 insertions(+), 34 deletions(-)

diff --git a/src/amd/vulkan/radv_shader_args.c b/src/amd/vulkan/radv_shader_args.c
index c412fc4c093..705bcc8d43b 100644
--- a/src/amd/vulkan/radv_shader_args.c
+++ b/src/amd/vulkan/radv_shader_args.c
@@ -384,13 +384,12 @@ static void
 set_global_input_locs(struct radv_shader_args *args, const struct user_sgpr_info *user_sgpr_info,
                       uint8_t *user_sgpr_idx)
 {
-   uint32_t mask = args->shader_info->desc_set_used_mask;
+   unsigned num_inline_push_consts = 0;
 
    if (!user_sgpr_info->indirect_all_descriptor_sets) {
-      while (mask) {
-         int i = u_bit_scan(&mask);
-
-         set_loc_desc(args, i, user_sgpr_idx);
+      for (unsigned i = 0; i < ARRAY_SIZE(args->descriptor_sets); i++) {
+         if (args->descriptor_sets[i].used)
+            set_loc_desc(args, i, user_sgpr_idx);
       }
    } else {
       set_loc_shader_ptr(args, AC_UD_INDIRECT_DESCRIPTOR_SETS, user_sgpr_idx);
@@ -398,13 +397,17 @@ set_global_input_locs(struct radv_shader_args *args, const struct user_sgpr_info
       args->shader_info->need_indirect_descriptor_sets = true;
    }
 
-   if (args->shader_info->loads_push_constants) {
+   if (args->ac.push_constants.used) {
       set_loc_shader_ptr(args, AC_UD_PUSH_CONSTANTS, user_sgpr_idx);
    }
 
-   if (args->shader_info->num_inline_push_consts) {
-      set_loc_shader(args, AC_UD_INLINE_PUSH_CONSTANTS, user_sgpr_idx,
-                     args->shader_info->num_inline_push_consts);
+   for (unsigned i = 0; i < ARRAY_SIZE(args->ac.inline_push_consts); i++) {
+      if (args->ac.inline_push_consts[i].used)
+         num_inline_push_consts++;
+   }
+
+   if (num_inline_push_consts) {
+      set_loc_shader(args, AC_UD_INLINE_PUSH_CONSTANTS, user_sgpr_idx, num_inline_push_consts);
    }
 
    if (args->streamout_buffers.used) {
@@ -419,33 +422,16 @@ set_vs_specific_input_locs(struct radv_shader_args *args, gl_shader_stage stage,
 {
    if (!args->is_gs_copy_shader && (stage == MESA_SHADER_VERTEX ||
                                     (has_previous_stage && previous_stage == MESA_SHADER_VERTEX))) {
-      if (args->shader_info->vs.vb_desc_usage_mask) {
+      if (args->ac.vertex_buffers.used) {
          set_loc_shader_ptr(args, AC_UD_VS_VERTEX_BUFFERS, user_sgpr_idx);
       }
 
-      unsigned vs_num =
-         count_vs_user_sgprs(args) - (args->shader_info->vs.vb_desc_usage_mask ? 1 : 0);
+      unsigned vs_num = args->ac.base_vertex.used + args->ac.draw_id.used +
+                        args->ac.start_instance.used;
       set_loc_shader(args, AC_UD_VS_BASE_VERTEX_START_INSTANCE, user_sgpr_idx, vs_num);
    }
 }
 
-static void
-set_ngg_sgprs_locs(struct radv_shader_args *args, uint8_t *user_sgpr_idx)
-{
-   if (args->ngg_gs_state.used) {
-      set_loc_shader(args, AC_UD_NGG_GS_STATE, user_sgpr_idx, 1);
-   }
-
-   if (args->shader_info->has_ngg_culling) {
-      assert(args->ngg_culling_settings.used &&
-             args->ngg_viewport_scale[0].used && args->ngg_viewport_scale[1].used &&
-             args->ngg_viewport_translate[0].used && args->ngg_viewport_translate[1].used);
-
-      set_loc_shader(args, AC_UD_NGG_CULLING_SETTINGS, user_sgpr_idx, 1);
-      set_loc_shader(args, AC_UD_NGG_VIEWPORT, user_sgpr_idx, 4);
-   }
-}
-
 /* Returns whether the stage is a stage that can be directly before the GS */
 static bool
 is_pre_gs_stage(gl_shader_stage stage)
@@ -710,13 +696,13 @@ radv_declare_shader_args(struct radv_shader_args *args, gl_shader_stage stage,
 
    switch (stage) {
    case MESA_SHADER_COMPUTE:
-      if (args->shader_info->cs.uses_sbt) {
+      if (args->ac.sbt_descriptors.used) {
          set_loc_shader_ptr(args, AC_UD_CS_SBT_DESCRIPTORS, &user_sgpr_idx);
       }
-      if (args->shader_info->cs.uses_grid_size) {
+      if (args->ac.num_work_groups.used) {
          set_loc_shader(args, AC_UD_CS_GRID_SIZE, &user_sgpr_idx, 3);
       }
-      if (args->shader_info->cs.uses_ray_launch_size) {
+      if (args->ac.ray_launch_size.used) {
          set_loc_shader(args, AC_UD_CS_RAY_LAUNCH_SIZE, &user_sgpr_idx, 3);
       }
       break;
@@ -743,8 +729,20 @@ radv_declare_shader_args(struct radv_shader_args *args, gl_shader_stage stage,
       if (args->ac.view_index.used)
          set_loc_shader(args, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);
 
-      if (args->shader_info->is_ngg)
-         set_ngg_sgprs_locs(args, &user_sgpr_idx);
+      if (args->ngg_gs_state.used) {
+         set_loc_shader(args, AC_UD_NGG_GS_STATE, &user_sgpr_idx, 1);
+      }
+
+      if (args->ngg_culling_settings.used) {
+         set_loc_shader(args, AC_UD_NGG_CULLING_SETTINGS, &user_sgpr_idx, 1);
+      }
+
+      if (args->ngg_viewport_scale[0].used) {
+         assert(args->ngg_viewport_scale[1].used &&
+                args->ngg_viewport_translate[0].used &&
+                args->ngg_viewport_translate[1].used);
+         set_loc_shader(args, AC_UD_NGG_VIEWPORT, &user_sgpr_idx, 4);
+      }
       break;
    case MESA_SHADER_FRAGMENT:
       break;



More information about the mesa-commit mailing list