From f732b5a9990c363f8ced3ed4b07cef8d5ca7570f Mon Sep 17 00:00:00 2001 From: Paul Berry Date: Fri, 12 Aug 2011 10:20:34 -0700 Subject: [PATCH] glsl: Fix type error when lowering integer divisions This patch fixes a bug when lowering an integer division: x/y to a multiplication by a reciprocal: int(float(x)*reciprocal(float(y))) If x was a plain int and y was an ivecN, the lowering pass incorrectly assigned the type of the product to be float, when in fact it should be vecN. This caused mesa to abort with an IR validation error. Fixes piglit tests {fs,vs}-op-div-int-ivec{2,3,4}. Reviewed-by: Kenneth Graunke (cherry picked from commit af501e2b29c7fb161671dc5b3395eee1d1b16d3f) --- src/glsl/lower_instructions.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/glsl/lower_instructions.cpp b/src/glsl/lower_instructions.cpp index a5f61f213d0..ab2fc7c8cf3 100644 --- a/src/glsl/lower_instructions.cpp +++ b/src/glsl/lower_instructions.cpp @@ -166,6 +166,10 @@ lower_instructions_visitor::div_to_mul_rcp(ir_expression *ir) else op0 = new(ir) ir_expression(ir_unop_u2f, vec_type, ir->operands[0], NULL); + vec_type = glsl_type::get_instance(GLSL_TYPE_FLOAT, + ir->type->vector_elements, + ir->type->matrix_columns); + op0 = new(ir) ir_expression(ir_binop_mul, vec_type, op0, op1); ir->operation = ir_unop_f2i;