glsl: use reproducible name for lowered const arrays
authorTimothy Arceri <timothy.arceri@collabora.com>
Thu, 14 Apr 2016 06:48:39 +0000 (16:48 +1000)
committerTimothy Arceri <timothy.arceri@collabora.com>
Tue, 27 Sep 2016 01:11:15 +0000 (11:11 +1000)
Otherwise we can end up with mismatching names between the cached
binary and the cached metadata.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/glsl/ir_optimization.h
src/compiler/glsl/linker.cpp
src/compiler/glsl/lower_const_arrays_to_uniforms.cpp

index 3bd6928a06c2eeeb3cc202c31ea231b7b71acde9..6f2bc321fa78079b3ccb3258f609b31c99054ee6 100644 (file)
@@ -126,7 +126,7 @@ bool lower_variable_index_to_cond_assign(gl_shader_stage stage,
     exec_list *instructions, bool lower_input, bool lower_output,
     bool lower_temp, bool lower_uniform);
 bool lower_quadop_vector(exec_list *instructions, bool dont_lower_swz);
-bool lower_const_arrays_to_uniforms(exec_list *instructions);
+bool lower_const_arrays_to_uniforms(exec_list *instructions, unsigned stage);
 bool lower_clip_cull_distance(struct gl_shader_program *prog,
                               gl_linked_shader *shader);
 void lower_output_reads(unsigned stage, exec_list *instructions);
index 929a653e13700320cf9a618b791da006fcaec4a2..8c28d249d8959186cc26804c9002f4cc524872d9 100644 (file)
@@ -4899,7 +4899,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
                                     ctx->Const.NativeIntegers))
         ;
 
-      lower_const_arrays_to_uniforms(prog->_LinkedShaders[i]->ir);
+      lower_const_arrays_to_uniforms(prog->_LinkedShaders[i]->ir, i);
       propagate_invariance(prog->_LinkedShaders[i]->ir);
    }
 
index 665a9ad1d486314302f0175116d47e0433c72ae3..73b9b542448c724dcef648797c674101fd2caf3b 100644 (file)
 namespace {
 class lower_const_array_visitor : public ir_rvalue_visitor {
 public:
-   lower_const_array_visitor(exec_list *insts)
+   lower_const_array_visitor(exec_list *insts, unsigned s)
    {
       instructions = insts;
+      stage = s;
+      const_count = 0;
       progress = false;
    }
 
@@ -62,6 +64,8 @@ public:
 
 private:
    exec_list *instructions;
+   unsigned stage;
+   unsigned const_count;
    bool progress;
 };
 
@@ -83,7 +87,16 @@ lower_const_array_visitor::handle_rvalue(ir_rvalue **rvalue)
 
    void *mem_ctx = ralloc_parent(con);
 
-   char *uniform_name = ralloc_asprintf(mem_ctx, "constarray__%p", con);
+   /* In the very unlikely event of 4294967295 constant arrays in a single
+    * shader, don't promote this to a uniform.
+    */
+   unsigned limit = ~0;
+   if (const_count == limit)
+      return;
+
+   char *uniform_name = ralloc_asprintf(mem_ctx, "constarray_%x_%u",
+                                        const_count, stage);
+   const_count++;
 
    ir_variable *uni =
       new(mem_ctx) ir_variable(con->type, uniform_name, ir_var_uniform);
@@ -104,8 +117,8 @@ lower_const_array_visitor::handle_rvalue(ir_rvalue **rvalue)
 } /* anonymous namespace */
 
 bool
-lower_const_arrays_to_uniforms(exec_list *instructions)
+lower_const_arrays_to_uniforms(exec_list *instructions, unsigned stage)
 {
-   lower_const_array_visitor v(instructions);
+   lower_const_array_visitor v(instructions, stage);
    return v.run();
 }