[Mesa-dev] [PATCH] glsl: use var with initializer on global var validation
Kenneth Graunke
kenneth at whitecape.org
Wed May 11 00:11:56 UTC 2016
On Friday, May 6, 2016 10:55:36 AM PDT Juan A. Suarez Romero wrote:
> Currently, when cross validating global variables, all global variables
> seen in the shaders that are part of a program are saved in a table.
>
> When checking a variable this already exist in the table, we check both
> are initialized to the same value. If the already saved variable does
> not have an initializer, we copy it from the new variable.
>
> Unfortunately this is wrong, as we are modifying something it is
> constant. Also, if this modified variable is used in
> another program, it will keep the initializer, when it should have none.
>
> Instead of copying the initializer, this commit replaces the old
> variable with the new one. So if we see again the same variable with an
> initializer, we can compare if both are the same or not.
> ---
> src/compiler/glsl/glsl_symbol_table.cpp | 10 ++++++++++
> src/compiler/glsl/glsl_symbol_table.h | 5 +++++
> 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 6c682ac..6d7baad 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 5d654e5..2f94d4c 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 9c72478..4522734 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.
> + */
Please convert the tabs in the above lines to spaces.
Thanks for fixing this!
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> + 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) {
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160510/48e282ad/attachment.sig>
More information about the mesa-dev
mailing list