[Mesa-dev] Mesa (master): nir/spirv: handle kernel function parameters
Jason Ekstrand
jason at jlekstrand.net
Tue Mar 19 19:59:15 UTC 2019
There's a MR out to fix this:
https://gitlab.freedesktop.org/mesa/mesa/merge_requests/478/diffs
On Tue, Mar 19, 2019 at 5:32 AM Samuel Pitoiset <samuel.pitoiset at gmail.com>
wrote:
> 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
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20190319/a1f86d13/attachment.html>
More information about the mesa-dev
mailing list