Reviewed-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
On Thu, Jan 18, 2018 at 3:37 AM, Dave Airlie <airl...@gmail.com> wrote: > From: Dave Airlie <airl...@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 <airl...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev