linker: Handle varying arrays, matrices, and arrays of matrices
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 30 Aug 2010 22:37:44 +0000 (15:37 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 30 Aug 2010 23:02:51 +0000 (16:02 -0700)
Fixes piglit test case glsl-array-varying-01.

src/glsl/linker.cpp

index 56e0bfd2386e945cab5b4501a8c3cf4f732bf84f..e0823c3af420136213f420263f0e98742d0b27e0 100644 (file)
@@ -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);