On Tuesday, November 18, 2014 09:15:05 PM Chris Forbes wrote:
> Uniform names (even for hidden uniforms) are required to be unique; some
> parts of the compiler assume they can be looked up by name.
> 
> Fixes the piglit test: tests/spec/glsl-1.20/linker/array-initializers-1
> 
> Signed-off-by: Chris Forbes <chr...@ijw.co.nz>
> Cc: "10.4" <mesa-sta...@lists.freedesktop.org>
> ---
>  src/glsl/lower_const_arrays_to_uniforms.cpp | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/src/glsl/lower_const_arrays_to_uniforms.cpp 
> b/src/glsl/lower_const_arrays_to_uniforms.cpp
> index b3c0ee2..700e903 100644
> --- a/src/glsl/lower_const_arrays_to_uniforms.cpp
> +++ b/src/glsl/lower_const_arrays_to_uniforms.cpp
> @@ -49,6 +49,7 @@ public:
>     {
>        instructions = insts;
>        progress = false;
> +      index = 0;
>     }
>  
>     bool run()
> @@ -62,6 +63,7 @@ public:
>  private:
>     exec_list *instructions;
>     bool progress;
> +   unsigned index;
>  };
>  
>  void
> @@ -76,8 +78,10 @@ lower_const_array_visitor::handle_rvalue(ir_rvalue 
> **rvalue)
>  
>     void *mem_ctx = ralloc_parent(con);
>  
> +   char *uniform_name = ralloc_asprintf(mem_ctx, "constarray__%d", index++);

Yeah, I think this should work...we don't need locking on the counter because
it's not global...and we don't need to worry about getting the same name
twice because we only run the pass once (and I don't see a need to ever run it
more than once).

I had thought about doing this instead:

char *uniform_name = ralloc_asprintf(mem_ctx, "constarray@%p", con);

which conveniently avoids the need for a counter.  The only bad thing is it
makes shader debug output different each invocation of the program, which
makes diffing output hard.  So, what you have is probably better.

Reviewed-by: Kenneth Graunke <kenn...@whitecape.org>

> +
>     ir_variable *uni =
> -      new(mem_ctx) ir_variable(con->type, "constarray", ir_var_uniform);
> +      new(mem_ctx) ir_variable(con->type, uniform_name, ir_var_uniform);
>     uni->constant_initializer = con;
>     uni->constant_value = con;
>     uni->data.has_initializer = true;

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

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

Reply via email to