summaryrefslogtreecommitdiff
path: root/src/glsl/linker.cpp
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-08-30 15:37:44 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-08-30 16:02:51 -0700
commitdf869d916308759fbacb227f60b1b6eda73131e2 (patch)
treecca706d785bc2e51bc54631853ea194431c614c7 /src/glsl/linker.cpp
parenta3c2bd416aa871166baacff50c89842e3b533d9b (diff)
linker: Handle varying arrays, matrices, and arrays of matrices
Fixes piglit test case glsl-array-varying-01.
Diffstat (limited to 'src/glsl/linker.cpp')
-rw-r--r--src/glsl/linker.cpp21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 56e0bfd238..e0823c3af4 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -1296,15 +1296,24 @@ assign_varying_locations(struct gl_shader_program *prog,
assert(input_var->location == -1);
- /* FINISHME: Location assignment will need some changes when arrays,
- * FINISHME: matrices, and structures are allowed as shader inputs /
- * FINISHME: outputs.
- */
output_var->location = output_index;
input_var->location = input_index;
- output_index++;
- input_index++;
+ /* FINISHME: Support for "varying" records in GLSL 1.50. */
+ assert(!output_var->type->is_record());
+
+ if (output_var->type->is_array()) {
+ const unsigned slots = output_var->type->length
+ * output_var->type->fields.array->matrix_columns;
+
+ output_index += slots;
+ input_index += slots;
+ } else {
+ const unsigned slots = output_var->type->matrix_columns;
+
+ output_index += slots;
+ input_index += slots;
+ }
}
demote_unread_shader_outputs(producer);