Mesa (main): radv: Setup shader arguments for mesh shaders.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Dec 31 13:38:48 UTC 2021
Module: Mesa
Branch: main
Commit: ae82d9d8f456f09d833e09e1430c4d6ddac32af4
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ae82d9d8f456f09d833e09e1430c4d6ddac32af4
Author: Timur Kristóf <timur.kristof at gmail.com>
Date: Thu Oct 28 21:07:45 2021 +0200
radv: Setup shader arguments for mesh shaders.
Use the same code path as other NGG shaders, but with
a few special cases.
Signed-off-by: Timur Kristóf <timur.kristof at gmail.com>
Acked-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13580>
---
src/amd/vulkan/radv_shader_args.c | 65 +++++++++++++++++++++++++++++++--------
1 file changed, 52 insertions(+), 13 deletions(-)
diff --git a/src/amd/vulkan/radv_shader_args.c b/src/amd/vulkan/radv_shader_args.c
index 84b57179813..e8f890b4607 100644
--- a/src/amd/vulkan/radv_shader_args.c
+++ b/src/amd/vulkan/radv_shader_args.c
@@ -99,6 +99,10 @@ needs_view_index_sgpr(const struct radv_nir_compiler_options *options,
(info->is_ngg && options->key.has_multiview_view_index))
return true;
break;
+ case MESA_SHADER_MESH:
+ if (info->uses_view_index || options->key.has_multiview_view_index)
+ return true;
+ break;
default:
break;
}
@@ -120,6 +124,17 @@ count_vs_user_sgprs(const struct radv_shader_info *info)
return count;
}
+static uint8_t
+count_ms_user_sgprs(const struct radv_shader_info *info)
+{
+ uint8_t count = 1; /* vertex offset */
+
+ if (info->vs.needs_draw_id)
+ count++;
+
+ return count;
+}
+
static unsigned
count_ngg_sgprs(const struct radv_shader_info *info, bool has_api_gs)
{
@@ -221,6 +236,8 @@ allocate_user_sgprs(const struct radv_nir_compiler_options *options,
if (previous_stage == MESA_SHADER_VERTEX) {
user_sgpr_count += count_vs_user_sgprs(info);
+ } else if (previous_stage == MESA_SHADER_MESH) {
+ user_sgpr_count += count_ms_user_sgprs(info);
}
}
break;
@@ -388,6 +405,24 @@ declare_tes_input_vgprs(struct radv_shader_args *args)
ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.tes_patch_id);
}
+static void
+declare_ms_input_sgprs(const struct radv_shader_info *info, struct radv_shader_args *args)
+{
+ ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.base_vertex);
+ if (info->vs.needs_draw_id) {
+ ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.draw_id);
+ }
+}
+
+static void
+declare_ms_input_vgprs(struct radv_shader_args *args)
+{
+ ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.vertex_id);
+ ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, NULL); /* user vgpr */
+ ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, NULL); /* user vgpr */
+ ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, NULL); /* instance_id */
+}
+
static void
declare_ps_input_vgprs(const struct radv_shader_info *info, struct radv_shader_args *args,
bool remap_spi_ps_input)
@@ -505,11 +540,11 @@ set_vs_specific_input_locs(struct radv_shader_args *args, gl_shader_stage stage,
}
}
-/* Returns whether the stage is a stage that can be directly before the GS */
-static bool
-is_pre_gs_stage(gl_shader_stage stage)
+static void
+set_ms_input_locs(struct radv_shader_args *args, uint8_t *user_sgpr_idx)
{
- return stage == MESA_SHADER_VERTEX || stage == MESA_SHADER_TESS_EVAL;
+ unsigned vs_num = args->ac.base_vertex.used + args->ac.draw_id.used;
+ set_loc_shader(args, AC_UD_VS_BASE_VERTEX_START_INSTANCE, user_sgpr_idx, vs_num);
}
void
@@ -522,13 +557,11 @@ radv_declare_shader_args(const struct radv_nir_compiler_options *options,
bool needs_view_index = needs_view_index_sgpr(options, info, stage);
bool has_api_gs = stage == MESA_SHADER_GEOMETRY;
- if (options->chip_class >= GFX10) {
- if (is_pre_gs_stage(stage) && info->is_ngg) {
- /* On GFX10, VS is merged into GS for NGG. */
- previous_stage = stage;
- stage = MESA_SHADER_GEOMETRY;
- has_previous_stage = true;
- }
+ if (options->chip_class >= GFX10 && info->is_ngg && stage != MESA_SHADER_GEOMETRY) {
+ /* Handle all NGG shaders as GS to simplify the code here. */
+ previous_stage = stage;
+ stage = MESA_SHADER_GEOMETRY;
+ has_previous_stage = true;
}
for (int i = 0; i < MAX_SETS; i++)
@@ -682,8 +715,10 @@ radv_declare_shader_args(const struct radv_nir_compiler_options *options,
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL); // unknown
ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, NULL); // unknown
- if (previous_stage != MESA_SHADER_TESS_EVAL) {
+ if (previous_stage == MESA_SHADER_VERTEX) {
declare_vs_specific_input_sgprs(info, args, stage, has_previous_stage, previous_stage);
+ } else if (previous_stage == MESA_SHADER_MESH) {
+ declare_ms_input_sgprs(info, args);
}
declare_global_input_sgprs(info, &user_sgpr_info, args);
@@ -704,8 +739,10 @@ radv_declare_shader_args(const struct radv_nir_compiler_options *options,
if (previous_stage == MESA_SHADER_VERTEX) {
declare_vs_input_vgprs(options, info, args);
- } else {
+ } else if (previous_stage == MESA_SHADER_TESS_EVAL) {
declare_tes_input_vgprs(args);
+ } else if (previous_stage == MESA_SHADER_MESH) {
+ declare_ms_input_vgprs(args);
}
} else {
declare_global_input_sgprs(info, &user_sgpr_info, args);
@@ -754,6 +791,8 @@ radv_declare_shader_args(const struct radv_nir_compiler_options *options,
if (stage == MESA_SHADER_VERTEX || (has_previous_stage && previous_stage == MESA_SHADER_VERTEX))
set_vs_specific_input_locs(args, stage, has_previous_stage, previous_stage, &user_sgpr_idx);
+ else if (has_previous_stage && previous_stage == MESA_SHADER_MESH)
+ set_ms_input_locs(args, &user_sgpr_idx);
set_global_input_locs(args, &user_sgpr_info, &user_sgpr_idx);
More information about the mesa-commit
mailing list