glsl: Don't convert reductions of ivec to a dot-product
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 25 Jun 2014 02:12:24 +0000 (19:12 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 25 Jun 2014 17:56:32 +0000 (10:56 -0700)
Mesa has an optimization that converts expressions like "v.x + v.y + v.z
+ v.w" into dot(v, 1.0).  And therein lies the rub: the other operand to
the dot-product is always a float... even if the vector is an ivec or
uvec.  This results in an assertion failure in ir_builder.

If the base type of the operand is not float, don't try the
optimization.  Dot-product is not valid on integer data.

Fixes piglit vs-integer-reduction.shader_test and OpenGL ES conformance
test ES2-CTS.gtf.GL2Tests.glGetUniform.glGetUniform.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Christoph Brill <egore911@gmail.com>
src/glsl/opt_algebraic.cpp

index 448af6b505b5edaafc366367216e712e858dd013..ac7514acfd9e8c4073152eaaf004ec333ecb5406 100644 (file)
@@ -124,7 +124,9 @@ static ir_expression *
 try_replace_with_dot(ir_expression *expr0, ir_expression *expr1, void *mem_ctx)
 {
    if (expr0 && expr0->operation == ir_binop_add &&
-       expr1 && expr1->operation == ir_binop_add) {
+       expr0->type->is_float() &&
+       expr1 && expr1->operation == ir_binop_add &&
+       expr1->type->is_float()) {
       ir_swizzle *x = expr0->operands[0]->as_swizzle();
       ir_swizzle *y = expr0->operands[1]->as_swizzle();
       ir_swizzle *z = expr1->operands[0]->as_swizzle();