Reviewed-by: Alejandro Piñeiro <apinhe...@igalia.com> On 02/01/18 17:30, Jason Ekstrand wrote: > --- > src/compiler/spirv/spirv_to_nir.c | 52 > +++++++++++++++++++++++++++++++++++++++ > src/compiler/spirv/vtn_private.h | 3 +++ > 2 files changed, 55 insertions(+) > > diff --git a/src/compiler/spirv/spirv_to_nir.c > b/src/compiler/spirv/spirv_to_nir.c > index 751fb03..5004d81 100644 > --- a/src/compiler/spirv/spirv_to_nir.c > +++ b/src/compiler/spirv/spirv_to_nir.c > @@ -538,6 +538,58 @@ struct member_decoration_ctx { > struct vtn_type *type; > }; > > +/** Returns true if two types are "compatible", i.e. you can do an OpLoad, > + * OpStore, or OpCopyMemory between them without breaking anything. > + * Technically, the SPIR-V rules require the exact same type ID but this lets > + * us internally be a bit looser. > + */ > +bool > +vtn_types_compatible(struct vtn_builder *b, > + struct vtn_type *t1, struct vtn_type *t2) > +{ > + if (t1->val == t2->val) > + return true; > + > + if (t1->base_type != t2->base_type) > + return false; > + > + switch (t1->base_type) { > + case vtn_base_type_void: > + case vtn_base_type_scalar: > + case vtn_base_type_vector: > + case vtn_base_type_matrix: > + case vtn_base_type_image: > + case vtn_base_type_sampler: > + case vtn_base_type_sampled_image: > + return t1->type == t2->type; > + > + case vtn_base_type_array: > + return t1->length == t2->length && > + vtn_types_compatible(b, t1->array_element, t2->array_element); > + > + case vtn_base_type_pointer: > + return vtn_types_compatible(b, t1->deref, t2->deref); > + > + case vtn_base_type_struct: > + if (t1->length != t2->length) > + return false; > + > + for (unsigned i = 0; i < t1->length; i++) { > + if (!vtn_types_compatible(b, t1->members[i], t2->members[i])) > + return false; > + } > + return true; > + > + case vtn_base_type_function: > + /* This case shouldn't get hit since you can't copy around function > + * types. Just require them to be identical. > + */ > + return false; > + } > + > + vtn_fail("Invalid base type"); > +} > + > /* does a shallow copy of a vtn_type */ > > static struct vtn_type * > diff --git a/src/compiler/spirv/vtn_private.h > b/src/compiler/spirv/vtn_private.h > index 374643a..f2b53e1 100644 > --- a/src/compiler/spirv/vtn_private.h > +++ b/src/compiler/spirv/vtn_private.h > @@ -365,6 +365,9 @@ struct vtn_type { > }; > }; > > +bool vtn_types_compatible(struct vtn_builder *b, > + struct vtn_type *t1, struct vtn_type *t2); > + > struct vtn_variable; > > enum vtn_access_mode {
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev