diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/glsl/glsl_symbol_table.cpp | 10 | ||||
-rw-r--r-- | src/compiler/glsl/glsl_symbol_table.h | 5 | ||||
-rw-r--r-- | src/compiler/glsl/linker.cpp | 27 |
3 files changed, 20 insertions, 22 deletions
diff --git a/src/compiler/glsl/glsl_symbol_table.cpp b/src/compiler/glsl/glsl_symbol_table.cpp index 6c682acf560..6d7baad4863 100644 --- a/src/compiler/glsl/glsl_symbol_table.cpp +++ b/src/compiler/glsl/glsl_symbol_table.cpp @@ -278,3 +278,13 @@ glsl_symbol_table::disable_variable(const char *name) entry->v = NULL; } } + +void +glsl_symbol_table::replace_variable(const char *name, + ir_variable *v) +{ + symbol_table_entry *entry = get_entry(name); + if (entry != NULL) { + entry->v = v; + } +} diff --git a/src/compiler/glsl/glsl_symbol_table.h b/src/compiler/glsl/glsl_symbol_table.h index 5d654e5e6a7..2f94d4c7ec8 100644 --- a/src/compiler/glsl/glsl_symbol_table.h +++ b/src/compiler/glsl/glsl_symbol_table.h @@ -100,6 +100,11 @@ struct glsl_symbol_table { */ void disable_variable(const char *name); + /** + * Replaces the variable in the entry by the new variable. + */ + void replace_variable(const char *name, ir_variable *v); + private: symbol_table_entry *get_entry(const char *name); diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index 9c724782e4d..0268b748a10 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -1093,21 +1093,11 @@ cross_validate_globals(struct gl_shader_program *prog, return; } } else { - /* If the first-seen instance of a particular uniform did not - * have an initializer but a later instance does, copy the - * initializer to the version stored in the symbol table. - */ - /* FINISHME: This is wrong. The constant_value field should - * FINISHME: not be modified! Imagine a case where a shader - * FINISHME: without an initializer is linked in two different - * FINISHME: programs with shaders that have differing - * FINISHME: initializers. Linking with the first will - * FINISHME: modify the shader, and linking with the second - * FINISHME: will fail. - */ - existing->constant_initializer = - var->constant_initializer->clone(ralloc_parent(existing), - NULL); + /* If the first-seen instance of a particular uniform did + * not have an initializer but a later instance does, + * replace the former with the later. + */ + variables.replace_variable(existing->name, var); } } @@ -1121,13 +1111,6 @@ cross_validate_globals(struct gl_shader_program *prog, var->name); return; } - - /* Some instance had an initializer, so keep track of that. In - * this location, all sorts of initializers (constant or - * otherwise) will propagate the existence to the variable - * stored in the symbol table. - */ - existing->data.has_initializer = true; } if (existing->data.invariant != var->data.invariant) { |