[Mesa-dev] [PATCH] spirv: Fix structure splitting with per-vertex interface arrays.

Jason Ekstrand jason at jlekstrand.net
Tue Mar 15 00:23:44 UTC 2016


On Sun, Mar 13, 2016 at 6:08 PM, Kenneth Graunke <kenneth at whitecape.org>
wrote:

> We want to use interface_type, not vtn_var->type.  They're normally
> equivalent, but for geometry/tessellation per-vertex interface arrays,
> we need to unwrap a level.
>
> Otherwise, we tried to iterate a structure members but instead used
> an array length.  If the array length was longer than the number of
> fields in the structure, we'd crash.
> ---
>  src/compiler/nir/spirv/vtn_variables.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/src/compiler/nir/spirv/vtn_variables.c
> b/src/compiler/nir/spirv/vtn_variables.c
> index 31bf416..1628042 100644
> --- a/src/compiler/nir/spirv/vtn_variables.c
> +++ b/src/compiler/nir/spirv/vtn_variables.c
> @@ -923,7 +923,7 @@ var_decoration_cb(struct vtn_builder *b, struct
> vtn_value *val, int member,
>           vtn_var->var->data.explicit_location = true;
>        } else {
>           assert(vtn_var->members);
> -         unsigned length = glsl_get_length(vtn_var->type->type);
> +         unsigned length = glsl_get_length(val->type->type);
>

Good catch.  What I think we really want here though is a "without_array"
helper.  I'm not a huge fan of grabbing the type from the value because
that comes in from the client and I don't really trust it.


>           for (unsigned i = 0; i < length; i++) {
>              vtn_var->members[i]->data.location = location;
>              vtn_var->members[i]->data.explicit_location = true;
> --
> 2.7.2
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160314/99ca0674/attachment.html>


More information about the mesa-dev mailing list