[Mesa-dev] [PATCH] glsl: Fix type error when lowering integer divisions
Ian Romanick
idr at freedesktop.org
Mon Aug 15 13:33:03 PDT 2011
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 08/12/2011 10:38 AM, Paul Berry wrote:
> 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 a plain int and y was an ivecN, the lowering pass
^^^ One "a" should suffice.
> 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}.
> ---
> 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) {
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/
iEYEARECAAYFAk5Jgn8ACgkQX1gOwKyEAw/L+QCgoPj3qiC4QYapE34OkSIoyTvQ
LzMAnA33vY8QGj6QZ/1H7voXWx9oL7u/
=a64F
-----END PGP SIGNATURE-----
More information about the mesa-dev
mailing list