[Mesa-dev] [PATCH] ac/nir: account for view index in the user sgpr allocation.

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Thu Jan 18 12:19:33 UTC 2018


Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

On Thu, Jan 18, 2018 at 3:37 AM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> The view index user sgpr wasn't being accounted for properly,
> this refactors out the code to decide if it's required and then
> uses that info to account for it.
>
> Fixes: 180c1b924e (ac/nir: Add shader support for multiviews.)
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/amd/common/ac_nir_to_llvm.c | 42 +++++++++++++++++++++++++++++++++--------
>  1 file changed, 34 insertions(+), 8 deletions(-)
>
> diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
> index e07330ca5c8..e31d771025b 100644
> --- a/src/amd/common/ac_nir_to_llvm.c
> +++ b/src/amd/common/ac_nir_to_llvm.c
> @@ -543,8 +543,31 @@ struct user_sgpr_info {
>         bool indirect_all_descriptor_sets;
>  };
>
> +static bool needs_view_index_sgpr(struct nir_to_llvm_context *ctx,
> +                                 gl_shader_stage stage)
> +{
> +       switch (stage) {
> +       case MESA_SHADER_VERTEX:
> +               if (ctx->shader_info->info.needs_multiview_view_index ||
> +                   (!ctx->options->key.vs.as_es && !ctx->options->key.vs.as_ls && ctx->options->key.has_multiview_view_index))
> +                       return true;
> +               break;
> +       case MESA_SHADER_TESS_EVAL:
> +               if (ctx->shader_info->info.needs_multiview_view_index || (!ctx->options->key.tes.as_es && ctx->options->key.has_multiview_view_index))
> +                       return true;
> +       case MESA_SHADER_GEOMETRY:
> +       case MESA_SHADER_TESS_CTRL:
> +               if (ctx->shader_info->info.needs_multiview_view_index)
> +                       return true;
> +       default:
> +               break;
> +       }
> +       return false;
> +}
> +
>  static void allocate_user_sgprs(struct nir_to_llvm_context *ctx,
>                                 gl_shader_stage stage,
> +                               bool needs_view_index,
>                                 struct user_sgpr_info *user_sgpr_info)
>  {
>         memset(user_sgpr_info, 0, sizeof(struct user_sgpr_info));
> @@ -600,6 +623,9 @@ static void allocate_user_sgprs(struct nir_to_llvm_context *ctx,
>                 break;
>         }
>
> +       if (needs_view_index)
> +               user_sgpr_info->sgpr_count++;
> +
>         if (ctx->shader_info->info.loads_push_constants)
>                 user_sgpr_info->sgpr_count += 2;
>
> @@ -771,8 +797,8 @@ static void create_function(struct nir_to_llvm_context *ctx,
>         struct user_sgpr_info user_sgpr_info;
>         struct arg_info args = {};
>         LLVMValueRef desc_sets;
> -
> -       allocate_user_sgprs(ctx, stage, &user_sgpr_info);
> +       bool needs_view_index = needs_view_index_sgpr(ctx, stage);
> +       allocate_user_sgprs(ctx, stage, needs_view_index, &user_sgpr_info);
>
>         if (user_sgpr_info.need_ring_offsets && !ctx->options->supports_spill) {
>                 add_arg(&args, ARG_SGPR, const_array(ctx->ac.v4i32, 16),
> @@ -810,7 +836,7 @@ static void create_function(struct nir_to_llvm_context *ctx,
>                 declare_vs_specific_input_sgprs(ctx, stage, has_previous_stage,
>                                                 previous_stage, &args);
>
> -               if (ctx->shader_info->info.needs_multiview_view_index || (!ctx->options->key.vs.as_es && !ctx->options->key.vs.as_ls && ctx->options->key.has_multiview_view_index))
> +               if (needs_view_index)
>                         add_arg(&args, ARG_SGPR, ctx->ac.i32, &ctx->view_index);
>                 if (ctx->options->key.vs.as_es)
>                         add_arg(&args, ARG_SGPR, ctx->ac.i32,
> @@ -854,7 +880,7 @@ static void create_function(struct nir_to_llvm_context *ctx,
>                                 &ctx->tcs_out_layout);
>                         add_arg(&args, ARG_SGPR, ctx->ac.i32,
>                                 &ctx->tcs_in_layout);
> -                       if (ctx->shader_info->info.needs_multiview_view_index)
> +                       if (needs_view_index)
>                                 add_arg(&args, ARG_SGPR, ctx->ac.i32,
>                                         &ctx->view_index);
>
> @@ -879,7 +905,7 @@ static void create_function(struct nir_to_llvm_context *ctx,
>                                 &ctx->tcs_out_layout);
>                         add_arg(&args, ARG_SGPR, ctx->ac.i32,
>                                 &ctx->tcs_in_layout);
> -                       if (ctx->shader_info->info.needs_multiview_view_index)
> +                       if (needs_view_index)
>                                 add_arg(&args, ARG_SGPR, ctx->ac.i32,
>                                         &ctx->view_index);
>
> @@ -898,7 +924,7 @@ static void create_function(struct nir_to_llvm_context *ctx,
>                                            &args, &desc_sets);
>
>                 add_arg(&args, ARG_SGPR, ctx->ac.i32, &ctx->tcs_offchip_layout);
> -               if (ctx->shader_info->info.needs_multiview_view_index || (!ctx->options->key.tes.as_es && ctx->options->key.has_multiview_view_index))
> +               if (needs_view_index)
>                         add_arg(&args, ARG_SGPR, ctx->ac.i32, &ctx->view_index);
>
>                 if (ctx->options->key.tes.as_es) {
> @@ -945,7 +971,7 @@ static void create_function(struct nir_to_llvm_context *ctx,
>                                 &ctx->gsvs_ring_stride);
>                         add_arg(&args, ARG_SGPR, ctx->ac.i32,
>                                 &ctx->gsvs_num_entries);
> -                       if (ctx->shader_info->info.needs_multiview_view_index)
> +                       if (needs_view_index)
>                                 add_arg(&args, ARG_SGPR, ctx->ac.i32,
>                                         &ctx->view_index);
>
> @@ -976,7 +1002,7 @@ static void create_function(struct nir_to_llvm_context *ctx,
>                                 &ctx->gsvs_ring_stride);
>                         add_arg(&args, ARG_SGPR, ctx->ac.i32,
>                                 &ctx->gsvs_num_entries);
> -                       if (ctx->shader_info->info.needs_multiview_view_index)
> +                       if (needs_view_index)
>                                 add_arg(&args, ARG_SGPR, ctx->ac.i32,
>                                         &ctx->view_index);
>
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list