[Mesa-dev] Mesa (master): nir/spirv: handle kernel function parameters

Samuel Pitoiset samuel.pitoiset at gmail.com
Tue Mar 19 10:35:47 UTC 2019


This commit breaks some CTS with RADV (eg. 
dEQP-VK.ssbo.phys.layout.single_basic_type.std430.bvec2) and it 
introduces one compiler warning (minor stuff).

Is the Rb tag missing too?

Thanks!

On 3/19/19 5:57 AM, GitLab Mirror wrote:
> Module: Mesa
> Branch: master
> Commit: c95afe56a8033a87dca71cc93191d448c2981cf7
> URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c95afe56a8033a87dca71cc93191d448c2981cf7
>
> Author: Karol Herbst <kherbst at redhat.com>
> Date:   Tue Nov  6 12:06:08 2018 +0100
>
> nir/spirv: handle kernel function parameters
>
> the idea here is to generate an entry point stub function wrapping around the
> actual kernel function and turn all parameters into shader inputs with byte
> addressing instead of vec4.
>
> This gives us several advantages:
> 1. calling kernel functions doesn't differ from calling any other function
> 2. CL inputs match uniforms in most ways and we can just take advantage of most
>     of nir_lower_io
>
> v2: move code into a seperate function
> v3: verify the entry point got a name
>      fix minor typo
> v4: make vtn_emit_kernel_entry_point_wrapper take the old entry point as an arg
>
> Signed-off-by: Karol Herbst <kherbst at redhat.com>
>
> ---
>
>   src/compiler/spirv/spirv_to_nir.c | 66 +++++++++++++++++++++++++++++++++++++++
>   1 file changed, 66 insertions(+)
>
> diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
> index 5becd3418da..df5bba2c2a0 100644
> --- a/src/compiler/spirv/spirv_to_nir.c
> +++ b/src/compiler/spirv/spirv_to_nir.c
> @@ -4453,6 +4453,68 @@ vtn_create_builder(const uint32_t *words, size_t word_count,
>      return NULL;
>   }
>   
> +static nir_function *
> +vtn_emit_kernel_entry_point_wrapper(struct vtn_builder *b,
> +                                    const nir_function *entry_point)
> +{
> +   vtn_assert(entry_point == b->entry_point->func->impl->function);
> +   vtn_fail_if(!entry_point->name, "entry points are required to have a name");
> +   const char *func_name =
> +      ralloc_asprintf(b->shader, "__wrapped_%s", entry_point->name);
> +
> +   /* we shouldn't have any inputs yet */
> +   vtn_assert(!entry_point->shader->num_inputs);
> +   vtn_assert(b->shader->info.stage == MESA_SHADER_KERNEL);
> +
> +   nir_function *main_entry_point = nir_function_create(b->shader, func_name);
> +   main_entry_point->impl = nir_function_impl_create(main_entry_point);
> +   nir_builder_init(&b->nb, main_entry_point->impl);
> +   b->nb.cursor = nir_after_cf_list(&main_entry_point->impl->body);
> +   b->func_param_idx = 0;
> +
> +   nir_call_instr *call = nir_call_instr_create(b->nb.shader, entry_point);
> +
> +   for (unsigned i = 0; i < entry_point->num_params; ++i) {
> +      struct vtn_type *param_type = b->entry_point->func->type->params[i];
> +
> +      /* consider all pointers to function memory to be parameters passed
> +       * by value
> +       */
> +      bool is_by_val = param_type->base_type == vtn_base_type_pointer &&
> +         param_type->storage_class == SpvStorageClassFunction;
> +
> +      /* input variable */
> +      nir_variable *in_var = rzalloc(b->nb.shader, nir_variable);
> +      in_var->data.mode = nir_var_shader_in;
> +      in_var->data.read_only = true;
> +      in_var->data.location = i;
> +
> +      if (is_by_val)
> +         in_var->type = param_type->deref->type;
> +      else
> +         in_var->type = param_type->type;
> +
> +      nir_shader_add_variable(b->nb.shader, in_var);
> +      b->nb.shader->num_inputs++;
> +
> +      /* we have to copy the entire variable into function memory */
> +      if (is_by_val) {
> +         nir_variable *copy_var =
> +            nir_local_variable_create(main_entry_point->impl, in_var->type,
> +                                      "copy_in");
> +         nir_copy_var(&b->nb, copy_var, in_var);
> +         call->params[i] =
> +            nir_src_for_ssa(&nir_build_deref_var(&b->nb, copy_var)->dest.ssa);
> +      } else {
> +         call->params[i] = nir_src_for_ssa(nir_load_var(&b->nb, in_var));
> +      }
> +   }
> +
> +   nir_builder_instr_insert(&b->nb, &call->instr);
> +
> +   return main_entry_point;
> +}
> +
>   nir_function *
>   spirv_to_nir(const uint32_t *words, size_t word_count,
>                struct nir_spirv_specialization *spec, unsigned num_spec,
> @@ -4542,6 +4604,10 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
>      nir_function *entry_point = b->entry_point->func->impl->function;
>      vtn_assert(entry_point);
>   
> +   /* post process entry_points with input params */
> +   if (entry_point->num_params && b->shader->info.stage == MESA_SHADER_KERNEL)
> +      entry_point = vtn_emit_kernel_entry_point_wrapper(b, entry_point);
> +
>      entry_point->is_entrypoint = true;
>   
>      /* When multiple shader stages exist in the same SPIR-V module, we
>
> _______________________________________________
> mesa-commit mailing list
> mesa-commit at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-commit


More information about the mesa-dev mailing list