summaryrefslogtreecommitdiffstats
path: root/src/glsl/lower_instructions.cpp
diff options
context:
space:
mode:
authorPaul Berry <stereotype441@gmail.com>2011-08-12 10:20:34 -0700
committerPaul Berry <stereotype441@gmail.com>2011-08-16 11:00:46 -0700
commitaf501e2b29c7fb161671dc5b3395eee1d1b16d3f (patch)
tree87fc6636512204a4e359fd3a64d3fa88097cf482 /src/glsl/lower_instructions.cpp
parent9e8f556b199a662c5525b9d03f52a067244fa602 (diff)
downloadexternal_mesa3d-af501e2b29c7fb161671dc5b3395eee1d1b16d3f.zip
external_mesa3d-af501e2b29c7fb161671dc5b3395eee1d1b16d3f.tar.gz
external_mesa3d-af501e2b29c7fb161671dc5b3395eee1d1b16d3f.tar.bz2
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 <kenneth@whitecape.org>
Diffstat (limited to 'src/glsl/lower_instructions.cpp')
-rw-r--r--src/glsl/lower_instructions.cpp4
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) {