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.pitoi...@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 <kher...@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 <kher...@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-com...@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/mesa-commit > _______________________________________________ > 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