Matt Turner <matts...@gmail.com> writes: > Cuts five instructions out of SynMark's Gl32VSInstancing benchmark. > --- > Could be made more general, but I don't see any cases we could optimize > in our existing shader collection. > > src/glsl/opt_algebraic.cpp | 35 +++++++++++++++++++++++++++++++++++ > 1 file changed, 35 insertions(+) > > diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp > index eb5544a..17bcdfc 100644 > --- a/src/glsl/opt_algebraic.cpp > +++ b/src/glsl/opt_algebraic.cpp > @@ -329,6 +329,41 @@ ir_algebraic_visitor::handle_expression(ir_expression > *ir) > if (op_const[1] && !op_const[0]) > reassociate_constant(ir, 1, op_const[1], op_expr[0]); > > + /* Recognize (v.x + v.y) + (v.z + v.w) as dot(v, 1.0) */ > + if (options->OptimizeForAOS) { > + if (op_expr[0] && op_expr[0]->operation == ir_binop_add && > + op_expr[1] && op_expr[1]->operation == ir_binop_add) { > + ir_swizzle *x = op_expr[0]->operands[0]->as_swizzle(); > + ir_swizzle *y = op_expr[0]->operands[1]->as_swizzle(); > + ir_swizzle *z = op_expr[1]->operands[0]->as_swizzle(); > + ir_swizzle *w = op_expr[1]->operands[1]->as_swizzle(); > + > + if (!x || x->mask.num_components != 1 || x->mask.has_duplicates > || > + !y || y->mask.num_components != 1 || y->mask.has_duplicates > || > + !z || z->mask.num_components != 1 || z->mask.has_duplicates > || > + !w || w->mask.num_components != 1 || w->mask.has_duplicates) > { > + break; > + }
I don't think you want to be early breaking out of this, because it means missing the other optimization cases if you got part way into this one, right? I'd probably move this thing out to a separate function to handle it more easily.
pgpbgUjHkdMSj.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev