glsl: Also update implicit sizes of varyings at link time.
authorEric Anholt <eric@anholt.net>
Tue, 28 Sep 2010 21:32:16 +0000 (14:32 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 28 Sep 2010 21:37:26 +0000 (14:37 -0700)
Otherwise, we'll often end up with gl_TexCoord being 0 length, for
example.  With ir_to_mesa, things ended up working out anyway, as long
as multiple implicitly-sized arrays weren't involved.

src/glsl/linker.cpp

index 53e18a06d1b3e533b232c2a26ff29a6eeaf3ea9f..4bb4e2a9945b101a9ae2107710b600aaab675c27 100644 (file)
@@ -857,13 +857,15 @@ struct uniform_node {
 
  */
 static void
-update_uniform_array_sizes(struct gl_shader_program *prog)
+update_array_sizes(struct gl_shader_program *prog)
 {
    for (unsigned i = 0; i < prog->_NumLinkedShaders; i++) {
       foreach_list(node, prog->_LinkedShaders[i]->ir) {
         ir_variable *const var = ((ir_instruction *) node)->as_variable();
 
-        if ((var == NULL) || (var->mode != ir_var_uniform) ||
+        if ((var == NULL) || (var->mode != ir_var_uniform &&
+                              var->mode != ir_var_in &&
+                              var->mode != ir_var_out) ||
             !var->type->is_array())
            continue;
 
@@ -880,6 +882,7 @@ update_uniform_array_sizes(struct gl_shader_program *prog)
               }
            }
         }
+
         if (size + 1 != var->type->fields.array->length) {
            var->type = glsl_type::get_array_instance(var->type->fields.array,
                                                      size + 1);
@@ -979,8 +982,6 @@ assign_uniform_locations(struct gl_shader_program *prog)
                                    hash_table_string_compare);
    void *mem_ctx = talloc_new(NULL);
 
-   update_uniform_array_sizes(prog);
-
    for (unsigned i = 0; i < prog->_NumLinkedShaders; i++) {
       unsigned next_position = 0;
 
@@ -1475,6 +1476,8 @@ link_shaders(GLcontext *ctx, struct gl_shader_program *prog)
         ;
    }
 
+   update_array_sizes(prog);
+
    assign_uniform_locations(prog);
 
    if (prog->_NumLinkedShaders && prog->_LinkedShaders[0]->Type == GL_VERTEX_SHADER) {