summaryrefslogtreecommitdiff
path: root/src/glsl/linker.cpp
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-09-28 14:32:16 -0700
committerEric Anholt <eric@anholt.net>2010-09-28 14:37:26 -0700
commit586b4b500fed64fb724beb3753bc190cd1c676e0 (patch)
tree750ec54cf8327b6d433f47aac83d31fc3c83aeda /src/glsl/linker.cpp
parentb9a59f0358f6f6afc7fafc1b417fa1b2c4cdaf37 (diff)
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.
Diffstat (limited to 'src/glsl/linker.cpp')
-rw-r--r--src/glsl/linker.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 53e18a06d1..4bb4e2a994 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) {