diff options
author | Paul Berry <stereotype441@gmail.com> | 2011-08-12 10:20:34 -0700 |
---|---|---|
committer | Paul Berry <stereotype441@gmail.com> | 2011-08-16 11:00:46 -0700 |
commit | af501e2b29c7fb161671dc5b3395eee1d1b16d3f (patch) | |
tree | 87fc6636512204a4e359fd3a64d3fa88097cf482 /src | |
parent | 9e8f556b199a662c5525b9d03f52a067244fa602 (diff) | |
download | external_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')
-rw-r--r-- | 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) { |