Module: Mesa
Branch: master
Commit: af501e2b29c7fb161671dc5b3395eee1d1b16d3f
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=af501e2b29c7fb161671dc5b3395eee1d1b16d3f

Author: Paul Berry <[email protected]>
Date:   Fri Aug 12 10:20:34 2011 -0700

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 <[email protected]>

---

 src/glsl/lower_instructions.cpp |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/src/glsl/lower_instructions.cpp b/src/glsl/lower_instructions.cpp
index 806f863..23aa19b 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);
 
       if (ir->operands[1]->type->base_type == GLSL_TYPE_INT) {

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to