spirv: Add and use vtn_type_without_array() helper
v2: Renamed from vtn_interface_type. (Jason) Accept any type not only pointers. Reviewed-by: Jason Ekstrand <jason@jlekstrand.net> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
@@ -648,6 +648,14 @@ vtn_types_compatible(struct vtn_builder *b,
|
|||||||
vtn_fail("Invalid base type");
|
vtn_fail("Invalid base type");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct vtn_type *
|
||||||
|
vtn_type_without_array(struct vtn_type *type)
|
||||||
|
{
|
||||||
|
while (type->base_type == vtn_base_type_array)
|
||||||
|
type = type->array_element;
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
/* does a shallow copy of a vtn_type */
|
/* does a shallow copy of a vtn_type */
|
||||||
|
|
||||||
static struct vtn_type *
|
static struct vtn_type *
|
||||||
|
@@ -396,6 +396,8 @@ bool vtn_type_contains_block(struct vtn_builder *b, struct vtn_type *type);
|
|||||||
bool vtn_types_compatible(struct vtn_builder *b,
|
bool vtn_types_compatible(struct vtn_builder *b,
|
||||||
struct vtn_type *t1, struct vtn_type *t2);
|
struct vtn_type *t1, struct vtn_type *t2);
|
||||||
|
|
||||||
|
struct vtn_type *vtn_type_without_array(struct vtn_type *type);
|
||||||
|
|
||||||
struct vtn_variable;
|
struct vtn_variable;
|
||||||
|
|
||||||
enum vtn_access_mode {
|
enum vtn_access_mode {
|
||||||
|
@@ -1864,14 +1864,13 @@ vtn_pointer_from_ssa(struct vtn_builder *b, nir_ssa_def *ssa,
|
|||||||
{
|
{
|
||||||
vtn_assert(ptr_type->base_type == vtn_base_type_pointer);
|
vtn_assert(ptr_type->base_type == vtn_base_type_pointer);
|
||||||
|
|
||||||
struct vtn_type *interface_type = ptr_type->deref;
|
|
||||||
while (interface_type->base_type == vtn_base_type_array)
|
|
||||||
interface_type = interface_type->array_element;
|
|
||||||
|
|
||||||
struct vtn_pointer *ptr = rzalloc(b, struct vtn_pointer);
|
struct vtn_pointer *ptr = rzalloc(b, struct vtn_pointer);
|
||||||
|
struct vtn_type *without_array =
|
||||||
|
vtn_type_without_array(ptr_type->deref);
|
||||||
|
|
||||||
nir_variable_mode nir_mode;
|
nir_variable_mode nir_mode;
|
||||||
ptr->mode = vtn_storage_class_to_mode(b, ptr_type->storage_class,
|
ptr->mode = vtn_storage_class_to_mode(b, ptr_type->storage_class,
|
||||||
interface_type, &nir_mode);
|
without_array, &nir_mode);
|
||||||
ptr->type = ptr_type->deref;
|
ptr->type = ptr_type->deref;
|
||||||
ptr->ptr_type = ptr_type;
|
ptr->ptr_type = ptr_type;
|
||||||
|
|
||||||
@@ -2009,9 +2008,7 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val,
|
|||||||
vtn_assert(ptr_type->base_type == vtn_base_type_pointer);
|
vtn_assert(ptr_type->base_type == vtn_base_type_pointer);
|
||||||
struct vtn_type *type = ptr_type->deref;
|
struct vtn_type *type = ptr_type->deref;
|
||||||
|
|
||||||
struct vtn_type *without_array = type;
|
struct vtn_type *without_array = vtn_type_without_array(ptr_type->deref);
|
||||||
while(glsl_type_is_array(without_array->type))
|
|
||||||
without_array = without_array->array_element;
|
|
||||||
|
|
||||||
enum vtn_variable_mode mode;
|
enum vtn_variable_mode mode;
|
||||||
nir_variable_mode nir_mode;
|
nir_variable_mode nir_mode;
|
||||||
|
Reference in New Issue
Block a user