On Thursday, March 19, 2015 11:59:50 AM Tapani Pälli wrote: > Patch adds a counter around the lowering pass so that arrays > from different stages cannot end up having same name for uniform. > > Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89590 > Cc: 10.5 10.4 <mesa-sta...@lists.freedesktop.org> > --- > src/glsl/ir_optimization.h | 2 +- > src/glsl/linker.cpp | 5 +++-- > src/glsl/lower_const_arrays_to_uniforms.cpp | 13 +++++++------ > 3 files changed, 11 insertions(+), 9 deletions(-)
This seems a bit complicated - why not just pass in the shader stage, and use that in the variable name? Although I suppose you could have multiple FSes and run into the same problem... Just using %p with the variable would totally solve this problem, but it would make the debug output different on each invocation, which is unfortunate. > > diff --git a/src/glsl/ir_optimization.h b/src/glsl/ir_optimization.h > index e6939f3..261d2fb 100644 > --- a/src/glsl/ir_optimization.h > +++ b/src/glsl/ir_optimization.h > @@ -117,7 +117,7 @@ bool lower_noise(exec_list *instructions); > bool lower_variable_index_to_cond_assign(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 > *amount); > bool lower_clip_distance(gl_shader *shader); > void lower_output_reads(exec_list *instructions); > bool lower_packing_builtins(exec_list *instructions, int op_mask); > diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp > index 0c44677..a688baa 100644 > --- a/src/glsl/linker.cpp > +++ b/src/glsl/linker.cpp > @@ -2693,7 +2693,7 @@ link_shaders(struct gl_context *ctx, struct > gl_shader_program *prog) > * uniforms, and varyings. Later optimization could possibly make > * some of that unused. > */ > - for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { > + for (unsigned i = 0, arrays = 0; i < MESA_SHADER_STAGES; i++) { > if (prog->_LinkedShaders[i] == NULL) > continue; > > @@ -2710,7 +2710,8 @@ 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, > + &arrays); > } > > /* Check and validate stream emissions in geometry shaders */ > diff --git a/src/glsl/lower_const_arrays_to_uniforms.cpp > b/src/glsl/lower_const_arrays_to_uniforms.cpp > index 2243f47..49c1f31 100644 > --- a/src/glsl/lower_const_arrays_to_uniforms.cpp > +++ b/src/glsl/lower_const_arrays_to_uniforms.cpp > @@ -45,11 +45,11 @@ > 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 *amount) > { > instructions = insts; > progress = false; > - index = 0; > + array_amount = amount; > } > > bool run() > @@ -63,7 +63,7 @@ public: > private: > exec_list *instructions; > bool progress; > - unsigned index; > + unsigned *array_amount; > }; > > void > @@ -82,7 +82,8 @@ 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++); > + char *uniform_name = ralloc_asprintf(mem_ctx, "constarray__%d", > + (*array_amount)++); > > ir_variable *uni = > new(mem_ctx) ir_variable(con->type, uniform_name, ir_var_uniform); > @@ -104,8 +105,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 *amount) > { > - lower_const_array_visitor v(instructions); > + lower_const_array_visitor v(instructions, amount); > return v.run(); > } >
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