summaryrefslogtreecommitdiffstats
path: root/src/glsl/linker.cpp
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2015-03-14 12:40:20 +1100
committerTimothy Arceri <[email protected]>2015-07-04 17:13:10 +1000
commit939dc2850645786b4ff76aa162e44eb9f77be805 (patch)
treea97856c19048b60beeefb24d863c6302edacc2e5 /src/glsl/linker.cpp
parent7ecb11c81c1e2fc816b36c82657ab139eb1d84b6 (diff)
glsl: update types for unsized arrays of members
Assigns a new array type based on the max access of unsized array members. This is to support arrays of arrays. Reviewed-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src/glsl/linker.cpp')
-rw-r--r--src/glsl/linker.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 71a45e8db9c..8d4b40e4f0c 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -1250,8 +1250,7 @@ public:
resize_interface_members(var->type->fields.array,
var->get_max_ifc_array_access());
var->change_interface_type(new_type);
- var->type =
- glsl_type::get_array_instance(new_type, var->type->length);
+ var->type = update_interface_members_array(var->type, new_type);
}
} else if (const glsl_type *ifc_type = var->get_interface_type()) {
/* Store a pointer to the variable in the unnamed_interfaces
@@ -1299,6 +1298,21 @@ private:
}
}
+ static const glsl_type *
+ update_interface_members_array(const glsl_type *type,
+ const glsl_type *new_interface_type)
+ {
+ const glsl_type *element_type = type->fields.array;
+ if (element_type->is_array()) {
+ const glsl_type *new_array_type =
+ update_interface_members_array(element_type, new_interface_type);
+ return glsl_type::get_array_instance(new_array_type, type->length);
+ } else {
+ return glsl_type::get_array_instance(new_interface_type,
+ type->length);
+ }
+ }
+
/**
* Determine whether the given interface type contains unsized arrays (if
* it doesn't, array_sizing_visitor doesn't need to process it).