[Mesa-dev] [PATCH v2] spirv: Fix InterpolateAt* instructions for vecs with dynamic index
Jason Ekstrand
jason at jlekstrand.net
Mon Jul 9 16:57:18 UTC 2018
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
On Mon, Jul 9, 2018 at 5:21 AM Alejandro Piñeiro <apinheiro at igalia.com>
wrote:
> From: Neil Roberts <nroberts at igalia.com>
>
> If the glsl is something like this:
>
> in vec4 some_input;
> interpolateAtCentroid(some_input[idx])
>
> then it now gets generated as if it were:
>
> interpolateAtCentroid(some_input)[idx]
>
> This is necessary because the index will get generated as a series of
> nir_bcsel instructions so it would no longer be an input variable. It
> is similar to what is done for GLSL in ca63a5ed3e9efb2bd645b42.
>
> Although I can’t find anything explicit in the Vulkan specs to say
> this should be allowed, the SPIR-V spec just says “the operand
> interpolant must be a pointer to the Input Storage Class”, which I
> guess doesn’t rule out any type of pointer to an input.
>
> This was found using the spec/glsl-4.40/execution/fs-interpolateAt*
> Piglit tests with the ARB_gl_spirv branch.
>
> Signed-off-by: Neil Roberts <nroberts at igalia.com>
> Signed-off-by: Alejandro Piñeiro <apinheiro at igalia.com>
>
> v2: update after nir_deref_instr land on master. Implemented by
> Alejandro Piñeiro. Special thanks to Jason Ekstrand for guidance
> at the new nir_deref_instr world.
> ---
>
> Although this was initially detected while testing the ARB_gl_spirv
> ongoing implementation, as v1, this can be tested on Vulkan using
> vkrunner:
>
> git clone https://github.com/Igalia/vkrunner.git -b tests
> cd vkrunner && ./autogen.sh && make
> ./src/vkrunner examples/interpolation/*.shader_test
>
> src/compiler/spirv/vtn_glsl450.c | 38
> +++++++++++++++++++++++++++++++++-----
> 1 file changed, 33 insertions(+), 5 deletions(-)
>
> diff --git a/src/compiler/spirv/vtn_glsl450.c
> b/src/compiler/spirv/vtn_glsl450.c
> index 7f941ceeb0d..8393450f2f4 100644
> --- a/src/compiler/spirv/vtn_glsl450.c
> +++ b/src/compiler/spirv/vtn_glsl450.c
> @@ -802,7 +802,22 @@ handle_glsl450_interpolation(struct vtn_builder *b,
> enum GLSLstd450 opcode,
>
> struct vtn_pointer *ptr =
> vtn_value(b, w[5], vtn_value_type_pointer)->pointer;
> - intrin->src[0] = nir_src_for_ssa(&vtn_pointer_to_deref(b,
> ptr)->dest.ssa);
> + nir_deref_instr *deref = vtn_pointer_to_deref(b, ptr);
> +
> + /* If the value we are interpolating has an index into a vector then
> + * interpolate the vector and index the result of that instead. This is
> + * necessary because the index will get generated as a series of
> nir_bcsel
> + * instructions so it would no longer be an input variable.
> + */
> + const bool vec_array_deref = deref->deref_type == nir_deref_type_array
> &&
> + glsl_type_is_vector(nir_deref_instr_parent(deref)->type);
> +
> + nir_deref_instr *vec_deref = NULL;
> + if (vec_array_deref) {
> + vec_deref = deref;
> + deref = nir_deref_instr_parent(deref);
> + }
> + intrin->src[0] = nir_src_for_ssa(&deref->dest.ssa);
>
> switch (opcode) {
> case GLSLstd450InterpolateAtCentroid:
> @@ -815,13 +830,26 @@ handle_glsl450_interpolation(struct vtn_builder *b,
> enum GLSLstd450 opcode,
> vtn_fail("Invalid opcode");
> }
>
> - intrin->num_components = glsl_get_vector_elements(dest_type);
> + intrin->num_components = glsl_get_vector_elements(deref->type);
> nir_ssa_dest_init(&intrin->instr, &intrin->dest,
> - glsl_get_vector_elements(dest_type),
> - glsl_get_bit_size(dest_type), NULL);
> - val->ssa->def = &intrin->dest.ssa;
> + glsl_get_vector_elements(deref->type),
> + glsl_get_bit_size(deref->type), NULL);
>
> nir_builder_instr_insert(&b->nb, &intrin->instr);
> +
> + if (vec_array_deref) {
> + assert(vec_deref);
> + nir_const_value *const_index =
> nir_src_as_const_value(vec_deref->arr.index);
> + if (const_index) {
> + val->ssa->def = vtn_vector_extract(b, &intrin->dest.ssa,
> + const_index->u32[0]);
> + } else {
> + val->ssa->def = vtn_vector_extract_dynamic(b, &intrin->dest.ssa,
> +
> vec_deref->arr.index.ssa);
> + }
> + } else {
> + val->ssa->def = &intrin->dest.ssa;
> + }
> }
>
> bool
> --
> 2.14.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180709/16abb3a1/attachment.html>
More information about the mesa-dev
mailing list