From: Eric Anholt Date: Tue, 28 Sep 2010 21:32:16 +0000 (-0700) Subject: glsl: Also update implicit sizes of varyings at link time. X-Git-Tag: android-x86-2.2~1063^2~554 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=586b4b500fed64fb724beb3753bc190cd1c676e0;p=android-x86%2Fexternal-mesa.git glsl: Also update implicit sizes of varyings at link time. 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. --- diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp index 53e18a06d1b..4bb4e2a9945 100644 --- a/src/glsl/linker.cpp +++ b/src/glsl/linker.cpp @@ -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) {