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 <kenn...@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) {
> 

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to