summaryrefslogtreecommitdiff
path: root/src/glsl/linker.cpp
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-08-29 22:07:49 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-08-29 22:11:35 -0700
commita2711d69686a6c7f2cabe174cfefeefc718ce335 (patch)
tree9e6a8d21b508ec4fa1aad2243202558e572a3a7b /src/glsl/linker.cpp
parent4502b17901ad491e0598ee59a12d372c008ae03b (diff)
linker: Treat sized and unsized array types as the same
If two shaders contain variables declared with array types that have the same base type but one is sized and the other is not, linking should succeed. I'm not super pleased with the way this is implemented, and I am more convinced than ever that we need more linker tests. We especially need "negative" tests. Fixes bugzilla #29697 and piglit test glsl-link-array-01.
Diffstat (limited to 'src/glsl/linker.cpp')
-rw-r--r--src/glsl/linker.cpp26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 3de069b531..56e0bfd238 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -343,12 +343,26 @@ cross_validate_globals(struct gl_shader_program *prog,
ir_variable *const existing = variables.get_variable(var->name);
if (existing != NULL) {
if (var->type != existing->type) {
- linker_error_printf(prog, "%s `%s' declared as type "
- "`%s' and type `%s'\n",
- mode_string(var),
- var->name, var->type->name,
- existing->type->name);
- return false;
+ /* Consider the types to be "the same" if both types are arrays
+ * of the same type and one of the arrays is implicitly sized.
+ * In addition, set the type of the linked variable to the
+ * explicitly sized array.
+ */
+ if (var->type->is_array()
+ && existing->type->is_array()
+ && (var->type->fields.array == existing->type->fields.array)
+ && ((var->type->length == 0)
+ || (existing->type->length == 0))) {
+ if (existing->type->length == 0)
+ existing->type = var->type;
+ } else {
+ linker_error_printf(prog, "%s `%s' declared as type "
+ "`%s' and type `%s'\n",
+ mode_string(var),
+ var->name, var->type->name,
+ existing->type->name);
+ return false;
+ }
}
/* FINISHME: Handle non-constant initializers.