[Mesa-dev] [PATCH 1/2] glsl: Generate unique names for each const array lowered to uniforms

Kenneth Graunke kenneth at whitecape.org
Tue Nov 18 00:45:19 PST 2014


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 <chrisf at ijw.co.nz>
> Cc: "10.4" <mesa-stable at 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 <kenneth at 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;
-------------- 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: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141118/eb2ee4ae/attachment.sig>


More information about the mesa-dev mailing list