On Tue, Mar 11, 2014 at 2:50 PM, Erik Faye-Lund <kusmab...@gmail.com> wrote: > On Mon, Mar 10, 2014 at 11:54 PM, Matt Turner <matts...@gmail.com> wrote: >> Cuts two instructions out of SynMark's Gl32VSInstancing benchmark. >> --- >> src/glsl/opt_algebraic.cpp | 8 ++++++++ >> 1 file changed, 8 insertions(+) >> >> diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp >> index 5c49a78..8494bd9 100644 >> --- a/src/glsl/opt_algebraic.cpp >> +++ b/src/glsl/opt_algebraic.cpp >> @@ -528,6 +528,14 @@ ir_algebraic_visitor::handle_expression(ir_expression >> *ir) >> if (is_vec_two(op_const[0])) >> return expr(ir_unop_exp2, ir->operands[1]); >> >> + if (is_vec_two(op_const[1])) { >> + ir_variable *x = new(ir) ir_variable(ir->operands[1]->type, "x", >> + ir_var_temporary); >> + base_ir->insert_before(x); >> + base_ir->insert_before(assign(x, ir->operands[0])); >> + return mul(x, x); >> + } >> + > > Is this safe? Since many GPUs implement pow(x, y) as exp2(log2(x) * > y), this will give different results for if y comes from a uniform vs > if it's a constant, no?
To be a bit more clear: I don't think this is valid for expressions writing to variables marked as invariant (or expressions taking part in the calculations that leads up to invariant variable writes). I can't find anything allowing variance like this in the invariance section of the GLSL 3.30 specifications. In particular, the list following "To guarantee invariance of a particular output variable across two programs, the following must also be true" doesn't seem to require the values to be passed from the same source, only that the same values are passed. And in this case, the value 2.0 is usually exactly representable no matter what path it took there. Perhaps I'm being a bit too pedantic here, though. _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev