Since demoted inputs become global variables, wouldn't it be more efficient to simply turn it into a straight assignment? Then the backend wouldn't have to initialize it to a constant (since it would be undefined).
On Fri, Sep 9, 2016 at 10:06 AM, Marek Olšák <mar...@gmail.com> wrote: > From: Marek Olšák <marek.ol...@amd.com> > > This fixes 8 fs-interpolateat* piglit crashes on radeonsi, because it can't > handle non-input operands in interpolateAt*. > --- > src/compiler/glsl/link_varyings.cpp | 5 +++++ > src/compiler/glsl/opt_algebraic.cpp | 10 ++++++++++ > 2 files changed, 15 insertions(+) > > diff --git a/src/compiler/glsl/link_varyings.cpp > b/src/compiler/glsl/link_varyings.cpp > index 1fad310..85ca044 100644 > --- a/src/compiler/glsl/link_varyings.cpp > +++ b/src/compiler/glsl/link_varyings.cpp > @@ -586,20 +586,25 @@ remove_unused_shader_inputs_and_outputs(bool > is_separate_shader_object, > > if (var == NULL || var->data.mode != int(mode)) > continue; > > /* A shader 'in' or 'out' variable is only really an input or output if > * its value is used by other shader stages. This will cause the > * variable to have a location assigned. > */ > if (var->data.is_unmatched_generic_inout && !var->data.is_xfb_only) { > assert(var->data.mode != ir_var_temporary); > + > + /* Assign zeros to demoted inputs to allow more optimizations. */ > + if (var->data.mode == ir_var_shader_in && !var->constant_value) > + var->constant_value = ir_constant::zero(var, var->type); > + > var->data.mode = ir_var_auto; > } > } > > /* Eliminate code that is now dead due to unused inputs/outputs being > * demoted. > */ > while (do_dead_code(sh->ir, false)) > ; > > diff --git a/src/compiler/glsl/opt_algebraic.cpp > b/src/compiler/glsl/opt_algebraic.cpp > index f5858c8..2829a78 100644 > --- a/src/compiler/glsl/opt_algebraic.cpp > +++ b/src/compiler/glsl/opt_algebraic.cpp > @@ -954,20 +954,30 @@ ir_algebraic_visitor::handle_expression(ir_expression > *ir) > } > break; > > case ir_triop_csel: > if (is_vec_one(op_const[0])) > return ir->operands[1]; > if (is_vec_zero(op_const[0])) > return ir->operands[2]; > break; > > + /* Remove interpolateAt* instructions for demoted inputs. They are > + * assigned a constant expression to facilitate this. > + */ > + case ir_unop_interpolate_at_centroid: > + case ir_binop_interpolate_at_offset: > + case ir_binop_interpolate_at_sample: > + if (op_const[0]) > + return ir->operands[0]; > + break; > + > default: > break; > } > > return ir; > } > > void > ir_algebraic_visitor::handle_rvalue(ir_rvalue **rvalue) > { > -- > 2.7.4 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev